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);
}
获取DeviceToken后,将其传给Provider。
使用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");
其中,2为要显示的数字;
String keystore = "PushCertificates.p12"; //P12文件的路径;
String password = "sosoimage"; //P12文件的密码;
false,指的是使用测试环境,使用正式产品环境应传入true.
"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");
上面的代码都有可能会有相应的Exception抛出来,需要处理。更多的使用方式可以参考 http://code.google.com/p/javapns/
IOS客户端接收处理由APNS发来的消息
(1)当程序未启动,用户接收到消息。需要在AppDelegate中的didFinishLaunchingWithOptions得到消息内容。代码如下,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
NSDictionary* payload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (payload)
{
...
}
...
}
(2)当程序在前台运行,接收到消息不会有消息提示(提示框或横幅)。当程序运行在后台,接收到消息会有消息提示,点击消息后进入程序,AppDelegate的didReceiveRemoteNotification函数会被调用(需要自己重写),消息做为此函数的参数传入,代码如下
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload
{
...
}
(3)无论在哪个函数传入,消息总是一个NSDictionary对象,处理方式可以参考如下代码
- (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];
}
}
分享到:
相关推荐
1、应用程序注册消息推送。 2、iOS从APNS Server获取device token,应用程序接收device token。 3、应用程序将device token发送给PUSH服务端程序。 4、服务端程序向APNS服务发送消息。 5、APNS服务将消息...
小米推送支持201706版本ios推送标题、自定义铃声等功能
使用java语言开发ISO系统推送功能,包括所有依赖jar包、详细代码、开发步骤等
iOS 消息推送(iOS 工程源码),简单的实现了iOS的消息推送功能。
ios本地推送方法。简单的实现了本地推送功能,以及附上网络推送的一些方法
这个压缩包里面包含三个DOC文件:1.iphone推送java实现.doc 2....三个文档很全面的指导学者学习怎么用java实现ios推送功能,不仅仅是讲解怎么实现,还讲解原理和简单的例子,让学者更好的掌握,希望能帮助到大家!
极光推送使用java后台接入demo,推送会通知到Android和Ios的手机通知栏
iOS 实现推送自动播放的功能【应用杀掉之后也能播放!类似支付宝收到转账的效果!】
IOS信息推送 .net版本,已经实现推送功能
推送通知,是现在的应用必不可少的功能。...首先我们要说说iOS推送通知的基本原理: 苹果的推送服务通知是由自己专门的推送服务器APNs (Apple Push Notification service)来完成的,其过程是 APN
主要介绍了iOS10 适配远程推送功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
移动互联网的迅猛发展带动了APP产业的发展,Android和iOS两大移动平台雄霸天下,消息推送(Pull Technology)得到了很广泛的使用,由于Android和iOS的架构和实现的不同,相应的推送实现也...实现好售平台聊天推送功能。
极光推送实现页面跳转
iOS推送小结介绍普通推送、多媒体推送等推送的开发。可以实现带音视频、图片的推送,如支付宝到账语音推送、新闻类带图片推送等;交互式推送,如新闻类推送的回复跟帖效果。推送测试可以通过Easy APNs Provider等...
腾讯信鸽推送——专业移动推送平台 ...腾讯信鸽推送平台是一个专业的移动APP推送平台,提供了丰富的推送能力、标签系统、SDK和API、实时监控、安全保证、设备监控和容灾等功能,可以满足开发者的多种需求。
主要介绍了iPhone/iPad开发之通过LocalNotification实现iOS定时本地推送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
主要为大家详细介绍了iOS10全新推送功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
JAVA程序调用苹果推送服务,实现IOS设备消息提醒功能 调用时所需依赖包 调用实例代码
该示例通过Qt实现了ios的通知栏推送功能,是一个完整的项目,里面包含有文档使用说明,也可以到我的博客查看具体使用教程https://mp.csdn.net/postedit/96883623
很多朋友都反馈,发现了iOS9升级到iOS10推送功能不正常的问题,所以这篇文章总结了一下要点,亲们可以根据以下步骤,逐步排查问题,也可以逐步实现iOS10的推送功能。下面来一起看看吧。