NYS*_*NYS 10 wkwebview swift3 xcode8
我需要将我的代码更新为swift 3.下面的代码是完美的原始解决方案,但是在XCode 8 beta和iOS 10中使用swift 3时,'userContentController'委托在我使用原始的html + js代码时没有调用打电话给本机.
class ViewController: UIViewController, WKUIDelegate, WKScriptMessageHandler, WKNavigationDelegate,UIWebViewDelegate,CLLocationManagerDelegate,URLSessionDataDelegate,UIImagePickerControllerDelegate, UINavigationControllerDelegate {
....
func initWebView(){
// JAVASCRIPT PART
let contentController = WKUserContentController();
let jScript:String = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
let wkUScript:WKUserScript = WKUserScript(source: jScript, injectionTime: WKUserScriptInjectionTime.atDocumentEnd, forMainFrameOnly: true);
contentController.addUserScript(wkUScript)
contentController.add(
self,
name: "refreshWebPage"
)
contentController.add(
self,
name: "forceStepBack"
)
contentController.add(
self,
name: "setPageTitle"
)
contentController.add(
self,
name: "allowBackNavigate"
)
contentController.add(
self,
name: "changeBackNavigationURL"
)
contentController.add(
self,
name: "changeLeftButtonIconVisibility"
)
contentController.add(
self,
name: "changeRightButtonIconVisibility"
)
contentController.add(
self,
name: "clearWebCache"
)
contentController.add(
self,
name: "changeMobileAndPassword"
)
let config = WKWebViewConfiguration()
config.userContentController = contentController
self.webView = WKWebView(frame: CGRect.zero, configuration: config)
self.view.translatesAutoresizingMaskIntoConstraints = false
self.webView!.navigationDelegate = self
self.webView!.uiDelegate = self;
self.webView!.scrollView.bounces = false;
view = webView
webView?.loadHTMLString(self.baseURL!, baseURL: nil)
}
...
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
print("JavaScript is sending a message: \(message.body)")
print("JavaScript is sending a message.name: \(message.name)")
}
Run Code Online (Sandbox Code Playgroud)
经过调试很多时间和条件,我发现:
postMessage()JS中的函数必须具有一个参数,该参数永远不能为null该参数必须是
JSON类型例如 :
webkit.messageHandlers.refreshWebPage.postMessage("status":"ok");
如果您已遵循上述三个建议,并设置了正确的代表。委托函数didReceiveScriptMessage将被调用。希望这对您有所帮助。
你找到解决方法了吗?因为我也有问题,但幸运的是,我可以发送消息,并且 userContentController 确实回调了,但消息只能是数字,没有字符串,没有字符。我不知道为什么...
编辑 我已经找到了关于这个的答案。看来你必须放入 try catch,在我这样做之后,它 100% 可以处理文本数字甚至 json
`<script>
function callNative(message) {
try {
webkit.messageHandlers.callbackHandler.postMessage(message)
} catch(err) {
console.log("Error")
}
}
</script>`
Run Code Online (Sandbox Code Playgroud)
并且不要忘记callbackHandler在 iOS 中必须是相同的单词才能使其工作,您不必命名回调处理程序,您可以将其命名为任何名称,但它在 Javascript 和 iOS 中必须相同
希望对您有帮助
| 归档时间: |
|
| 查看次数: |
9920 次 |
| 最近记录: |