J'ai implémenté une fonction pour ouvrir un AlertView lorsque je reçois une notification à distance comme celle-ci:
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()
}
Mais NotificationMessage est toujours nul.
Ma charge json ressemble à ceci:
{"aps":{"alert":"Testmessage","badge":"1"}}
J'utilise Xcode 6, Swift et je développe pour iOS8 . J'ai recherché des heures, mais je n'ai trouvé aucune information utile . Les notifications fonctionnent parfaitement. Mon problème est que je ne parviens pas à extraire les données de userInfo.
L'élément de niveau racine du dictionnaire userInfo
est "aps"
et non "alert"
.
Essayez ce qui suit:
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
}
}
Pour moi, quand j'envoie le message de Accengage , le code suivant fonctionne -
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
}
La seule différence par rapport à la réponse de Craing Stanford est la key
que j'ai utilisée pour extraire le message de l'instance alert
qui est body
qui est différent. Voir ci-dessous pour plus de clearification -
if let alertMessage = alert["message"] as? NSString
contre
if let alertMessage = alert["body"] as? String
Méthode (Swift4):
func extractUserInfo(userInfo: [AnyHashable : Any]) -> (title: String, body: String) {
var info = (title: "", body: "")
guard let aps = userInfo["aps"] as? [String: Any] else { return info }
guard let alert = aps["alert"] as? [String: Any] else { return info }
let title = alert["title"] as? String ?? ""
let body = alert["body"] as? String ?? ""
info = (title: title, body: body)
return info
}
Usage:
let info = self.extractUserInfo(userInfo: userInfo)
print(info.title)
print(info.body)
Alert devrait apparaître lorsque l'application est à l'état actif. Alors vérifiez que l'état est actif ou non.
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)
}
À partir de là, si un utilisateur a besoin d'un message, il peut alors recevoir un message d'alerte.