iOSのCookieアクセスは絶対に十分です!!

6042 ワード

現在、一部の会社では、appを迅速に出すために、UINAvigationControl+WebViewまたはNavigationControl+UITabbarVC+WebViewの方法を採用することが多い.これにより、クッキーを使用してHtml 5とインタラクティブになることが避けられない.以下、いくつかの一般的なシナリオでのクッキーの追加方法について説明する.
一.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];
}
  • 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に保存してクッキー
  • を追加する.
        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;
    
  • 2.urlをロードするときにクッキー
  • を追加
    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);
        }];