ios - Swift legge userInfo di notifica remota



json push-notification (3)

L'avviso dovrebbe essere visualizzato mentre l'app è in stato attivo. Quindi controlla se lo stato è attivo o meno.

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    if application.applicationState == .active {
      if let aps = userInfo["aps"] as? NSDictionary {
        if let alertMessage = aps["alert"] as? String {
          let alert = UIAlertController(title: "Notification", message: alertMessage, preferredStyle: UIAlertControllerStyle.alert)
          let action = UIAlertAction(title: "Ok", style: .default, handler: nil)
          alert.addAction(action)
          self.window?.rootViewController?.present(alert, animated: true, completion: nil)
        }
      }
    }
    completionHandler(.newData)
  }

Da questo, se un utente ha bisogno di un messaggio, può ricevere un messaggio di avviso.

Ho implementato una funzione per aprire un AlertView quando ricevo una notifica remota come questa:

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]){
        var notifiAlert = UIAlertView()
        var NotificationMessage : AnyObject? =  userInfo["alert"]
        notifiAlert.title = "TITLE"
        notifiAlert.message = NotificationMessage as? String
        notifiAlert.addButtonWithTitle("OK")
        notifiAlert.show()
}

Ma NotificationMessage è sempre nullo.

Il mio payload Json assomiglia a questo:

{"aps":{"alert":"Testmessage","badge":"1"}}

Sto usando Xcode 6, Swift e sto sviluppando per iOS8. Ho cercato ore ora, ma non ho trovato alcuna informazione utile. Le notifiche funziona perfettamente .. e se clicco, si apre la vista dell'avviso. Il mio problema è che non sono in grado di estrarre i dati da userInfo.


Answer #1

L'elemento del livello root del dizionario userInfo è "aps" , non "alert" .

Prova quanto segue:

if let aps = userInfo["aps"] as? NSDictionary {
    if let alert = aps["alert"] as? NSDictionary {
        if let message = alert["message"] as? NSString {
           //Do stuff
        }
    } else if let alert = aps["alert"] as? NSString {
        //Do stuff
    }
}

Vedere la documentazione di notifica push


Answer #2

Per me, quando invio il messaggio da Accengage , il seguente codice funziona -

private func extractMessage(fromPushNotificationUserInfo userInfo:[NSObject: AnyObject]) -> String? {
    var message: String?
    if let aps = userInfo["aps"] as? NSDictionary {
        if let alert = aps["alert"] as? NSDictionary {
            if let alertMessage = alert["body"] as? String {
                message = alertMessage              
            }
        }
    }
    return message
}

L'unica differenza dalla risposta di Craing Stanford è la key ho usato per estrarre il messaggio dall'istanza di alert che è il body che è diverso. Vedi sotto per ulteriori clearification -

if let alertMessage = alert["message"] as? NSString

vs

if let alertMessage = alert["body"] as? String




userinfo