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コード:
swiftコード:(ここではJAndSwitMiddle.swiftを作成し、インタラクティブな問題を専門に処理しています)
WebViewDidFinishLoadにモデルを注入する
実現方法:func JSCallSwitSystem()
しかし、これは簡単な方法であり、依然として多くの欠陥がある.
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()
しかし、これは簡単な方法であり、依然として多くの欠陥がある.