`
ydbc
  • 浏览: 720314 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

ios push机制

 
阅读更多

iOS消息推送的工作机制可以简单的用下图来概括:


Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。

上图可以分为三个阶段:

第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。

第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。


从上图我们可以看到:

1、应用程序注册消息推送。

2、iOS从APNS Server获取device token,应用程序接收device token。

3、应用程序将device token发送给PUSH服务端程序。

4、服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序。

无论是iPhone客户端和APNS,还是Provider和APNS,都需要通过证书进行连接。

下面我介绍一下几种用到的证书。

一、CSR文件

1、生成Certificate Signing Request(CSR)



2、填写你的邮箱和常用名称,并选择保存到硬盘。




点击继续:

这样就在本地生成了一个Push.certSigningRequest文件。

二、p12文件

1、导出密钥。



2、输入你的密码。


这样就生成了一个Push.p12文件。

三、SSL certificate文件

1、用你付过费的帐号登录到iOS Provisioning Portal,并新建一个App ID,这个过程可以参考:iOS应用的真机调试,这样就会生成下面这条记录:




2、点击右侧的Configure:



3、点击Development Push SSL Certificate一行后的Configure:




4、点击Continue


5、选择前面生成好的Push.certSigningRequest文件,点击Generate,出现如下所示的页面:


6、点击Continue:

7、点击Download,并将文件命名为aps_developer_identity.cer。

8、点击Done,你会发现状态变成了Enabled:


注意:有的App ID的Apple Push Notification service列是灰色的,并且不允许使用Configure按钮,这是因为APNS不支持带通配符的App ID。

到现在为止,我们已经生成了三个文件:

1、Push.certSigningRequest

2、Push.p12

3、aps_developer_identity.cer

在项目的AppDelegate中的didFinishLaunchingWithOptions方法中加入下面的代码:

Ios代码收藏代码
  1. [[UIApplicationsharedApplication]registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge)];

通过registerForRemoteNotificationTypes方法,告诉应用程序,能接受push来的通知。

在项目的AppDelegate中添加下面的方法来获取deviceToken:

Ios代码收藏代码
  1. -(void)application:(UIApplication*)appdidRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{
  2. NSString*token=[NSStringstringWithFormat:@"%@",deviceToken];
  3. NSLog(@"Mytokenis:%@",token);
  4. }
  5. -(void)application:(UIApplication*)appdidFailToRegisterForRemoteNotificationsWithError:(NSError*)error{
  6. NSString*error_str=[NSStringstringWithFormat:@"%@",error];
  7. NSLog(@"Failedtogettoken,error:%@",error_str);
  8. }

获取到的deviceToken,我们可以提交给后台应用程序,发送通知的后台应用程序除了需要知道deviceToken之外,还需要一个与APNS连接的证书。

这个证书可以通过我们前面生成的两个文件中得到。

1、将aps_developer_identity.cer转换成aps_developer_identity.pem格式

Shell代码收藏代码
  1. opensslx509-inaps_developer_identity.cer-informDER-outaps_developer_identity.pem-outformPEM

2、将p12格式的私钥转换成pem

Shell代码收藏代码
  1. opensslpkcs12-nocerts-outPush_Noenc.pem-inPush.p12

3、创建p12文件

Shell代码收藏代码
  1. opensslpkcs12-export-inaps_developer_identity.pem-inkeyPush_Noenc.pem-certfilePush.certSigningRequest-name"aps_developer_identity"-outaps_developer_identity.p12

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

如果后台应用是php的话,那么可以按照iOS消息推送机制中pem文件的生成这篇文章中的方法来生成php后台应用程序中使用的证书文件:ck.pem

注意:有的App ID的Apple Push Notification service列是灰色的,并且不允许使用Configure按钮,这是因为APNS不支持带通配符的App ID。

到现在为止,我们已经生成了三个文件:

1、Push.certSigningRequest

2、Push.p12

3、aps_developer_identity.cer

在项目的AppDelegate中的didFinishLaunchingWithOptions方法中加入下面的代码:

Ios代码收藏代码
  1. [[UIApplicationsharedApplication]registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge)];

通过registerForRemoteNotificationTypes方法,告诉应用程序,能接受push来的通知。

在项目的AppDelegate中添加下面的方法来获取deviceToken:

Ios代码收藏代码
  1. -(void)application:(UIApplication*)appdidRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{
  2. NSString*token=[NSStringstringWithFormat:@"%@",deviceToken];
  3. NSLog(@"Mytokenis:%@",token);
  4. }
  5. -(void)application:(UIApplication*)appdidFailToRegisterForRemoteNotificationsWithError:(NSError*)error{
  6. NSString*error_str=[NSStringstringWithFormat:@"%@",error];
  7. NSLog(@"Failedtogettoken,error:%@",error_str);
  8. }

获取到的deviceToken,我们可以提交给后台应用程序,发送通知的后台应用程序除了需要知道deviceToken之外,还需要一个与APNS连接的证书。

这个证书可以通过我们前面生成的两个文件中得到。

1、将aps_developer_identity.cer转换成aps_developer_identity.pem格式

Shell代码收藏代码
  1. opensslx509-inaps_developer_identity.cer-informDER-outaps_developer_identity.pem-outformPEM

2、将p12格式的私钥转换成pem

Shell代码收藏代码
  1. opensslpkcs12-nocerts-outPush_Noenc.pem-inPush.p12

3、创建p12文件

Shell代码收藏代码
  1. opensslpkcs12-export-inaps_developer_identity.pem-inkeyPush_Noenc.pem-certfilePush.certSigningRequest-name"aps_developer_identity"-outaps_developer_identity.p12

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

如果后台应用是php的话,那么可以按照iOS消息推送机制中pem文件的生成这篇文章中的方法来生成php后台应用程序中使用的证书文件:ck.pem





分享到:
评论

相关推荐

    .net ios 消息推送机制和服务

    以.net作为服务器开发对ios端进行消息推送的服务机制。其中有server和test。再按照说明把密钥和p12文件在Jdsoft.Apple.Apns.Notifications中做下调整。

    iOS APP签名机制原理详解

    在iOS出来之前,主流的操作系统(MacOS/Windows)软件随便从哪里下载都能运行,系统安全存在隐患,盗版软件、病毒入侵、静默安装等等,苹果希望解决类似的问题,保证在iPhone iOS上的APP都是经过苹果官方允许的,...

    iOS推送开发中,服务器端的代码

    iOS开发推送机制的时候,需要一个服务器向苹果APNS服务器发请求,配合iOS程序员测试,这个工程就是服务器端的,直接下载下来,放到eclipse里面运行。当然,你需要替换里面的deviceToken, 密码,还有你的APNS证书。...

    push:推送服务,使用开源的gopush框架,基于akka实现的高性能推送服务。ios会推送到apns,wp推送到microsoft的推送服务器上,支持分布式

    ios会推送到apns,wp推送到microsoft的推送服务器上,支持分布式##特性1、轻量级,完全依赖akka2、高性能3、纯scala实现,部分方法使用java4、支持设置过期机制(用于gopush推送)5、支持client消息发送失败重传机制...

    详解IOS开发之实现App消息推送(最新)

    好久没有写过博客啦,...首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图。 Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Pu

    本地推送以及APNS推送push

    详细的介绍了关于iOS本地推送的原理,以及苹果服务器和客户端交互的机制.

    iPhone消息推送机制实现与探讨

    最近两天在研究ios的消息推送机制。研究这个东西,还是充满兴趣的。Push的工作机制可以简单的概括为下图图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。APNS是...

    H5P.Core:HTML5 plus运行时

    H5P.CoreHTML5plus Runtime,...目录结构Android: Android版本iOS: iOS版本js: js开发步骤iOS平台:Android平台:插件实现支付宝插件 ()百度地图插件 ()条码扫描插件 ()Audio插件 ()个推push ()License遵循MIT License;

    Android-app.rar

    Android Push it单机版事件管理APP Android RecycleView+任意头尾布局+拖拽换位+拖拽删除demo Android sql练习合集 Android 仿12306 Android 优秀计步器 Android 体重计算源码 Android 使用Gallery_tabhost实现标签...

    【Egret Engine v5.4.0】HTML5开源免费游戏框架+极强的跨平台运行能力

    源码简介与安装说明: 软件介绍 ... ... Egret框架是一个基于BSD开源协议许可的永久免费的项目!你可以在项目中随意使用且修改它,并且拥有100%的控制权。你可以从Egret的 ...Push game forward!是Egret游戏框架的口号。

    Egret Engine游戏框架-其他

    ... Egret框架是一个基于BSD开源协议许可的永久免费的项目!你可以在项目中随意使用且修改它,并且拥有100%的控制权。你可以从Egret的 Github网站获取它的源代码,从而了解...Push game forward!是Egret游戏框架的口号。

Global site tag (gtag.js) - Google Analytics