iOS 向 WKWebView 公开自定义 API
Posted
技术标签:
【中文标题】iOS 向 WKWebView 公开自定义 API【英文标题】:iOS Expose Custom API to WKWebView 【发布时间】:2020-01-16 13:25:25 【问题描述】:在 android 上,我使用 addjavascriptInterface
方法向我在 WebView
中加载的网页公开自定义 API。
ios WKWebView
有类似的替代方案吗?
我遇到了evaluateJavaScript
,它允许我运行 JavaScript 以将我的 API 添加到全局范围,但我无法找到一种添加与我的应用程序通信的代码的方法。
【问题讨论】:
据我了解,您正试图让 javascript 与 Webview 进行通信。我试着做和你一样的事情,它在 Android 上工作,但在 IOS 上没有。有一种方法可以让他们交流,但它只有一个功能。有一篇大文章解释的很好medium.com/@JillevdWeerd/… @GilbertGabriel 谢谢,这看起来像我需要的东西 没问题!我写了一个答案,所以如果文章满足需求,请随时接受,否则告诉我! 【参考方案1】:这是可能的。您可能正在寻找WKScriptMessageHandler
。为 Web 视图创建自定义配置。例如在您的视图控制器的viewDidLoad
。
let configuration = WKWebViewConfiguration()
使用配置注册脚本消息处理程序。例如一个视图控制器,它在viewDidLoad
上创建WKWebView
。然后视图控制器需要符合WKScriptMessageHandler
。
configuration.userContentController.add(self, name: "helloworld")
使用自定义配置以编程方式创建 Web 视图。
webView = WKWebView(frame: view.frame, configuration: configuration)
从 JavaScript 调用 WebKit 消息处理程序。消息处理程序可用作全局 window.webkit.messageHandlers
对象中的属性。属性使用上面调用WKUserContentController.add(_:name:)
时使用的名称。
window.webkit.messageHandlers.helloworld.postMessage("Hi!");
处理来自 JavaScript 上下文的调用。
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)
print(message.body as! String)
免责声明:我将这段代码 sn-ps 从my own answer 复制并简化为更高级别的问题,其解决方案包括这些步骤。
【讨论】:
【参考方案2】:可以从 WKWebview 与代码进行通信,但只能使用一个函数,这很难做到,但如果你管理好所有事情,你可以得出好的结果。我会让这篇文章解释它,因为这是一个非常复杂的过程,他们会比我做得更好。
Creating links between WKWebView and native code
【讨论】:
以上是关于iOS 向 WKWebView 公开自定义 API的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS WKWebView 中保留“Referer”标头?