如何注册推送通知? IOS 10

Posted

技术标签:

【中文标题】如何注册推送通知? IOS 10【英文标题】:How to registre for push notification ? ios10 【发布时间】:2016-12-12 09:51:54 【问题描述】:

我认为注册推送通知的正确方法是先配置用户交互然后注册推送通知,如下所示

let center = UNUserNotificationCenter.current()
              center.requestAuthorization(options: [.alert, .sound])  (granted, error) in

                  if granted 

                    // Register with APNs
                    UIApplication.shared.registerForRemoteNotifications()

                  else

                      //user did't grant permissino: so we need to send phone ids, as we need to call this function every time the application opened
                      self.sendPhoneIdsToLookitServer()


                  


              

但是苹果显示了不同的方式,它不建议在配置用户交互后将远程通知注册为回调,而是要求配置用户交互然后注册推送通知而不等待用户响应,如您所见@987654321 @

func applicationDidFinishLaunching(_ aNotification: Notification) 
    // Configure the user interactions first.
    self.configureUserInteractions()

    NSApplication.shared().registerForRemoteNotifications(matching: [.alert, .sound])

哪种方法是正确的?

【问题讨论】:

这里详细解释:***.com/a/40430122/3882338 @david,你可以看看下面我的回答 【参考方案1】:

如果您对 UNUserNotificationCenter requestAuthorization 以外的其他方法持开放态度,那么这肯定可以解决您的问题,它也是为 iOS 9 和 8 编写的。

func registerForNotification(application : UIApplication) 

    if #available(ios 10.0, *) 
        let setting = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
        UIApplication.shared.registerUserNotificationSettings(setting)
        UIApplication.shared.registerForRemoteNotifications()
    
        // iOS 9 support
    else if #available(iOS 9, *) 
        UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
        UIApplication.shared.registerForRemoteNotifications()
    
        // iOS 8 support
    else if #available(iOS 8, *) 
        UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
        UIApplication.shared.registerForRemoteNotifications()
    


func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) 

    let deviceTokenString = deviceToken.reduce("", $0 + String(format: "%02X", $1))
    print("deviceTokenString ======= \(deviceTokenString)")


func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) 
    print("didFailToRegisterForRemoteNotificationsWithError \(error)")


func application(_ application: UIApplication, didReceiveRemoteNotification data: [AnyHashable : Any]) 
    // Print notification payload data
    print("Push notification received: \(data)")

【讨论】:

【参考方案2】:

这不是关于正确的错误,更像是旧的和新的。 Apple 将远程和本地通知的接收合并到 applicationDidFinishLaunching 中,因此如果您处理它们的代码相似,则重复代码将更少。您可以观看this video from Apple 并了解这些变化。

但请注意,如果您的应用支持 iOS 10.0 之前的版本,则其中一些新方法可能不起作用。确保您的应用在这种情况下仍然可以处理旧方法 - 或者只使用旧方法,直到您的应用在 iOS 10.0 及更高版本上运行。

【讨论】:

以上是关于如何注册推送通知? IOS 10的主要内容,如果未能解决你的问题,请参考以下文章

iOS9.3.5如何注册自定义推送通知?

如何在 aws sns 中注册 iOS 设备令牌以接收推送通知?

在 iOS 8 中注册推送通知时如何访问 deviceToken?

Swift iOS 10 的推送通知

如何注册 iOS 设备以接收推送通知?

iOS 推送通知注册失败