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的主要内容,如果未能解决你的问题,请参考以下文章

使用 WKWebView 创建自定义 ORKStep

在 WKWebView 中使用自定义本地字体

在 iOS WKWebView 中保留“Referer”标头?

与 PowerBI Embedded Report (WKWebView) 交互时的 GreyBox

如何使用objective-c向接口公开自定义初始化实现?

如何使用objective-c向接口公开自定义初始化实现?