;
<a href='java script:needQuit();'>Quit</a><p>
<script>
function testCallSwift(){
//注意调用方式,window是js的对象
//swiftHost是swift的接口
//其后则是声明的swift函数
window.swiftHost.callFromJS1("hello swift");
}
function needQuit(){
window.swiftHost.quit();
}
</script>
5.截获webview每一次访问
跟上面类似,要再增加一个代理:
//初始化的时候增加:
webView!.policyDelegate=self;
并且声明类的时候多一个继承:WebPolicyDelegate
。随后代码中可以实现一个接口:
func webView(_ webView: WebView!,
decidePolicyForNavigationAction actionInformation: [AnyHashable : Any]!,
request: URLRequest!,
frame: WebFrame!,
decisionListener listener: WebPolicyDecisionListener!) {
NSLog("nav to %@",request.url!.absoluteString) //这里是将要转向的网址
listener.use() //允许访问这个网址
//listener.ignore() //不允许访问这个网址则调用这个
}
也有些程序中为了简化从js调用swift的工作量,会用链接的方式,在链接地址中传入一些指令,就可以用这个函数截获网址并且处理,被处理的网址通常使用listener.ignore()来禁止本次浏览器转向,免得影响当前页面。
6.响应js中的警告窗
通常的webview都是不允许js中的alert警告窗的,一方面是为了应用程序整体的效果;另一方面,webview作为一个空间,自己没有UI的控制权,所以类似的工作,是要有应用程序自己实现警告框窗口的。实现警告窗依然要给类增加一个集成WebUIDelegate
,并在初始化中增加:
webView!.uiDelegate=self;
//随后可以实现一个接口:
func webView(_ sender: WebView!,
runjava scriptAlertPanelWithMessage message: String!,
initiatedBy frame: WebFrame!){
NSLog("msg of alert: %@",message)
}
如果不满足于只是得到警告消息,要自己在这个函数中使用cocoa的警告窗来显示相关的信息。
7.其它
还可以实现从js中访问swift中的变量功能。使用isKeyExcludedFromWebScript
和webScriptNameForKey
函数,我用得少,如果需要,参考上面定义函数的方法,查一查官方文档自己来试试吧。
参考资料:
Swift & java script integration