iOSとH 5ページのインタラクション(WKWebviewとUIWebviewクッキー設定)

5145 ワード

iOSとH 5ページのインタラクション(WKWebviewとUIWebviewクッキー設定)
クッキー関連ピットについて主な記録
1. UIWebview
1.UIWebviewは比較的簡単にNSHTTPCookieStorageでcookieを設定すれば実現できる.
コードセクション
```
  NSURL *cookieHost = [NSURL URLWithString:self.domain];
//    cookie
NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
                        [NSDictionary dictionaryWithObjectsAndKeys:
                         [cookieHost host], NSHTTPCookieDomain,
                         [cookieHost path], NSHTTPCookiePath,
                         self.cookieKey,  NSHTTPCookieName,
                         self.cookieValue, NSHTTPCookieValue,
                         nil]];
//   cookie
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
```

2.最初のリクエスト時にHTTPRequestでsetValueForKeyでHeaderValueを設定する必要がある場合
2. WKWebview
WKWebviewを使用する場合も、2つの状況に分けて伝える必要があります.
  • 1.HTTPRequestがURLを要求するときにバックエンドPHPのようにクッキー
  • を取得する.
  • 2.注入jsの目的は、フロントエンドがページからクッキーを取得するdocumentを通過できるようにすることである.クッキー設定はWKWebview初期化時にjsを`WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: cookieValue injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
  • に渡す
  • 3.NSHTTPCookieStorageは携帯していないようですが大丈夫です.私たちは現在この伝達cookie
  • を通過していないからです.
    ネット上で他の人を参考にする方法は以下のいくつかのステップを実現することですが、私たちのプロジェクトはこの3つの必要な方法に従っていませんが、参考にすることができます.
    WKWebviewの3つの処理ステップ:(1)iOS 11,WKHTTPCookieStore直接伝達.(iOS 11のみサポートされている場合は、次の2ステップは行わない);(2)iOS 8-iOS 10,js注入;(3)PHP携帯cookie方式
    関連コード
    #pragma mark - WKWebview
    // iOS11
    - (void)setWkCookie:(WKWebView *)wkWebview completionHandler:(nullable void (^)(void))comple {
        
        NSURL *cookieHost = [NSURL URLWithString:self.domain];
        //    cookie
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
                                [NSDictionary dictionaryWithObjectsAndKeys:
                                 [cookieHost host], NSHTTPCookieDomain,
                                 [cookieHost path], NSHTTPCookiePath,
                                 self.cookieKey,  NSHTTPCookieName,
                                 self.cookieValue, NSHTTPCookieValue,
                                 //                             [NSDate dateWithTimeIntervalSinceNow:30*60*60],NSHTTPCookieExpires,
                                 nil]];
        
        //   cookie
        //       cookie;
        if (@available(iOS 11.0, *)) {
            WKHTTPCookieStore *cookieStore = wkWebview.configuration.websiteDataStore.httpCookieStore;
            [cookieStore setCookie:cookie completionHandler:^{
                
                comple?comple():nil;
            }];
        } else {
            
            
        }
    
    }
    
    // JS  cookie   
    - (void)setWkJsCookie:(WKUserContentController *)userContentController {
        //   cookie,    ,   document.cookie ='%@=%@';  
        NSString *cookieStr = [NSString stringWithFormat:@"document.cookie ='%@=%@';",self.cookieKey,self.cookieValue];
        WKUserScript * cookieScript = [[WKUserScript alloc] initWithSource: cookieStr injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
        [userContentController addUserScript:cookieScript];
    }
    
    // PHP  cookie   
    - (void)setWkPHPCookie:(NSMutableURLRequest *)request {
        //  host  cookie。
        NSMutableDictionary *cookieDic = [NSMutableDictionary dictionary];
        NSMutableString *cookieValue = [NSMutableString stringWithFormat:@""];
        NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
        for (NSHTTPCookie *cookie in [cookieStorage cookies]) {
            [cookieDic setObject:cookie.value forKey:cookie.name];
        }
        if ([cookieDic objectForKey:[CookieManager shareInstance].cookieKey]) {
            [cookieDic removeObjectForKey:[CookieManager shareInstance].cookieKey];
        }
        
        // cookie  ,         ,     
        for (NSString *key in cookieDic) {
            NSString *appendString = [NSString stringWithFormat:@"%@=%@;", key, [cookieDic valueForKey:key]];
            [cookieValue appendString:appendString];
        }
        
        [cookieValue appendString:[NSString stringWithFormat:@"%@ = %@;",self.cookieKey,self.cookieValue]];
        [request addValue:cookieValue forHTTPHeaderField:@"Cookie"];
    }
    
    
    #pragma mark - Webview
    //      cookie
    - (void)setWebCookie {
        
        NSURL *cookieHost = [NSURL URLWithString:self.domain];
        //    cookie
        NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:
                                [NSDictionary dictionaryWithObjectsAndKeys:
                                 [cookieHost host], NSHTTPCookieDomain,
                                 [cookieHost path], NSHTTPCookiePath,
                                 self.cookieKey,  NSHTTPCookieName,
                                 self.cookieValue, NSHTTPCookieValue,
                                 nil]];
        //   cookie
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
    }
    

    2.WKWebviewにドメイン間問題がある
    *最後に、上記の方法はドメイン間問題を考慮すればUIWebViewは現れませんが、WKWebviewはドメイン間は許されません.これもアップルが安全性の面を考慮していますが、処理可能です.現在、私たちの案は以下の2つです.
    1.先端はクッキーを取得する後にクッキーを植え直し、通過する.xxx.comファジイ栽培
    2.バックエンドに処理させ、uidのようなユーザ関連情報をフロントエンドに伝達することができる.