我在我的iOS应用程序中运行一个本地网络服务器,它为AngularJS应用程序提供服务,但我不知道如何在WKWebView和我的控制器之间进行通信.
在iOS中, viewDidLoad
WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init]; [wkWebConfig.userContentController addScriptMessageHandler:self name:@"interOp"]; self.webview = [[WKWebView alloc] initWithFrame:self.view.frame ]; [self.webview setBackgroundColor:self.view.backgroundColor]; [self.webview loadRequest:request];
从angularJS控制器,我需要获取wkwebview
对象,但未定义:
$scope.showSettings = function(){ //this is undefined window.webkit.messageHandlers.interOp.postMessage(message) }
如果我在head
我的网页标签中尝试它,它完全正常.
我究竟做错了什么 ?
你没有做错任何事情,一些邪恶的框架和库覆盖window.webkit
全局,我不确定是哪一个,但通过一些测试,我相信你可以找到.
要解决此问题,您需要在任何干扰脚本覆盖之前缓存全局.
这可以在位于文档头部的JavaScript中或通过注入在Objective-C中完成.
使用Javascript
...
繁荣,你的变量是安全和健全的 window.myUniqueNamespace.messageHandlers
Objective-C的
NSString *myScriptSource = @"(function() {window.myUniqueNamespace.messageHandlers=window.webkit.messageHandlers;}());"; WKUserScript *myUserScript = [[WKUserScript alloc] initWithSource:myScriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:YES];
*注意:我没有办法测试这个或有Objective-C的经验,但我在JavaFX的webkit webview上遇到了类似的问题.
这是关于WebKit API的有用演示文稿