Подтвердить что ты не робот

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.

4b9b3361

Ответ 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)
}