我正在使用Firebase向WebViewController()
发送推送通知
收到的通知有一个URL有效负载,我已成功从有效负载中获取URL,但现在当用户点击通知时,我无法将其发送到WebViewController()
。
以下是当用户点击通知时调用的有效负载方法的方法:
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
if let aps = userInfo["aps"] as? [String: Any] {
if let alertPayload = aps["alert"] as? String {
let webViewController = WebViewController()
webViewController.urlString = alertPayload
let url = URL(string: alertPayload)
let urlRequest = URLRequest(url: url!)
webViewController.webView.loadRequest(urlRequest)
}
}
completionHandler()
}
这是WebViewController()
class WebViewController: UIViewController {
@IBOutlet weak var webView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
}
}
请注意我已成功收到通知,但只要我在打电话时点击通知,应用就会崩溃:
webViewController.webView.loadRequest(urlRequest)并说出found nil
答案 0 :(得分:1)
发生崩溃是因为webView
尚未加载webViewController
。我们不能简单地使用let webViewController = WebViewController()
进行实例化,特别是如果您使用的是故事板。
处理推送通知和重新加载新内容(在您的情况下重新加载新网址)的常用方法是使用NotificationCenter(假设您使用的是Swift 3)。 NotificationCenter就像您在控制器中添加侦听器/观察器并等待事件发生
首先,将观察者添加到您想要在webViewController
方法中进行更改的viewDidLoad
。
override func viewDidLoad() {
super.viewDidLoad()
// some of your codes here
// ...
// ...
NotificationCenter.default.addObserver(self, selector: #selector(WebViewController.reloadWebview(notification:)), name: Notification.Name("NotificationReloadWebView"), object: nil)
}
然后添加方法来处理通知是否发生
func reloadWebview(notification: Notification) {
if let url = notification.userInfo?["url"] as? UIImage {
// load the url to webview
let urlRequest = URLRequest(url: url!)
self.webView.loadRequest(urlRequest)
}
}
最后,一旦收到新推送通知,就会通过AppDelegate
发送发布通知来触发观察者
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
if let aps = userInfo["aps"] as? [String: Any] {
if let newUrl = aps["alert"] as? String {
let info = ["url": newUrl]
// post notification with info (url)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "NotificationReloadWebView"), object: nil, userInfo: info)
}
}
completionHandler()
}