gpt4 book ai didi

javascript - AngularJS 向 iOS WKWebView 发送消息

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:21:09 25 4
gpt4 key购买 nike

我在我的 iOS 应用程序中运行本地网络服务器,它为 AngularJS 应用程序提供服务,但我不知道如何在 WKWebView 和我的 Controller 之间进行通信。

在 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 Controller ,我需要获取 wkwebview 对象但未定义:

$scope.showSettings = function(){
//this is undefined
window.webkit.messageHandlers.interOp.postMessage(message)
}

如果我在我的网页的 head 标签中尝试它,它工作得很好。

<script>
window.webkit.messageHandlers.interOp.postMessage(message)
</script>

我做错了什么?

最佳答案

你没有做错什么,一些邪恶的框架和库覆盖了window.webkit全局,我不确定是哪一个,但通过一些测试我相信您能找到答案。

为了克服这个问题,您需要在任何干扰脚本覆盖它之前缓存全局。

这可以在位于文档头部的 JavaScript 中完成,也可以通过注入(inject)在 Objective-C 中完成。

Javascript

...<head>
<script>
(function () {
window.myUniqueNamespace.messageHandlers = window.webkit.messageHandlers;
}());
</script>

很高兴,您的变量在 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 的有用介绍

关于javascript - AngularJS 向 iOS WKWebView 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34414781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com