ocとjsの原生は交互に働きます.

6254 ワード

参照
総評価:
ocとjsのインタラクション、1.元の方式があって、oc調jsは簡単で、js調ocは面倒です.
2.iOS 7の前に、アップルはJavaScript Coreを出さない前に、業界では一般的にオープンソースライブラリWebView JavascriptBridgeとEasyJSWEbViewを採用して解決しています.原理はすべてブロックプロトコルによるパッケージです.
3.iOS 7の後、アップルはJavaScriptに対して公式のライブラリJavaScript Coreを出しました.Objective-CはWebKitのJavaScriptエンジンをカプセル化しました.WebViewから離れてJSコードを実行できます.だからiOS 7の後でインタラクションを実現したいです.JavaScripptCoreを採用するのもいい選択です.OST 7は互換性が必要ないという前提です.(今はiOS 7との互換性を強調していないと思いますが)
4.iOS 8が発表された時、アップルはまたWKWebViewを発売しました.以前のUICWebViewに対して脱皮した再構築を行いました.機能もより完備していて、安定性と性能も明らかに向上しました.
一つは、方法の相互調整(まず、どのような相互変調があっても、双方の協力が必要であり、バックグラウンドとの相互作用に似ている).
1.1 oc呼出js方法
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
例:
if (sender.tag == 234) {
    [self.webView stringByEvaluatingJavaScriptFromString:@"alertSendMsg('18870707070','            ')"];
}
//     
直接ocはjsの関数コードを呼び出して、強いです!
対応するjs:

    
    
        
          
        
        
        
            
            //   OC  JS     

    function alertSendMsg(num,msg) {
                alert('       :' + num + ',' + msg + '!!')
            }
       
        
 


1.2 js ocを呼び出す方法(じゃ、お願いします.)
jsは面倒ではないです.リンクも入れます.

    
    
        
          
        
        
        
  
            //JS              
            function btnClick3() {
                location.href = "rrcc://showSendNumber_msg_?13300001111&go climbing this weekend"
            }

        
 
    

    
    
        



ps:「_」はOCメソッド名のコロンの置き換えとして使われます.
面倒なのは、oc側(つまり、jsから伝えられたurlを処理して、方法名とパラメータを分解し、OCでセレクタ方式を実行することで実現しますが、このような方式は最大でパラメータの個数が2つしか伝達できません.複数のパラメータが必要なら、データ構造の組織から入手できます.)
#pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSLog(@"%@",NSStringFromSelector(_cmd));
    
    //OC  JS                  
    NSString *absolutePath = request.URL.absoluteString;
    
    NSString *scheme = @"rrcc://";
    
    if ([absolutePath hasPrefix:scheme]) {
        NSString *subPath = [absolutePath substringFromIndex:scheme.length];
        
        if ([subPath containsString:@"?"]) {//1      
            
            if ([subPath containsString:@"&"]) {//    
                NSArray *components = [subPath componentsSeparatedByString:@"?"];
                
                NSString *methodName = [components firstObject];
                
                methodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"];
//      methodName   @"showSendNumber:msg:"(    OC     (selector)  ,   )
                SEL sel = NSSelectorFromString(methodName);

                NSString *parameter = [components lastObject];
                NSArray *params = [parameter componentsSeparatedByString:@"&"];
                
                if (params.count == 2) {
                    if ([self respondsToSelector:sel]) {
//OC     (selector)         
                        [self performSelector:sel withObject:[params firstObject] withObject:[params lastObject]];
                    }
                }
                

            } else {//1   
                NSArray *components = [subPath componentsSeparatedByString:@"?"];
                
                NSString *methodName = [components firstObject];
                methodName = [methodName stringByReplacingOccurrencesOfString:@"_" withString:@":"];
                SEL sel = NSSelectorFromString(methodName);

                NSString *parameter = [components lastObject];
                
                if ([self respondsToSelector:sel]) {
                    [self performSelector:sel withObject:parameter];
                }

            }
                
        } else {//    
            NSString *methodName = [subPath stringByReplacingOccurrencesOfString:@"_" withString:@":"];
            SEL sel = NSSelectorFromString(methodName);
            
            if ([self respondsToSelector:sel]) {
                [self performSelector:sel];
            }
        }
    }
    
    return YES;
}
二,内容上の相互作用
今まで知っていたように、ocはwebviewの内容を直接修正するのが便利ですが、jsは直接にocのインタフェースの内容を修正したいです.
2.1 oc修正webViewの内容
これらの操作は、このdelegateで行われているようです.
//                   
- (void)webViewDidFinishLoad:(UIWebView *)webView
{

}
2.1.1を取る
まず強調しなければならないのは、ウェブページが一つしかないような唯一のラベルがない限りです.

では、直接

を持ってきてもいいです.
<pre><code>NSString*title=[webView stingByEveraluating JavaScript FroomString:@「document.title」;
<pre><code>/取得URL
NSString*cur URL=[webView strigByEveraluating]@

がいくつも表示されていません.取れないです.
<h 1>2.1.2改
<pre><code>/属性値の変更
NSString*jsture sult=[webView streingByEveraluating JavaScript FroomString:@"document.getElements ByName('0)[0].カラー=red';;;;
<h 1>2.1.3削除
<pre><code>NSString*str=@「document.getElements ByClass Name('detail惼2')[0].remove()」;
[webView strigByEveraluting JavaScript FroomString:str]

2.1.4
「増」と「調査」が見つからないようです.
<hr/>

最後の
パッケージのライブラリもありますが、アップルで提供するのがオススメですよね.