Swift читать userInfo удаленного уведомления
Я реализовал функцию для открытия AlertView, когда получаю удаленное уведомление, подобное этому:
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()
}
Но NotificationMessage всегда ноль.
Моя полезная нагрузка json выглядит так:
{"aps":{"alert":"Testmessage","badge":"1"}}
Я использую Xcode 6, Swift, и я разрабатываю для iOS8.
Я обыскал часы, но не нашел никакой полезной информации.
Уведомления работают отлично.. и если я нажму на него, откроется окно alertview.
Моя проблема в том, что я не могу получить данные из userInfo.
Ответы
Ответ 1
Элемент корневого уровня словаря userInfo
"aps"
, а не "alert"
.
Попробуйте следующее:
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
}
}
См. Push Notification Documentation
Ответ 2
Для меня, когда я отправляю сообщение из Accengage, работает следующий код -
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
}
Единственное отличие от ответа Craing Stanford: key
Я использовал для извлечения сообщения из экземпляра alert
, который является body
, который отличается. Подробнее см. Ниже -
if let alertMessage = alert["message"] as? NSString
против
if let alertMessage = alert["body"] as? String
Ответ 3
Метод (Swift 4):
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
}
Использование:
let info = self.extractUserInfo(userInfo: userInfo)
print(info.title)
print(info.body)
Ответ 4
Предупреждение должно отображаться, когда приложение находится в активном состоянии. Так что проверять состояние активно или нет.
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)
}
Из этого, если пользователю нужно сообщение, то он может получить предупреждение.
Ответ 5
Я использую APNs Provider и JSON полезную нагрузку, как показано ниже
{
"aps" : {
"alert" : {
"title" : "I am title",
"body" : "message body."
},
"sound" : "default",
"badge" : 1
}
}
Из-за того, что провайдер создает его как JSON-определенный словарь, который iOS преобразует в объект NSDictionary
, без индекса, такого как Dictionary
, но может использовать value(forKey:)
Ссылка отсюда
Это мой способ для Swift 4
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
guard application.applicationState == .active else { return }
guard let alertDict = ((userInfo["aps"] as? NSDictionary)?.value(forKey: "alert")) as? NSDictionary,
let title = alertDict["title"] as? String,
let body = alertDict["body"] as? String
else { return }
let alertController = UIAlertController(title: title, message: body, preferredStyle: .alert)
let okAct = UIAlertAction(title: "Ok", style: .default, handler: nil)
alertController.addAction(okAct)
self.window?.rootViewController?.present(alertController, animated: true, completion: nil)
completionHandler(UIBackgroundFetchResult.noData)
}