文档章节

APNS远程推送证书的申请和制作——详细解析

lady-奕奕
 lady-奕奕
发布于 2014/08/04 17:57
字数 2098
阅读 7816
收藏 11

在ios中,通知有两种(提醒轰炸的来源):

     第一种是本地通知(UILocalNotification,这一种不需要申请推送证书,也不需要向程序注册,直接使用,这一种不是本文讨论的范围。

     第二种是APNS远程推送——远程通知(UIRemoteNotification),这个不仅需要向程序注册,也需要在开发者账号里申请推送证书,下面来介绍一下如何注册和申请证书。

一、远程推送的原理

先看下面一幅图(图片来源于无线互联):


可以看出,远程推送的过程分为6步,下面为大家简单讲解一下:

     第一步是在程序上注册远程通知,这是通知的前提程序员的工作),注册好后,当用户下载完我们的应用并打开时,app会弹出一个alertView,问是否允许该应用像你发送通知,如下图:


     当用户选择“好”之后,ios 这个操作系统将会告诉APNS这个服务器,这样一来,当程序运行时,apns就会给程序发送那一台设备的 device token(唯一),这时候要做的操作就是获取这个token值(appDelegate的代理方法),并将这个token值发送到公司的服务器上去,让他存储下来。如果用户选择“不允许”,ios 这个操作系统将不会告诉apns这个服务器,那么到这一步也就完结了。

     我们的服务器拿到token值后也不是随意就能向设备发送推送的,还需要一个证明身份的文件——推送证书,有了这个推送证书后,当有事情发生时,服务器便可以主动向用户发送远程推送了

     下面来讲解一下这个过程

二、在程序上注册远程通知

   在 didFinishLaunchingWithOptions 里写上 :

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound];
    
    //后面的具体操作省略,程序员们可自由发挥
}


这样写就是会提醒,在程序上显示通知数,推送的过程中有铃声。


通过:

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

代理方法来获取 device token,在这里,一般进行的是post请求,将deviceToken值发给服务器

注意:我们拿到的deviceToken 是带有空格的,交给服务器时,我们要将空格去掉(这也可以交给服务器来做)


当收到远程通知时,将调用如下代理方法:

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

   //这里书写的代码应该可以让程序进入到相关的页面


}



三、申请推送证书

1、申请本地证书:

选择 :

    ——>         ——>   

点击“钥匙串访问”

然后选择“从证书颁发机构请求证书,如图:


看到如下界面,邮箱填一个你自己的:


这边名字随便起一个


然后点击继续在桌面上就生成了一个证书了(申请一个就足够了):


2、在开发者网站上申请证书

打开99美元开发者账号,进入到申请证书的页面:


点击“证书”:



选择App IDs

找到你想发送远程推送的那一个App ID,点击它:


点击"edit” 进行编辑,看到如下界面:


将Push Notifications 的 “” 勾上,选择下面的 “Create Certification” ,将刚刚申请的本地证书上传上去:


点击Continue :


最后将其下载下来,这里只示范开发证书,不示范发布证书的申请了,两个证书都申请好了之后,再次点击“edit”可以看到如下界面:

到这里,申请证书的工作就算完成了。


四、申请描述文件(开发和发布描述文件)

下面以开发描述文件为例,发布描述文件步骤相同

如图,选择申请开发描述文件:



这里要选择我们用于推送的app 的app id


选择”continue“ 选择证书



将设备全部选上 


最后给描述文件起一个名字,并下载下来

点击生成后,下载双击安装就完成了。


五、为服务器制作证书

1、准备p12文件

下面只制作push开发证书,push 发布证书的制作过程是一样的,不同之处,下文会说明。

双击点击刚刚安装的下载的证书,这样证书就进去到钥匙串里面去了,在钥匙串的中找到那一个证书,将其导出为.p12文件,如图:


最好建立一个文件夹将所有的证书放在同一个地方,因为最后生成的证书也是在那个位置,给p12取一个名字,存到指定文件夹中:


点击“存储”之后要输入一个密码,这个密码随便输一个,但是要记住,因为在接下来的步骤中要用得上

在桌面上建立了一个叫“通知”的文件夹,里面放着所有的证书,如图:


这样p12就准备好了


2、将下载的证书制作成.pem 文件

打开终端应用程序,访问到你证书存放的那个目录下(如访问到桌面“通知”文件夹,在终端输入:

cd /Users/aec/Desktop/通知  ):


输入后敲回车

进到文件夹目录后,输入以下命令将证书转换成.pem文件:

openssl x509 -in 证书名字.cer -inform der -out push_developer_cer.pem

如图:


可以看到文件夹里多了一个.pem文件:


3、将.p12 证书制作成.pem文件

在终端输入:

openssl pkcs12 -nocerts -out pushKey.pem -in p12名字.p12


如图:

敲入回车后,会让你输入p12的密码,这个密码你输出来数看不见的,但是你确实输了,输完后在敲回车

接下来会让你输入两次新生成的.pem文件的密码,这个密码也是看不见的(这个密码以后要给服务器使用,要牢记)如图:

可以看到,文件夹又生成了一个新的文件:pushKey.pem


4、合并两个.pem文件

