OC-UICWebViewのJSとOCの相互作用、Cookieの管理

7146 ワード

完全抄録:iOSのUICbViewとWKWebView、JavaScriptとOCがインタラクティブで、Cookie管理は私が十分に深入りします.JavaScript Core JavaScript Coreの枠組みを詳しく解説します.
UICWebView OCはJSを呼び出します.
1、strigByEveraluting JavaScript FroomString
/*  
1、            ,    nil,js       nil
2、    NSString,            
*/
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;

self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
  • JavaScripptCore(iOS 7.0+)
  • - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        //    ,          
        //self.navigationItem.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];
    
        //   UIWebView javascript   
        JSContext *jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
        //            。
        JSValue *value = [self.jsContext evaluateScript:@"document.title"];
        //    
        self.navigationItem.title = value.toString;
    }
    
    //    ,      
    [self.jsContext setExceptionHandler:^(JSContext *context, JSValue *exception){
            NSLog(@"%@", exception);
    }];
    //    
    JSValue *value = [self.jsContext evaluateScript:@"document.titlexxxx"];
    
    UICWebView JSはOCを呼び出します.
  • Custom URL Scheme
  • - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
    {
        //   URL  scheme、host、port、path、query、fragment 
        NSURL *URL = request.URL;    
        if ([URL.scheme isEqualToString:@"darkangel"]) {
            if ([URL.host isEqualToString:@"smsLogin"]) {
                NSLog(@"       ,    %@", URL.query);
                return NO;// NO(      )
            }
        }
        return YES;
    }
    
    利点:泛用性が強く、h 5に協力してページの動的化が可能です.例えば、画面の一つの活動が活動詳細ページにリンクされています.nativeがまだ開発されていない場合、リンクはh 5リンクとなります.nativeが開発されるまで、この方法でnativeページにジャンプして、ページの動的化が可能です.また、この方式はAndroidとiOSに適用され、汎用性が高いです.
    短所:今回のインタラクションの戻り値を直接取得することができません.一方通行の方が適しています.また、逆転に関心がない場合、例えばh 5ページがnativeページにジャンプするなどです.
  • JavaScripptCore(iOS 7.0+)
  • OC現実JSの方法JSコード
    function share(title, imgUrl, link) {
         //    OC  
    }
    
    OCコード
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        // js function   OC   
        [self convertJSFunctionsToOCMethods];
    }
    
    - (void)convertJSFunctionsToOCMethods
    {
        //   UIWebview javascript   
        //self  jsContext
        self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
        //js  oc
        //  share  js     ,     block    oc  
        //                 ,js       
        // ja "share",    ,    。
        self.jsContext[@"share"] = ^() {
            NSArray *args = [JSContext currentArguments];//   share      
            //args     JSValue,    OC   
            NSMutableArray *messages = [NSMutableArray array];
            for (JSValue *obj in args) {
                [messages addObject:[obj toObject]];
            }
            NSLog(@"    js     :
    %@", messages); }; }
    一つは二つのパラメータがあります.一つは戻り値のjs方法JSです.
    //         ,  ,     
    function testAddMethod(a, b) {
         //  OC  a+b,   
          return a + b;
    }
    
    console.log(testAddMethod(1, 5));    //output  6
    
    OCはこの方法を直接置換する.
    self.jsContext[@"testAddMethod"] = ^NSInteger(NSInteger a, NSInteger b) {
          return a + b;
    };
    
    JS呼び出し
    console.log(testAddMethod(1, 5));    //output  6,     a + b
    
    OCはこの方法を2つの数の相乗に置き換える.
    self.jsContext[@"testAddMethod"] = ^NSInteger(NSInteger a, NSInteger b) {
          return a * b;
    };
    
    JS呼び出し
    console.log(testAddMethod(1, 5));    //output  5,       a * b。
    
    OC呼び出し方法を元に実施し、元の結果に10を掛けた.
    //         ,      10
    JSValue *value = self.jsContext[@"testAddMethod"];
    self.jsContext[@"testAddMethod"] = ^NSInteger(NSInteger a, NSInteger b) {
        JSValue *resultValue = [value callWithArguments:[JSContext currentArguments]];
        return resultValue.toInt32 * 10;
    };
    
    JS呼び出し
    console.log(testAddMethod(1, 5));    //output  60,      (a + b) * 10
    
    回調:例えば、h 5に共有ボタンがあります.ユーザーがクリックした後、native共有(WeChat共有、微博共有など)を呼び出して、nativeで成功または失敗を分かち合う時、h 5ページを回して、その共有結果を教えます.h 5ページは対応するUIを更新して、共有成功または失敗したJSコードを表示します.
    //  
    function share(shareData) {
        var title = shareData.title;
        var imgUrl = shareData.imgUrl;
        var link = shareData.link;
        var result = shareData.result;
          //do something
        //        
        setTimeout(function(){
              //2s  ,  true    
           result(true);
        }, 2000);
    }
    
    //          
    share({
          title: "title", 
         imgUrl: "http://img.dd.com/xxx.png", 
         link: location.href, 
         result: function(res) {    //      
             console.log(res ? "success" : "failure");
        }
    });
    
    OCコード
    //    
    self.jsContext[@"share"] = ^(JSValue *shareData) {    //       ,          NSDictionary  ,   ?
        //   ,         NSDictionary,  result       block    NSDictionary  
          NSLog(@"%@", [shareData toObject]);     
        //  shareData   result  ,  JSValue        javascript function。
        JSValue *resultFunction = [shareData valueForProperty:@"result"];
        //  block, js function   OC block
        void (^result)(BOOL) = ^(BOOL isSuccess) {
            [resultFunction callWithArguments:@[@(isSuccess)]];
        };
        //      
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            NSLog(@"      ");
            result(YES);
        });
    };
    
    UICWebViewのCookie管理
    UICWebViewのCookie管理は簡単で、普通は私達が手動でCookieを操作する必要はありません.すべてのCookieは「NSHTTPCookie Storrage sharedHTTPCookie Storrage」によって管理されます.この単独の例は管理して、しかもUICWebViewは自動的にCookie StorrageのCookieを同期させますので、Native端にいる限り、正常にログインして終了します.h 5は適切な時に更新すれば、登録状態を正確に維持できます.余分な操作は必要ありません.
    いくつかの場合がありますが、私たちはあるリンクにアクセスする際に、固定のCookieを追加して区分をする必要があります.それならheaderを通じて実現できます.
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]];
    [request addValue:@"customCookieName=1314521;" forHTTPHeaderField:@"Set-Cookie"];
    [self.webView loadRequest:request];
    
    NSHT TPCookie Strageをアクティブに操作することもできます.カスタムCookieを追加します.
    NSHTTPCookie *cookie = [NSHTTPCookie cookieWithProperties:@{
        NSHTTPCookieName: @"customCookieName", 
        NSHTTPCookieValue: @"1314521", 
        NSHTTPCookieDomain: @".baidu.com",
        NSHTTPCookiePath: @"/"
    }];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];    //Cookie     ,     
    
    いくつかの一般的な方法があります.例えば、すべてのCookieを読んでHTTPHeader Fieldsに変換し、requestのheaderに追加します.
    NSArray *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage].cookies;
    //Cookies     requestHeaderFields
    NSDictionary *requestHeaderFields = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
    //     
    request.allHTTPHeaderFields = requestHeaderFields;