2015-02-18 8 views
38

ho implementato una funzione per aprire un AlertView quando si riceve una notifica remota come questo:Swift leggere userInfo di notifica remota

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 pari a zero.

mio JSON payload è simile al seguente:

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

Sto usando Xcode 6, Swift e sto sviluppando per iOS 8. Ho cercato ore ora, ma non ho trovato alcuna informazione utile. Le notifiche funzionano perfettamente .. e se faccio clic su di esso, si apre la visualizzazione dell'avviso. Il mio problema è che non riesco a ottenere i dati da userInfo.

risposta

77

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

provare 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 
    } 
} 

Vedi Push Notification Documentation

+0

Come apparire in C++ oggettivo? –

+0

È corretto che OP l'elemento del livello root è aps e non è di avviso in userInfo dic .... ma come individuare le chiavi e la struttura del dizionario corrette all'interno di un sistema iOS. nella documentazione di swift 4 posso vedere i nomi di notifica tutti standardizzati in Notification.Name ma non riesco a vedere alcuna documentazione che dica ... questo è il dizionario UserInfo inviato con una particolare notifica e qui ci sono le chiavi ..? – lozflan

4

Per quanto mi riguarda, quando trasmetto il messaggio dal 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 con Craing Stanford risposta è il key che ho usato per estrarre il messaggio dall'istanza alert che è body che è diverso. Vedi sotto per ulteriori clearification -

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

vs

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

Alert dovrebbe mostrare mentre l'applicazione è 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 bisogno messaggio allora egli può ottenere messaggio di avviso.