如何在 AppDelegate 中使用 stringByEvaluatingJavaScript

Posted

技术标签:

【中文标题】如何在 AppDelegate 中使用 stringByEvaluatingJavaScript【英文标题】:how stringByEvaluatingJavaScript in AppDelegate 【发布时间】:2017-03-17 13:53:44 【问题描述】:

已解决

我在 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()

【问题讨论】:

您使用的是UIWebView 还是WKWebView 我正在使用 UIWebView,我正在编辑我的帖子以使事情变得清晰,请帮助我! 这是什么致命错误?请显示触发错误的代码和有关错误的信息。 我再次编辑帖子。致命错误是当我尝试在 passNotificationToWebView 中使用 stringByEvaluatingJavaScript 时。错误是:致命错误:在展开可选值时意外发现 nil 您创建一个新的ZhWebViewController 实例并在此对象上调用passNotificationToWebView(...)。除其他外,这将导致您的 @IBOutlet webView 为零。您可能希望对从情节提要加载的现有 ZhWebViewController 实例执行此调用。 【参考方案1】:

更新:

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

How to go directly to a specific View Controller if Notification has been opened What is correct way to notify view controller from AppDelegate?

原答案:

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

比较

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 Reference 状态

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

WKWebView's API Reference进一步强调:

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

【讨论】:

伙计,请回答我!我编辑了我的帖子以澄清事情,我希望你能解决我的问题。

以上是关于如何在 AppDelegate 中使用 stringByEvaluatingJavaScript的主要内容,如果未能解决你的问题,请参考以下文章

如何在 appdelegate 中使用 applicationDidEnterBackground 保存 NSUserDefault

如何在 AppDelegate 中执行 Segue?

SwiftUI中如何使用@EnvironmentObject在AppDelegate和SceneDelegate/Views之间共享数据

如何在 AppDelegate 中使用 Parse 正确设置 Facebook iOS SDK?

如何使用故事板在 AppDelegate 中使用自定义 Navigationcontroller

swift ios - 如何从 AppDelegate 在 ViewController 中运行函数