文档章节

远程推送IOS

海二少
 海二少
发布于 2016/03/05 22:36
字数 2160
阅读 125
收藏 6

一,IOS远程通知服务APNs

苹果的APNs(苹果推送通知服务Apple Push Notification server)允许设备和苹果的推送通知服务器保持链接,支持开发者推送消息到给用户设备对应的应用程序。

苹果的APNs基本原理是:

首先由应用注册远程通知。注册成功之后APNs会返回一个唯一标示的设备令牌码deviceToken,应用拿到分配的设备令牌码之后,需要将该设备令牌码连同其他设备以及帐户相关信息(如果有必要的话)传递给该应用对应的后台服务器。当后台服务器需要推送消息时,就将消息以及需要推送设备对应的deviceToken传递给APNs,由APNs完成推送工作.

不仅如此,应用对应的后台服务器还需要经常和APNs进行反馈通信,以便后台服务器可以知道那些deviceToken已经不存在(可能的原因是用户卸载了本应用),这种情况下我们不应该再向deviceToken对应的设备发送消息,否则会增加系统负荷。事实上,做苹果的APNs大量的工作都在后台,在前台的app开发中需要做的就是获取deviceToken并传递给后台服务器。

如果之前我们创建App ID时配置了开启推送服务,那么我们使用的开发和发布版的Provisioning文件已经能够满足我们的操作,这种情况下需要做的就是制作后台服务器使用的证书文件。

1,创建请求证书

使用该证书请求来申请一个用于开发的SSL证书。

1. 打开“钥匙串访问”应用程序。

2. 选择“KeychainAccess[钥匙串访问]->Certificate Assistant[证书助理]->Request a Certificate From CertificateAuthority[从证书办法机构请求证书]”

输入账户等信息后以默认的文件名保存到本地。名称一般为CertificateSigningRequest.certSigningRequest。

2,申请开发的SSL证书

(1)创建App ID

使用APNs服务的IOS应用必须有一个唯一的App ID。首先我们需要创建App ID。

进入apple开发者中心

https://developer.apple.com/devcenter/ios/index.action

进入"Certificates,Identifiers & Profiles"。

进入"ios Apps",点击"Identifiers"。

点击右上角的加号添加一个App ID.

App ID Description中name可以随便取一个名字.

App Services中Enable Services字段需要勾选Push Notifications。[当前这些内容都可以在App ID创建好之后重新再配置]

Explicit App ID中的Bundle ID填入我们应用的Bundle ID即可。其他默认。

(2)配置App ID

创建好App ID之后,进入该App ID详情页面。进入setting。

选择"Create an additional certificate to use for this App ID."进入"Create Certificate"页面之后根据提示向导选择第1步生成的请求证书上传。

再根据操作向导下载生成好的开发版的SSL证书。下载之后[名称为aps_development.cer],双击将证书安装到钥匙串中。这个证书会允许你的程序接收APNs发送来的推送通知。

3,创建Provisioning Profile

进入https://developer.apple.com/account/ios/profile/profileList.action

Provisioning Profiles

点击右上角加号添加Provisioning Profile, 选择iOS App Development,选择你刚才创建的App ID。

过程中会让你选择你需要包含的设备(我是勾选所有设备)。再随便输入你取的证书的名字即可生成该证书。下载到本地安装该文件。名称一般为XXXX.mobileprovision

将XXXX.mobileprovision导出p12格式的私钥文件,这里名称为Certificates.p12文件

