IOS推送功能的实现
来源:互联网 发布:sql between and的用法 编辑:程序博客网 时间:2024/05/23 02:07
文章转载自:http://blog.csdn.net/worldmatrix/article/details/7634596
IOS的推送实现由这样几步来完成:
- 创建Push SSL Certification
- IOS客户端注册Push功能并获得DeviceToken
- 使用Provider向APNS发送Push消息
- IOS客户端接收处理由APNS发来的消息
创建Push SSL Certification
登录developer.apple.com,创建新的App ID,要求此ID的Bundle Identifier不包含通配符,否则不能启用Push以及IAP功能。例如 com.soso.sosoimage。
在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 Certificate下载并安装到本地Keychain Access。导出成p12文件,备用。导出时需要设置密码,不得为空。
在developer.apple.com,创建一个新的Provisioning Profile,使用我们刚刚创建的支持Push功能的App ID。下载并安装到本地。
IOS客户端注册Push功能并获得DeviceToken
创建本地工程,info.plist中设置Bundle identifier为刚刚创建的Bundle Id。Com.soso.sosoimage。设定Code Signing Identity为刚刚创建的Provisioning Profile。 程序第一次执行的时候,调用如下代码.
- [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
三个参数分别代表消息(横幅或提醒,由用户Setting决定,程序不可更改)、数字标记、声音。
在AppDelegate.m中添加两个方法.- //iPhone 从APNs服务器获取deviceToken后回调此方法
- - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
- {
- NSString* dt = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
- NSLog(@"deviceToken:%@", dt);
- }
- //注册push功能失败 后 返回错误信息,执行相应的处理
- - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err
- {
- NSLog(@"Push Register Error:%@", err.description);
- }
使用Provider向APNS发送Push消息
Provider,将推送信息发送给APNS(苹果推送服务器)的程序。有很多开源的实现,我们使用javapns ( http://code.google.com/p/javapns/ )。首先,Provider要有目标DeviceToken,这是发送目标,由客户端传给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, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");
- String keystore = "PushCertificates.p12"; //P12文件的路径;
- String password = "sosoimage"; //P12文件的密码;
"7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67"为客户端获得并传给Provider的DeviceToken,此参数还可以传入String[]对象,以同时向多个客户端Push消息。
(2)使客户端显示横幅或提醒
Provider可以向客户端Push一条Message,但客户端有权限决定这条Message的显示方式(无、横幅、提醒)。
- Push.alert("A Message", keystore, password, )false, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");
(3)混合方式
可以在一个Push消息里附带多种信息,Message, 标记,声音,可以使用如下代码.- PushNotificationPayload payload = PushNotificationPayload.complex();
- payload.addAlert("A Message");
- payload.addBadge(2);
- payload.addSound("test.aiff");
- Push.payload(payload, , keystore, password, false, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");
IOS客户端接收处理由APNS发来的消息
(1)当程序未启动,用户接收到消息。需要在AppDelegate中的didFinishLaunchingWithOptions得到消息内容。代码如下,- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- ...
- NSDictionary* payload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
- if (payload)
- {
- ...
- }
- ...
- }
- - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload
- {
- ...
- }
- - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload
- {
- NSLog(@"remote notification: %@",[payload description]);
- NSString* alertStr = nil;
- NSDictionary *apsInfo = [payload objectForKey:@"aps"];
- NSObject *alert = [apsInfo objectForKey:@"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 && alertStr != nil)
- {
- UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Pushed Message" message:alertStr delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
- [alertView show];
- }
- }
- IOS推送功能的实现
- IOS推送功能的实现
- IOS推送功能的实现
- IOS推送功能的实现
- IOS推送功能的实现
- IOS 推送功能的实现
- IOS推送功能的实现
- Ruby语言实现IOS的push推送功能
- Ruby语言实现IOS的push推送功能
- IOS推送功能的实现(badgeNumber问题)
- 服务器端接入有盟推送,实现为android 和 ios推送的功能
- 极光推送功能的实现
- IOS推送功能实现---极光推送
- iOS 推送的服务端实现
- iOS 推送通知的实现
- iOS-推送实现的原理
- 关于ios 推送功能的终极解决
- 关于ios 推送功能的终极解决
- 《Zend Framework2.0最新版本快速入门手册》【第三篇】单元测试(CSDN首发中!!支持围观)
- input子系统
- js如何定义函数
- HDOJ 【C】1.1.3 A+B for Input-Output Practice (III)
- 中国剩余定理(也叫孙子定理)
- IOS推送功能的实现
- 安装arm版qt出错
- ArcGIS Server 10:发布影像服务
- java jstl fmt fn 标签
- More Effective C++读书笔记11
- 为什么jQuery是用toString来判断数据类型,而不是typeof或instanceof
- iOS成长之路-获取系统键盘的高度
- Microsoft.Practices.EnterpriseLibrary连接Oracle
- ArcGIS Server 10:发布地图文档服务