【问题标题】:iOS 10 push notifications - how does willPresentNotification and didReceiveNotificationResponse work?iOS 10 推送通知 - willPresentNotification 和 didReceiveNotificationResponse 如何工作?
【发布时间】:2017-02-04 06:52:25
【问题描述】:

目前我的应用程序设置为在 ios 9 中接收推送通知,它可以完美运行,但在 iOS 10 中我没有收到它们。我查看了关于 stackoverflow 的各种回复,发现了这个:

Push Notifications not being received on iOS 10, but working on iOS 9 and before

这似乎适用于海报。我不完全确定应该在 willPresentNotification 和 didReceiveNotificationResponse 部分下添加什么代码。如果有人有这些部分如何工作的任何示例,将不胜感激。这是我迄今为止处理推送通知的相关代码:

import UserNotifications
import Whisper

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

  registerForPushNotifications(application)
}

 //MARK: Push Notification Settings
  func registerForPushNotifications(application: UIApplication) {

    //check to see if phone is updated to iOS 10
    if #available(iOS 10.0, *){
      UNUserNotificationCenter.currentNotificationCenter().delegate = self
      UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert], completionHandler: {(granted, error) in
        if (granted)
        {
          UIApplication.sharedApplication().registerForRemoteNotifications()
        }
        else{
          print("registering for push notifications unsuccessful")
        }
      })
    }

    else{ //If user is not on iOS 10 use the old methods we've been using
      let notificationSettings = UIUserNotificationSettings(
        forTypes: [.Badge, .Sound, .Alert], categories: nil)
      application.registerUserNotificationSettings(notificationSettings)

    }

  }

  //Notification handling for iOS 10
  @available(iOS 10.0, *)
  func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
    //Handle the notification - NOT SURE WHAT GOES HERE

  }

  @available(iOS 10.0, *)
  func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
    //Handle the notification -NOT SURE WHAT GOES HERE
  }


  //This is called if user selects to receive push notifications
  func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
    //    if notificationSettings.types != .None {
    application.registerForRemoteNotifications()
    //    }
  }

  func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

    for i in 0..<deviceToken.length {
      tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    //save device token to keychain
    self.deviceToken = tokenString
    userInfo.sharedInstance.savePushNotDeviceToken(tokenString)
    NSUserDefaultsManager.sharedManager.pushNotifications = true

    //register device token to api
    registerPushNotificationDevice(tokenString)

    print("Device Token:", tokenString)
  }


  func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    print("Failed to register:", error)

    //save push notifications state
    NSUserDefaultsManager.sharedManager.pushNotifications = false

  }


  //In- App push notifications
  func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {
    if application.applicationState == .Active {

      let navigationController = self.window!.rootViewController as! UINavigationController

      let alert = [String: String]()
      let title = ""
      let body = ""

      // Default printout of userInfo
      print("All of userInfo:\n\( userInfo)\n")

      if let aps = userInfo["aps"] as? NSDictionary {
        if let alert = aps["alert"] as? NSDictionary {
          if let title = alert["title"] as? NSString {
            if let body = alert["body"] as? NSString {

              let announcement = Announcement(title: title as String, subtitle: body as String, image: UIImage(named: "Image"))
                show(shout: announcement, to: navigationController)

            }
          }
        }
      }
    }
  }



}

【问题讨论】:

    标签: ios swift push-notification apple-push-notifications ios10


    【解决方案1】:

    对于 iOS 10 中的远程和本地通知,我们有 UserNotifications.framework。要处理通知,在 UserNotifications.framework 中有两个 UNUserNotificationCenterDelegate 委托方法可用。您需要执行与 didReceiveRemoteNotification 方法中相同的代码来获取 userInfo。

    这两种方法可用于根据您的应用要求处理 userInfo。

    //UNUserNotificationCenterDelegate delegate methods to get userInfo
    
        @available(iOS 10.0, *)
        func userNotificationCenter(_ center: UNUserNotificationCenter,  willPresent notification: UNNotification, withCompletionHandler   completionHandler: @escaping (_ options:   UNNotificationPresentationOptions) -> Void) {
    
            //Called when a notification is delivered to a foreground app.
    
            let userInfo = notification.request.content.userInfo as? NSDictionary
            print("\(userInfo)")
    
         }
    
        @available(iOS 10.0, *)
        func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    
            // Called to let your app know which action was selected by the user for a given notification.
            let userInfo = response.notification.request.content.userInfo as? NSDictionary
            print("\(userInfo)")
        }
    

    【讨论】:

    • 谢谢!!我花了很长时间才意识到 userInfo 现在被埋在“notification.request.content”下
    猜你喜欢
    • 2022-11-21
    • 2013-06-20
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多