0

解决了

我在 ViewController 中使用了观察者

我在 Swift3 中有一个 iOS webview,需要从 AppDelegate 调用 Js 函数。原因是因为我正在使用推送通知,当用户点击通知时,我需要将信息从 swift3 传递给 JS。

这是我的ZhWebViewController 的头

class ZhWebViewController: UIViewController, UIWebViewDelegate { func passNotificationToWebView(userInfo: AnyObject){ let jsonData = try! JSONSerialization.data(withJSONObject: userInfo, options:
JSONSerialization.WritingOptions.prettyPrinted) let jsonString = NSString(data: jsonData, encoding:
String.Encoding.utf8.rawValue)! as String self.webView.stringByEvaluatingJavaScript(from: "triggerNotificationClick(\ (jsonString))") } }

这就是我声明我的 UIWebView 的方式

@IBOutlet weak var webView: UIWebView!

这就是我调用JS函数的方式,这种方式有效!!!

self.webView.stringByEvaluatingJavaScript(from: "someFunctionJS(\(jsonString))")

这是我的 AppDelegate 的负责人

@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? }

这是我收到通知的地方,在这里我想调用 JS 函数,我尝试在 ZHWebView 中调用一个函数并尝试发送到 JS,但我得到了致命错误。

@available(iOS 10, *) extension AppDelegate : UNUserNotificationCenterDelegate{ func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) { let userInfo = response.notification.request.content.userInfo ZhWebViewController().passNotificationToWebView(userInfo: userInfo as AnyObject) completionHandler() } }

4

1 回答 1

0

更新:

看来我完全误解了你的问题。问题不是如何评估一些 JavaScript,而是如何从您的应用程序委托到您的视图控制器。这些应该可以帮助您:

原答案:

这取决于您使用的是 aUIWebView还是 a WKWebViewUIWebView.stringByEvaluatingJavaScript()评估和之间的JavaScript 代码的主要区别WKWebView.evaluateJavaScript()在于前者调用是同步的,而后者是异步的。

相比

let webView: UIWebView = ...
let result = webView.stringByEvaluatingJavaScript(from: "your javascript goes here")

let webView: WKWebView = ...
webView.evaluateJavaScript("your javascript goes here") { (result: Any?, error: Error?) in
    // handle completion
}

请注意UIWebView API 参考状态

在 iOS 8 及更高版本中运行的应用程序中,使用 WKWeb​View 类而不是 UIWeb​View。
[...]
虽然此方法 [stringByEvaluatingJavaScript] 并未被弃用,但最佳实践是使用 WKWeb​View 类的 evaluate​Java​Script(_:​completion​Handler:​) 方法。

WKWebView 的 API Reference进一步强调了这一点:

重要
从 iOS 8.0 和 OS X 10.10 开始,使用 WKWebView 将 Web 内容添加到您的应用程序。不要使用 UIWebView 或 WebView。

于 2017-03-17T15:25:13.203 回答