如何在 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 及更高版本中运行的应用程序中,使用 WKWebView 类而不是 UIWebView。 [...] 尽管此方法 [stringByEvaluatingJavaScript] 并未被弃用,但最佳实践是 改为使用 WKWebView 类的 evaluateJavaScript(_:completionHandler:) 方法。
WKWebView's API Reference进一步强调:
重要 从 iOS 8.0 和 OS X 10.10 开始,使用 WKWebView 将 Web 内容添加到您的应用程序。不要使用 UIWebView 或 WebView。
【讨论】:
伙计,请回答我!我编辑了我的帖子以澄清事情,我希望你能解决我的问题。以上是关于如何在 AppDelegate 中使用 stringByEvaluatingJavaScript的主要内容,如果未能解决你的问题,请参考以下文章
如何在 appdelegate 中使用 applicationDidEnterBackground 保存 NSUserDefault
SwiftUI中如何使用@EnvironmentObject在AppDelegate和SceneDelegate/Views之间共享数据
如何在 AppDelegate 中使用 Parse 正确设置 Facebook iOS SDK?