iOSのCookieアクセスは絶対に十分です!!
6042 ワード
現在、一部の会社では、appを迅速に出すために、UINAvigationControl+WebViewまたはNavigationControl+UITabbarVC+WebViewの方法を採用することが多い.これにより、クッキーを使用してHtml 5とインタラクティブになることが避けられない.以下、いくつかの一般的なシナリオでのクッキーの追加方法について説明する.
一.UIWebView: UIWebViewは使用時間が長く、cookieStorageに対応するcookieが設定されている限り、毎回自動的に持ち込まれます. しかし、このような弊害は、H 5とのインタラクションが増加するにつれて、Cookieが占有する空間がますます大きくなり、インタラクションのたびに大量のcookieが挟まれ、サーバ側の圧力を増加させるだけでなく、ユーザーのトラフィックを浪費することである.例えば、インタラクションのたびに5 kbのクッキーコンテンツが挟まれますが、本当に使われているのは2,300バイトだけです.
二.WKWebView WKWebView: の速度は2倍に速くなったが、メモリは元の半分に減少した. クッキーは自動携帯ではなく、手動で設定する必要があります. インタラクションはもっとスムーズで、例えばappの底の4つのtabBarもすべてホームページのもので、UIWebViewの下でクリックすると、H 5ページ全体が白くなりますが、WKWebViewの下でクリックすると、4つのtabBarの効果は原生のappの効果ともっと似ていて、白くなる現象はありません. は、いくつかのエージェントメソッドを増減し、プロトコルブロックおよび進捗バーの表示 をより容易に行う.
1.作成時にWKUSerScriptに保存してクッキー を追加する. 2.urlをロードするときにクッキー を追加
WKWebViewがurlをロードするときにクッキーを追加する必要がある場合は、現在のNSHTTPCookieStorageのすべてのクッキーを手動で取得し、NSMutableURLRequestリクエストヘッダにクッキーを配置する必要があります.
3.AFNetworking
AFNetworkingアクセスクッキーはよくあるので、あまり話さないで、コードの中にあります.
一.UIWebView:
// cookie
+ (void)saveCookies {
// cookie
NSMutableDictionary *fromappDict = [NSMutableDictionary dictionary];
[fromappDict setObject:@"fromapp" forKey:NSHTTPCookieName];
[fromappDict setObject:@"ios" forKey:NSHTTPCookieValue];
// kDomain app
[fromappDict setObject:kDomain forKey:NSHTTPCookieDomain];
[fromappDict setObject:kDomain forKey:NSHTTPCookieOriginURL];
[fromappDict setObject:@"/" forKey:NSHTTPCookiePath];
[fromappDict setObject:@"0" forKey:NSHTTPCookieVersion];
// cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:fromappDict];
// cookieStorage
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]
// cookie
[cookieStorage setCookie:cookie];
}
二.WKWebView
WKWebViewConfiguration *webConfig = [[WKWebViewConfiguration alloc] init];
//
webConfig.preferences = [[WKPreferences alloc] init];
// 0
webConfig.preferences.minimumFontSize = 10;
// YES
webConfig.preferences.javaScriptEnabled = YES;
// iOS NO,
webConfig.preferences.javaScriptCanOpenWindowsAutomatically = NO;
// web
webConfig.processPool = [[WKProcessPool alloc] init];
// cookie document.cookie = 'key=value';
#warning , ( )
NSString *cookieValue = @"document.cookie = 'fromapp=ios';document.cookie = 'channel=appstore';";
// cookie h5 , ios
WKUserContentController* userContentController = WKUserContentController.new;
WKUserScript * cookieScript = [[WKUserScript alloc]
initWithSource: cookieValue
injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
[userContentController addUserScript:cookieScript];
webConfig.userContentController = userContentController;
WKWebView *wkWebView = [[WKWebView alloc] initWithFrame:frame configuration:webConfig];
wkWebView.UIDelegate = wkWebView;
wkWebView.navigationDelegate = wkWebView;
WKWebViewがurlをロードするときにクッキーを追加する必要がある場合は、現在のNSHTTPCookieStorageのすべてのクッキーを手動で取得し、NSMutableURLRequestリクエストヘッダにクッキーを配置する必要があります.
- (void)loadRequestWithUrlString:(NSString *)urlString {
// cookie
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
}
// cookie , ,
for (NSString *key in cookieDic) {
NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
[cookieValue appendString:appendString];
}
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[request addValue:cookieValue forHTTPHeaderField:@"Cookie"];
[self loadRequest:request];
}
3.AFNetworking
AFNetworkingアクセスクッキーはよくあるので、あまり話さないで、コードの中にあります.
// AFHTTPRequestOperationManager
AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
// Cookie
NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
// cookie
#warning Cookie , 6 value , ,
#warning , cookie ,H5 , ( 。。), , ( , )
NSMutableString *cookieValue = [NSMutableString stringWithFormat:@"fromapp=ios;"];
//
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieJar cookies]) {
[cookieDic setObject:cookie.value forKey:cookie.name];
}
// cookie , ,
for (NSString *key in cookieDic) {
NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
[cookieValue appendString:appendString];
}
// cookie
[operationManager.requestSerializer setValue:cookieValue forHTTPHeaderField:@"Cookie"];
// url
NSString *urlStr = [NSString stringWithFormat:@"%@%@", kHostIP, kPath];
//
NSDictionary *paraDict = @{
@"key" : value
};
// ,
[operationManager POST:urlStr parameters:paraDict success:^(AFHTTPRequestOperation * _Nonnull operation, id _Nonnull responseObject) {
NSLog(@"responseObject-->%@", responseObject);
} failure:^(AFHTTPRequestOperation * _Nullable operation, NSError * _Nonnull error) {
NSLog(@"error-->%@", error);
}];