最近做一个app,里面有一个功能是加载服务器返回的HTML5页面,但是页面中会调用JS方法执行IOS的原生代码。
网络搜了一下,不过大部分都是很老的代码了。事实上,实现起来也很简单。
首先我们要定义一个objc协议:
@objc protocol MyMethodProtocol: JSExport {
func showTownDetail(_ id:String, _ name:String)
}
然后创建一个类继承NSObject,实现我们定义的协议:
class MyMethod : NSObject, JavaScriptMethodProtocol {
private var vc:UIViewController? //用于实现与UIViewController相关的方法
private var url:String? //个人项目使用,可以通过判断URL的不同,同一个方法实现不一样的效果
init(url:String,viewController:UIViewController) {
self.vc = viewController
self.url = url
}
func showTownDetail(_ id: String, _ name: String) {
}
}
接着通过我们的UIWebView获取JSContext来关联JS的方法:
self.context = mWebView.value(forKeyPath: "documentView.webView.mainFrame.javaScriptContext") as! JSContext?
self.context!.setObject(JavaScriptMethod(url: url!,viewController: self), forKeyedSubscript: "hello" as (NSCopying & NSObjectProtocol)!)
如上所示,我们定义了"hello",这意味着我们在Web页面的JS中,通过调用hello.showTownDetail(xxx,xxx)来执行我们IOS中的方法。
这样就能简单在Web页面中调用IOS的原生功能了。
文章评论