2015-02-18 2 views
38

Я реализовал функцию, чтобы открыть AlertView, когда я получаю удаленного оповещения, как это:Swift чтения USERINFO дистанционного уведомления

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.

ответ

77

Элемент корневого уровня словаря 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

+0

Как бы это выглядело в объективном C++? –

+0

Хорошо, что вы сообщили OP, что элемент корневого уровня является aps и не является предупреждением в userInfo dic .... но как узнать правильные ключи и структуру словаря, которые находятся в системе iOS, отправленной пользователем пользовательского словаря уведомлений. в документах swift 4 я могу видеть имена уведомлений, все стандартизованные в Notification.Name, но я не вижу никакой документации, говорящей ... это словарь userInfo, отправленный с определенным уведомлением, и вот ключи ..? – lozflan

4

Для меня, когда я посылаю сообщение от 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 Стэнфорда Ответ key Я использовал для извлечения сообщения от alert экземпляра, который является body, который отличается. Смотрите ниже для получения дополнительной clearification -

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

против

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

оповещение должно быть показано в то время как приложение находится в активном состоянии. Поэтому проверьте состояние, активное или нет.

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

Из этого, если пользователю необходимо сообщение, то он может получить предупреждающее сообщение.

Смежные вопросы