如何在iOS应用程序上实现Apple推送通知服务?

是否有任何示例项目展示如何在IPhone上集成APNS ,以及如何获取deviceToken?

您需要遵循以下几个简单步骤:

  1. 在您的app delegate的didFinishLaunchingWithOptions中,您应该注册远程通知。 请注意,苹果的文档建议每次应用程序运行时注册,因为令牌可能会不时更改。 你这样做是通过调用:

     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound]; 
  2. 注册远程通知后,将调用应用程序委托中已传递令牌的方法,您需要在应用程序委托中实现此方法并将令牌发送到您的服务器(它将向您发送通知)。 该方法将如下所示:

     - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ NSLog(@"device token is: %@",deviceToken); [server sendToken:deviceToken]; } 

你也应该实现这个:

  -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{} 
  1. 一旦获得通知,您需要处理通知。 您处理收到通知的几种不同场景(应用程序位于后台或前台等),如果应用程序位于前台,处理通知的方法应该在应用程序委托中实现。 就是这个:

     -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"received notification"); //handle the notification here } 

要了解有关userInfo结构的更多信息并涵盖所有不同的方案,请仔细阅读http://developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/ApplePushService/ApplePushService.html 。 这只是事情的要点:)

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Register for Push Notitications, if running on iOS 8 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){ [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications]; }else{ [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; } return YES; } #pragma mark #pragma mark -- Push Notification Delegate Methods - (void)application:(UIApplication *)application didRegisterUserNotificationSettings: (UIUserNotificationSettings *)notificationSettings{ //register to receive notifications [application registerForRemoteNotifications]; } -(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{ // Prepare the Device Token for Registration (remove spaces and < >) NSString* devToken = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString: @" " withString: @""]; NSLog(@"My token is: %@", devToken); } -(void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error{ // NSLog(@"Failed to get token, error: %@", error); } - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"%s..userInfo=%@",__FUNCTION__,userInfo); /** * Dump your code here according to your requirement after receiving push */ } 

以下是关于如何在iOS中启用和发送推送通知的简要文档。

启用推送通知

设置推送通知的第一步是为您的应用启用Xcode 8中的function。 只需转到目标的项目编辑器,然后单击Capabilities选项卡。 查找推送通知并将其值切换为ON:

在此处输入图像描述

切换function

Xcode应显示两个复选标记,表示function已成功启用。 在幕后,Xcode在开发人员中心创建了一个App ID,并为您的应用启用推送通知服务。

注册设备

需要唯一标识设备以接收推送通知。

安装应用程序的每台设备都会被APN分配一个唯一的设备令牌,您可以在任何给定时间使用它来推送它。 为设备分配了唯一令牌后,应将其保留在后端数据库中。

示例设备令牌如下所示:

 5810F4C8C2AF5F7 F7 D6AF71A 22745D0FB50DED 665E0E882 BC5370D9CF0A F19E16 

要为当前设备请求设备令牌,请打开AppDelegate.swift并在return语句之前将以下内容添加到didFinishLaunchingWithOptions回调函数中:

 // iOS 10 support if #available(iOS 10, *) { UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]){ (granted, error) in } application.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() } // iOS 7 support else { application.registerForRemoteNotifications(matching: [.badge, .sound, .alert]) } 

在iOS 10中,引入了一个名为UserNotifications的新框架,必须导入该框架才能访问UNUserNotificationCenter类。

将以下import语句添加到AppDelegate.swift的顶部:

 import UserNotifications 

接下来,转到目标的项目编辑器,然后在“常规”选项卡中,查找“链接的框架和库”部分。

单击+并选择UserNotifications.framework:

在此处输入图像描述

接下来,在AppDelegate.swift中添加以下回调,当APN成功注册或注册设备接收通知失败时,将调用该回调:

 // Called when APNs has assigned the device a unique token func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // Convert token to string let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) // Print it to console print("APNs device token: \(deviceTokenString)") // Persist it in your backend in case it's new } // Called when APNs failed to register the device for push notifications func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { // Print the error to console (you should alert the user that registration failed) print("APNs registration failed: \(error)") } 

由您来实现将在您的应用程序后端中持久化令牌的逻辑。 在本指南的后面部分,您的后端服务器将连接到APN并通过提供此相同的设备令牌来发送推送通知,以指示哪些设备应接收通知。

请注意,由于各种原因,设备令牌将来可能会发生变化,因此请使用NSUserDefaults(本地键值存储)在本地持久保存令牌,并在令牌更改时仅更新后端,以避免不必要的请求。

在对AppDelegate.swift进行必要的修改后,在物理iOS设备上运行您的应用程序(iOS模拟器无法接收通知)。 查找以下对话框,然后按确定以允许您的应用接收推送通知:

警报对话框

在一两秒内,Xcode控制台应显示设备的唯一令牌。 复制并保存以供日后使用。

在此处输入图像描述

准备接收通知

在AppDelegate.swift中添加以下回调,当您的应用收到后端服务器发送的推送通知时,将调用该回调:

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

请注意,只有当用户单击或滑动以与锁定屏幕/通知中心的推送通知进行交互时,或者当设备收到推送通知时您的应用程序处于打开状态时,才会调用此回调。

由您来开发通知与之交互时执行的实际逻辑。 例如,如果您有一个Messenger应用程序,则“新消息”推送通知应打开相关的聊天页面,并使消息列表从服务器更新。 使用数据对象,该对象将包含您从应用程序后端发送的任何数据,例如Messenger应用程序示例中的聊天ID。

重要的是要注意,如果在收到推送通知时您的应用程序处于打开状态,则用户根本不会看到通知,您可以通过某种方式通知用户。 此StackOverflow问题列出了一些可能的解决方法,例如显示类似于库存iOS通知横幅的应用内横幅。

生成APNsvalidation密钥

在开发人员中心中打开APNs Auth Key页面,然后单击+按钮以创建新的APNs Auth Key 。

在此处输入图像描述

在下一页中,选择Apple推送通知身份validation密钥(沙箱和生产),然后单击页面底部的继续。

在此处输入图像描述

然后,Apple将生成一个包含APNs Auth Key的.p8密钥文件。

在此处输入图像描述

.p8密钥文件下载到您的计算机并保存以供日后使用。 此外,请务必在某处记下密钥ID,因为以后在连接到APN时需要它。

发送推送通知

现在,看看这里了解,APNS流程: iOS推送通知如何工作?