将上述新产生的文件合并,在终端输入命令后敲回车:

cat 下载证书生成的.pem p12生成的.pem > 最终证书的名字.pem

如图:

可以看到,文件夹又生成了一个新的文件:final_Push_developer.pem(这个密码要记住是pushKey.pem生成时要输入的密码,密码需要给到服务器


5、测试证书是否有效

在终端输入(开发用的验证):

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert 下载证书生成的.pem -key p12生成的.pem


如果是发布证书的验证,输入:

openssl s_client -connect gateway.push.apple.com:2195 -cert 下载证书生成的.pem -key p12生成的.pem


之后会让你输入密码,输入密码后,会有大量openssl消息,当你任意输入几个字符时,服务器会提示断开

如图:


以上省略若干行后出现下图:

这时候你就可以把final_Push_developer.pem 和相应的密码 交给服务器端了,告诉他们这个证书是没有问题的


六、php 的服务端实现的代码:

以下php代码可以直接交给服务器,或者让他们自己写都可以

<?php  
    $deviceToken= 'da6d8206503c8e62e68b5df1b36c3b58ced1588c6dabe0fc9e6828961aeb36d9'; //没有空格  
    $body = array("aps" => array("alert" => '推送的内容',"badge" => 1,"sound"=>'default'));  //推送方式,包含内容和声音  
    $ctx = stream_context_create();  
    
    //如果在Windows的服务器上,寻找pem路径会有问题,路径修改成这样的方法:  
    //$pem = dirname(__FILE__) . '/' . 'apns-dev.pem';  
    //linux 的服务器直接写pem的路径即可  
    
    stream_context_set_option($ctx,"ssl","local_cert","26ck.pem");  
    $pass = "123123";  
    stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);  
    
    //此处有两个服务器需要选择,如果是开发测试用,选择第二名sandbox的服务器并使用Dev的pem证书,如果是正是发布,使用Product的pem并选用正式的服务器  
   // $fp = stream_socket_client("ssl://gateway.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
    $fp = stream_socket_client("ssl://gateway.sandbox.push.apple.com:2195", $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
    
    if (!$fp) {  
        echo "Failed to connect $err $errstrn";  
        return;  
    }  
    
    print "Connection OK\n";  
    $payload = json_encode($body);  
    
    //这边可以弄一个循环实现多个deviceToken 值,这里暂用一个token值得方法
    $msg = chr(0) . pack("n",32) . pack("H*", str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload;  
    echo "sending message :" . $payload ."\n";  
    fwrite($fp, $msg);  
    fclose($fp);
?>


© 著作权归作者所有

lady-奕奕
粉丝 254
博文 34
码字总数 39252
作品 0
松江
私信 提问
加载中

评论(10)

夏日的雨
服务器是用C写的该怎么弄呢
lady-奕奕
lady-奕奕 博主

引用来自“zjj199332”的评论

五、为服务器制作证书
2、将下载的证书制作成.pem 文件
这步中为什么要将aps_production.cer转换成.pem文件,你明明说是做push开发证书的啊,production不是发布的吗
哦,不好意思,手误了,谢谢提醒
z
zjj199332
五、为服务器制作证书
2、将下载的证书制作成.pem 文件
这步中为什么要将aps_production.cer转换成.pem文件,你明明说是做push开发证书的啊,production不是发布的吗
lady-奕奕
lady-奕奕 博主

引用来自“杨逸”的评论

非常靠谱!已经解决问题,感谢!
嘿嘿,不客气
杨逸
非常靠谱!已经解决问题,感谢!
china_ludawei
china_ludawei
靠谱,收藏了~
tyljohnny
tyljohnny
写得很详细,赞一个
快放开那女孩
快放开那女孩
高大上 啊
芳仔小脚丫
芳仔小脚丫
哇咔咔,妈妈再也不用担心我不会制作通知证书拉
笨鸟飞飞
学习了
分分钟搞定IOS远程消息推送

分分钟搞定IOS远程消息推送 一、引言 IOS中消息的推送有两种方式,分别是本地推送和远程推送,本地推送在http://my.oschina.net/u/2340880/blog/405491这篇博客中有详细的介绍,这里主要讨论...

珲少
2015/05/12
7.3K
9
Xcode8下快速集成极光推送并兼顾iOS10

前言 iOS10下,远程推送发生了变化,新增的将本地推送和远程推送整合在一起。 最近刚刚更新了Xcode8,自动创建证书和配置文件确实方便许多。琰君分享下以开发环境为例(非生产环境)在Xcode...

-Man
2016/10/27
695
1
远程推送IOS

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

海二少
2016/03/05
124
0
iOS开发,推送消息 steps

概述:推送过程简介 一、App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请。若注册成功,回调函数application:(...

召唤攻城狮
2015/03/30
631
2
IOS中使用本地通知为你的APP添加提示用户功能

IOS中使用本地通知为你的APP添加提示用户功能 一、我们可以通过本地通知做什么 通知,实际上是由IOS系统管理的一个功能,比如某些后台应用做了某项活动需要我们处理、已经退出的应用在某个时...

linweida
2016/09/28
30
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
687
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
39
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
25
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
74
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
昨天
72
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部