最近由于項(xiàng)目的需求墨辛,加入了部分html5的頁(yè)面,因此本地代碼和H5之間有很多交互的部分盏檐。在網(wǎng)上查閱資料發(fā)現(xiàn)主要有兩種:
1,攔截協(xié)議矢赁,即通過監(jiān)聽每個(gè)按鈕點(diǎn)擊時(shí)觸發(fā)事件糯笙,獲取點(diǎn)擊的 url,從 url 中截取方法名和參數(shù)撩银,然后調(diào)用方法给涕、傳遞參數(shù)、
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSString * urlStr = request.URL.absoluteString ;
NSLog(@"url~~:%@",urlStr);
return YES;
}
在網(wǎng)頁(yè)加載完畢時(shí)额获,調(diào)用 js 端够庙,修改標(biāo)簽傳值等操作。
- (void)webViewDidFinishLoad:(UIWebView)webView
{
NSStringjs =@"document.getElementsByTagName('footer')[0].remove();";
[webView stringByEvaluatingJavaScriptFromString:js];
}
2 導(dǎo)入JavaScriptCore庫(kù),注入模型抄邀。
h5代碼:
<script>
function openSystemPhotoLib(){
//調(diào)用系統(tǒng)方法耘眨、打開相冊(cè)
obj.callSystem();
}
function callBack(backContext){
var context =document.getElementById("p1");
context.innerText =backContext;
}
</script>
swift 代碼:(在這里創(chuàng)建了JSAndSwiftMiddle.swift,專門處理交互問題)
import UIKit
import JavaScriptCore
/**
* 對(duì)外開放的代理
*/
@objc protocol JSAndSwiftModdleDelegate : NSObjectProtocol{
optional func JSCallSwiftSystem()
}
/**
* 這里面放的都是供H5調(diào)用原生的方法
*/
@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)
}
}
}
實(shí)現(xiàn)方法: func JSCallSwiftSystem()
但是這是個(gè)簡(jiǎn)單的方法境肾,仍然有不少缺陷剔难。