iOSとJSが対話する問題

2500 ワード

最近はプロジェクトのニーズでhtml 5ページの一部が追加されているため、ローカルコードとH 5の間にはインタラクションの部分がたくさんあります.ネットで資料を調べてみると、主に2種類あります.
1,ブロックプロトコル,すなわち,各ボタンのクリック時にイベントをトリガーし,クリックしたurlを取得し,urlからメソッド名とパラメータを切り取り,メソッドを呼び出し,パラメータを渡す. - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{ NSString * urlStr = request.URL.absoluteString ; NSLog(@"url~~:%@",urlStr); return YES; }
Webページのロードが完了したら、js端子を呼び出し、ラベルの値を変更するなどの操作を行います.-(void)webViewDidFinishLoad:(UIWebView)webView { NSStringjs =@"document.getElementsByTagName('footer')[0].remove();"; [webView stringByEvaluatingJavaScriptFromString:js]; } 2 JavaScriptCoreライブラリをインポートし、モデルを注入します.h 5コード:
  
        function openSystemPhotoLib(){
            //      、    
            obj.callSystem();
        }
    function callBack(backContext){
        var context =document.getElementById("p1");
        context.innerText =backContext;
    }
          

swiftコード:(ここではJAndSwitMiddle.swiftを作成し、インタラクティブな問題を専門に処理しています)
import UIKit
import JavaScriptCore
/**
 *         
 */
@objc protocol JSAndSwiftModdleDelegate : NSObjectProtocol{
optional func JSCallSwiftSystem()
}

/**
   *          H5       
*/
@objc protocol JavaScriptSwiftDelegate :JSExport{

func callSystem()
}

@objc class JSAndSwiftMiddle: NSObject,JavaScriptSwiftDelegate {

weak var jsContext: JSContext?
weak var delegate:JSAndSwiftModdleDelegate!
var webView:UIWebView!{
    didSet{
        jsContext = webView.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") as? JSContext!
    }
}
func callSystem() {
    if delegate.respondsToSelector(#selector(JSAndSwiftModdleDelegate.JSCallSwiftSystem)){
        self.delegate.JSCallSwiftSystem!()
    }
}
}

WebViewDidFinishLoadにモデルを注入する
func webViewDidFinishLoad(webView: UIWebView) {
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) {
        //    model
        let model = JSAndSwiftMiddle()
        model.delegate = self
        model.webView = webView
        self.jscontext = model.jsContext
        self.jscontext?.setObject(model
            , forKeyedSubscript: "lbyc")
        self.jscontext?.exceptionHandler = { (context,exception) in
            print("exception @",exception)
        }
    }
}

実現方法:func JSCallSwitSystem()
しかし、これは簡単な方法であり、依然として多くの欠陥がある.