1、101 文章 - 6 评论 - 100 IOS 推送功能的实现( javapns) IOS 的推送实现由这样几步来完成 : 1. 创建 Push SSL Certification 2. IOS 客户端注册 Push 功能并获得 DeviceToken 3. 使用 Provider 向 APNS 发送 Push 消息 4. IOS 客户端接收处理由 APNS 发来的消息 创建 Push SSL Certification 登录 ,创建新的 App ID,要求此 ID 的 Bundle Identifier 不包含通配符,否则不能启用 Push 以及 IAP 功能。例如 com.soso.sos
2、oimage。 在 App IDs 列表页面,点击刚创建的 app id 右面的 Configure 链接,进入 Configure App ID 界面,选中 “Enable for App Push Notification service“。点击 Development Push SSL Certificate 一行的 Configure 按钮,弹出 “Apple Push Notification service SSL Certificate Assistant“对话框,依对话框操作,类似于创建开发或发布用的 Certificate。 最终将 Development Push SSL
3、Certificate 下载并安装到本地 Keychain Access。导出成 p12 文件,备用。导出时需要设置密码,不得为空。 在 ,创建一个新的 Provisioning Profile,使用我们刚刚创建的支持 Push 功能的 App ID。下载并安装到本地。 IOS 客户端注册 Push 功能并获得 DeviceToken 创建本地工程, info.plist 中设置 Bundle identifier 为刚刚创建的 Bundle Id。 Com.soso.sosoimage。设定 Code Signing Identity 为刚刚创建的 Provisioning Profile。
4、 程序第一次执行的时候,调用如下代码 . UIApplication sharedApplication registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound); 三个参数分别代表消息(横幅或提醒,由用户 Setting 决定,程序不可更改)、数字标记、声音。 在 AppDelegate.m 中添加两个方法 . /iPhone 从 APNs 服务器获取 deviceToken 后回 调此方法
5、 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken NSString* dt = deviceToken description stringByTrimmingCharactersInSet:NSCharacterSet characterSetWithCharactersInString:“; NSLog(“deviceToken:%“, dt); /注册 push 功能失败 后 返回错误信息,执行相应的处理 - (v
6、oid)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err NSLog(“Push Register Error:%“, err.description); 获取 DeviceToken 后,将其传给 Provider。 使用 Provider 向 APNS 发送 Push 消息 Provider,将推送信息发送给 APNS(苹果推送服务器)的程序。有很多开源的实现,我们使用 javapns ( http:/ )。 首先, Provider 要有目标 D
7、eviceToken,这是发送目标,由客户端传给 Provider 之后存在某处。 安装 javapns,需要导入的 jar 为 bcprov-jdk15-146.jar, log4j-1.2.15.jar, JavaPNS_2.3_Alpha_5.jar。 将前面导出的 P12 文件放在 Provider 的工程目录下。 Provider 向 APNS 发送消息可以参考 javapns 中 NotificationTest.java。也可以参考如下例子。 (1)使客户端图标显示数字标记 Push.badge(2, keystore, password, false, “7bb8d508e32
8、df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67“); 其中, 2 为要显示的数字; String keystore = “PushCertificates.p12“; /P12 文件的路径; String password = “sosoimage“; /P12 文件的密码; false,指的是使用测试环境,使用正式产品环境应传入 true. “7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67“为客户端获得并传给 Provider 的 DeviceToke
9、n,此参数还可以传入 String对象,以同时向多个客户端 Push 消息。 (2)使客户端显示横幅或提醒 Provider 可以向客户端 Push 一条 Message,但客户端有权限决定这条 Message 的显示方式(无、横幅、提醒)。 Push.alert(“A Message“, keystore, password, )false, “7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67“); (3)混合方式 可以在一个 Push 消息里附带多种信息, Message, 标记,声音,可以使用如下代码 . P
10、ushNotificationPayload payload = PushNotificationPplex(); payload.addAlert(“A Message“); payload.addBadge(2); payload.addSound(“test.aiff“); Push.payload(payload, , keystore, password, false, “7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67“); 上面的代码都有可能会有相应的 Exception 抛出来,需要处理。更多的使用
11、方式可以参考 http:/ IOS 客户端接收处理由 APNS 发来的消息 (1)当程序未启动,用户接收到消息。需要在 AppDelegate 中的 didFinishLaunchingWithOptions 得到消息内容。代码如下, - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions . NSDictionary* payload = launchOptions objectForKey:UIApplicationLaunchO
12、ptionsRemoteNotificationKey; if (payload) . . (2)当程序在前台运行,接收到消息不会有消息提示(提示框或横幅)。当程序运行在后台,接收到消息会有消息提示,点击消息后进入程序, AppDelegate 的 didReceiveRemoteNotification 函数会被调用(需要自己重写),消息做为此函数的参数传入,代码如下 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload . (3)无论在哪个函
13、数传入,消息总是一个 NSDictionary 对象,处理方式可以参考如下代码 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload NSLog(“remote notification: %“,payload description); NSString* alertStr = nil; NSDictionary *apsInfo = payload objectForKey:“aps“; NSObject *alert = apsInfo o
14、bjectForKey:“alert“; if (alert isKindOfClass:NSString class) alertStr = (NSString*)alert; else if (alert isKindOfClass:NSDictionary class) NSDictionary* alertDict = (NSDictionary*)alert; alertStr = alertDict objectForKey:“body“; application.applicationIconBadgeNumber = apsInfo objectForKey:“badge“ integerValue; if (application applicationState = UIApplicationStateActive alertView show;