【问题标题】:how stringByEvaluatingJavaScript in AppDelegate如何在 AppDelegate 中使用 stringByEvaluatingJavaScript
【发布时间】: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 实例执行此调用。

标签: ios swift3 uiwebview appdelegate swift3.0.2


【解决方案1】:

更新:

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

原答案:

这取决于您使用的是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。

【讨论】:

  • 伙计,请回答我!我编辑了我的帖子以澄清事情,我希望你能解决我的问题。
猜你喜欢
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多