4,制作后台服务器(C#为例)使用的p12文件

服务器后台是用C#写的,需要创建C#用的证书文件,具体制作过程如下:

制作p12文件,我们需要使用OpenSSL

我们需要上面几步中得到的三个文件:

1、CertificateSigningRequest.certSigningRequest

2、Certificates.p12//本地导出的私钥文件

3、aps_development.cer

操作如下,在终端中执行;

1、将aps_development.cer转换成aps_development.pem格式。

openssl x509 -in aps_development.cer -inform DER -out aps_development.pem -outform PEM

2、将p12格式的私钥转换成pem,需要设置几次密码。

openssl pkcs12 -nocerts -out Certificates.pem -in Certificates.p12

3、用CertificateSigningRequest.certSigningRequest, Certificates.pem和aps_development.pem创建P12格式的文件。

openssl pkcs12 -export -in aps_development.pem -inkey Certificates.pem -certfile CertificateSigningRequest.certSigningRequest -name "aps_developer_identity" -out aps_developer_identity.p12

这样我们就得到了在.net应用程序中使用的证书文件:aps_developer_identity.p12。

基于C#,JAVA等程序的开源的库也比较多,如:https://github.com/Redth/APNS-Sharp提供了一个C#的版本。在该测试程序中,需要给出这里的aps_developer_identity.p12文件以及密码。

此外,为了方便IOS开发者测试APNs,已经有很多做好的线程的服务器端的demo,比如:PushMeBaby[下载地址:https://github.com/stefanhafeneger/PushMeBaby].

下载完成后打开工程,将aps.developer.cer文件加入到工程中,修改工程中对应代码:

self.deviceToken = /*填入第4步中didRegisterForRemoteNotificationsWithDeviceToken获取到的deviceToken*/;

self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_developer" ofType:@"cer"]; 

运行PushMeBaby工程,点击push即可给app终端发送消息。

5,本地app代码参考

1,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中注册远程通知

//注册远程通知

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];

2,实现几个代理方法:

折叠C/C++ Code复制内容到剪贴板

  1. //获取deviceToken令牌  

  2. -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken  

  3. {  

  4.     //获取设备的deviceToken唯一编号  

  5.     NSLog(@"deviceToken=%@",deviceToken);  

  6.     NSString *realDeviceToken=[NSString stringWithFormat:@"%@",deviceToken];  

  7.     //去除<>  

  8.     realDeviceToken = [realDeviceToken stringByReplacingOccurrencesOfString:@"<" withString:@""];  

  9.     realDeviceToken = [realDeviceToken stringByReplacingOccurrencesOfString:@">" withString:@""];  

  10.     NSLog(@"realDeviceToken=%@",realDeviceToken);  

  11.     [[NSUserDefaults standardUserDefaults] setValue:realDeviceToken forKey:@"DeviceToken"];  

  12. }  

  13.   

  14. //获取令牌出错  

  15. -(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error  

  16. {  

  17.     //注册远程通知设备出错  

  18.     NSLog(@"RegisterForRemoteNotification error=%@",error);  

  19. }  

  20. //在应用在前台时受到消息调用  

  21. -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo  

  22. {  

  23.    //打印推送的消息  

  24.   NSLog(@"%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]):  

  25. }  

另外:

在进行IOS远程推送的过程中,首先需要创建带有“Enable for Apple Push Notification service”的App ID。如果之前的创建的App ID开启了推送功能,则可以直接使用之前开发和发布需要的Provisioning。如果之前的App ID没有配置开启远程推送功能,则应该首先创建开启了远程推送功能的App ID,并根据该App ID生成对应的开发和发布版本的Provisioning。

还需要制作服务器端的证书,如果app使用的是开发者证书,则需要使用此开发者证书制作服务器端的开发者证书,等到发布版的时候,还需要制作发布版本的证书。

使用开发者证书的测试地址

gateway.sandbox.push.apple.com:2195 

发布版本的地址

gateway.push.apple.com:2195

另外一个值得注意的问题是:一般我们是使用开发版本的Provisioning做推送测试,如果没有问题,再使用发布版本证书的时候一般也应该是没有问题的。为了以防万一,我们可以在越狱的手机上安装我们的使用发布版证书的ipa文件(最好使用debug版本,并打印出获取到的deviceToken),安装成功后在;XCode->Window->Organizer-找到对应的设备查看console找到打印的deviceToken。

在后台的推送程序中使用发布版制作的证书并使用该deviceToken做推送服务.

使用开发和发布证书获取到的deviceToken是不一样的

二,本地通知服务

IOS的本地通知服务需要使用NSLocalNotification,处理基于时间行为的通知。比如定时通知用户该学习了。

使用NSLocalNotification一般需要考虑三个方面:

scheduled time:时间周期,用来指定iOS系统发送通知的日期和时间;

notification type:通知类型(包括警告信息,动作按钮的标题,应用图标上的badge(数字标记)和播放的声音);

自定义数据,本地通知可以包含一个dictionary类型的本地数据。

对本地通知的数量限制,iOS最多允许最近本地通知数量是64个,超过限制的本地通知将被iOS忽略。

使用示例:

UILocalNotification *notification=[[UILocalNotification alloc] init]; 

NSDate *now=[NSDate new]; 

notification.fireDate=[now addTimeInterval:100]; 

notification.timeZone=[NSTimeZone defaultTimeZone]; 

notification.alertBody=@"学习IOS了"; 

[[UIApplication sharedApplication]   scheduleLocalNotification:notification];

补充:

如果之前App ID已经配置了推送功能,则客户端做得工作很简单:只需要生成开发版和发布版的推送证书例如:aps_production.cer,然后下载安装。之后重新生成开发版本和发布版本的provisioning profiles授权文件即可(provisioning profiles授权一定要在生成安装了推送证书之后重新下载安装)。

而服务器端则需要aps_production.cer等生成服务器端的证书。


© 著作权归作者所有

海二少
粉丝 0
博文 87
码字总数 48854
作品 0
程序员
私信 提问
iOS 10 的推送 User Notifications Framework

介绍 User Notifications Framework 是苹果在 WWDC 2016 推出的。iOS 10 中以前杂乱的和通知相关的 API 都被统一了,现在开发者可以使用独立的 UserNotifications.framework 来集中管理和使用...

佳妮
2018/10/30
47
1
《小印记》iOS源码分享--极光推送实践篇

笔者这几天刚完成《小印记》的推送功能,今天特分享一下在做的过程中实际解决的问题。如果读者学到了有用的东西,希望能前往App Store下载《小印记》支持一下笔者,谢谢! 《小印记》iOS源码...

_子墨
2017/03/21
140
2
iOS Push详述,了解一下?

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由WeTest质量开放平台团队发表于云+社区专栏 作者:陈裕发, 腾讯系统测试工程师 商业转载请联系腾讯WeTest获得授权,非商业...

腾讯云加社区
2018/10/26
0
0
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
JPush APNs iOS通知推送支持 badge +1

JPush APNs Notification badge 支持 +1 的功能上线了,这对 iOS 推送通知非常有意义。 大量的 iOS 应用使用 JPush iOS 来推送通知,并且经常有群发的动作,即广播或者Tag推送。 在不支持 ba...

极光推送
2015/01/29
6.6K
2

没有更多内容

加载失败,请刷新页面

加载更多

5 分钟快速学习,缓存一致性优化方案!

缓存操作 读缓存 读缓存可以分为两种情况命中(cache hit)和未命中(cache miss): 缓存命中 首先从缓存中获取数据 将缓存中的数据返回 缓存未命中 首先从缓存中获取数据 此时缓存未命中,...

架构文摘
6分钟前
1
0
【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式锁-升级版

设计 我们依然实现java.util.concurrent.locks.Lock接口。 和上一文中实现方式不同的是,我们使用ZooKeeper的EPHEMERAL_SEQUENTIAL临时顺序节点。 当首次获取锁时,会创建一个临时节点,如果...

阿里云官方博客
8分钟前
1
0
inner join 和 union all 做的汇总区别

inner join CREATE OR REPLACE VIEW M_INVENT_BARCODE_DIFF ASSELECT "INV_PART_NO","INV_ONHAND","INV_LOCATION","PART_NO","BAR_ONHAND","BAR_LOCATION"FROM (SELECT m.part_no AS......

donald121
14分钟前
3
0
EMC 设计经验总结

整体布局 1、高速、中速、低速电路要分开; 2、强电流、高电压、强辐射元器件远离弱电流、低电压、敏感元器件; 3、模拟、数字、电源、保护电路要分开; 4 、多层板设计,有单独的电源和地平...

demyar
17分钟前
2
0
支付宝高级Java现场面试35题:页锁+死锁+集群+雪崩+负载等

年底是冲刺大厂的良机,这个时间点大部分人都在观望年终奖与加薪幅度,看情况再伺机而动,人才市场的竞争反而没那么激烈。 获悉到支付宝近期有HC放出,我通过内推渠道,得到了支付宝的面试机...

mikechen优知
19分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部