将通知有效负载发送到UIViewController

时间:2017-07-16 22:33:44

标签: ios swift firebase notifications firebase-cloud-messaging

我正在使用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

1 个答案:

答案 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()
}