iOS 10远程通知

在iOS 10中,通知发生了很大变化。 远程和本地通知方法是统一的。 您可以使用通知扩展名添加图像之类的媒体。 在本文中,我将讨论如何设置通知类型和注册远程通知。 在下一部分中,我将向您展示如何处理远程通知和可操作的通知。

远程通知过程

首先,了解如何使用远程通知会很有帮助。 远程通知涉及以下步骤:

  1. 配置您的通知类型并注册远程通知
  2. 注册到APN的远程通知
  3. 将设备令牌注册到服务器(推送通知提供程序)
  4. 在提供商和APN之间进行通信
  5. 处理远程通知

步骤3和4是服务器端过程。

步骤1.配置通知类型并注册远程通知

1)配置通知类型

您需要请求授权才能接收通知。 在此阶段,您可以设置通知类型,例如警报,声音和标志。

  • 在iOS 9及以下版本中
    使用`registerUserNotificationSettings`方法
  • 在iOS 10中
    使用`requestAuthorization(options:completionHandler:)`方法。
  func requestAuthorization(options:UNAuthorizationOptions = [], 
completeHandler:@转义(Bool,Error?)-> Void)
  • 选项描述您要提供的通知类型。
  • completeHandler具有两个参数: Granterror
    –如果未发生错误,错误nil
    授予的返回truefalse取决于以下情况。

这不是我期望的结果。 为什么?

授予所请求选项的授权时,此参数的值为* true *。 当一个或多个选项的授权被拒绝时,该值为* false *。

在Apple文档中,他们谈论的是请求的选项,而不是通知设置。 但是实际的测试结果与上面的列表不同。 即使用户更改了授权选项(例如在设置应用中禁用警报),它也没有返回“ false”值。

首次启动应用程序时,“授权请求”对话框仅出现一次。 因此,我建议您将`.alert`选项设置为默认选项。如果您从`registerUserNotificationSettings`或`requestAuthorization(options:completionHandler:)`中省略了该选项,则无法在设置应用程序中为您的应用程序通知找到警报选项。

2)注册远程通知

  • 调用registerForRemoteNotifications()方法。
  • 如果注册成功,它将自动调用` application:didRegisterForRemoteNotificationsWithDeviceToken`委托方法。 如果失败,则调用application:didFailToRegisterForRemoteNotificationsWithError委托方法。

样例代码

  // appDelegate.swift 
 导入用户通知 

@UIApplicationMain
类AppDelegate:UIResponder,UIApplicationDelegate {

var window:UIWindow?


func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)->布尔{
// 1.注册通知类型
如果#available(iOS 10.0,*){
UNUserNotificationCenter
。当前()
.requestAuthorization(选项:[.alert,.sound,.badge])
  { 
授予,错误

如果授予&&错误==无{
debugPrint(“ granted”)
// 2.注册您的应用以获取远程通知。
application.registerForRemoteNotifications()
}其他{
//禁用通知服务。 例如)通知提供商服务器。
debugPrint(error?.localizedDescription ??“未授予授权。请在设置应用程序中检查您的应用程序通知设置”)
}
}其他{
让设置= UIUserNotificationSettings(类型:[.alert,.badge,.sound],类别:无)
//要安全地调用registerForRemoteNotifications,请在下面的iOS9中使用application:didRegister委托方法
}
}
...
...

@available(iOS,不建议使用:10.0)
AppDelegate扩展名{
func application(_ application:UIApplication,didRegister notificationSettings:UIUserNotificationSettings){
application.registerForRemoteNotifications()
}
}

参考文献

  • http://qiita.com/tokorom/items/6c6864fa8e841e50e37b
  • https://gist.github.com/KentarouKanno/d7c7768deea70076264f2208a878de68