?
?1、Push 的原理:
Push 的工作机制可以简单的概括为下图
?
图中,Provider 是指某个 iPhone 软件的 Push 服务器,这篇文章我将使用.net 作为 Provider。
APNS 是 Apple Push Notification Service(Apple Push 服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段:.net 应用程序把要发送的消息、目的 iPhone 的标识打包,发给 APNS。
第二阶段:APNS 在自身的已注册 Push 服务的 iPhone 列表中,查找有相应标识的 iPhone,并把消息发到 iPhone。
第三阶段:iPhone 把发来的消息传递给相应的应用程序, 并且按照设定弹出 Push 通知。
?
?
从上面的流程图中,可以看到一个能接收推送通知的 App,需要 3 个东西:
从上面的流程图中,可以看到一个能接收推送通知的 App,需要 3 个东西:
? App ID(唯一标识一个 App 程序)
? Provisioning Profile(App 程序的发布需要它,所以推送通知只能在真机上测试)
? Device Token(设备标识,这个是推送通知功能中特有的)
而能推送通知的服务器端则要 2 个东西:
? SSL Certificate
? Private Key
值得注意的是 APNS(ApplePush Notification Service) Server,完成发送 Device Token 和通知内容的功
能,而且这 2 个动作都是被动的,即第一个动作是由 App 发起的,第二个则是推送通知的服务器发起的。
2、创建 App ID
首先,登录到 http://developer.apple.com/devcenter/ios/index.action 购买 iPhone Develop Progra
m(iDP),如果已经购买登录进去后,页面右上角会看到如下图所示的页面:
点击第一项:iOS Provisioning Portal,然后会看到下面的页面:
点击进入 Certificates,然后看到如下所示的页面:
点击图中的 click here to download now,这会下载下来一个 AppleWWDRCA.cer 文件,这是调试以及发
布 iOS 应用必须的一个文件,这个文件只要下载一次就够了,即使你有多个 iDP,无论是调试程序,还是发布
程序,也只需要一个。如果已经下载过,那么就不用再下载这个了
点击“New App ID”按钮后,如下
Description 的内容可以任意,Bundle Identifier (App ID Suffix)必须和创建 App 工程时的 Bundle
Identifier,如下
点击“Submit”后,点击左侧导航中的“App IDs”,找到刚才新创建的 App ID,如下
点击“Configure”后,如下
勾选“Enable for Apple Push Notification service”,然后点击红色的“Configure”按钮,这里暂时只针对Development 取得证书。弹出一个对话框,如下
?
点击“Continue”后,要我们上传一个 CSR 文件,如下
?
下面使用钥匙串访问(KeychainAccess)应用程序创建上面需要的 CSR 文件(.certSigningRequest 文
件)
3、创建 CSR 文件
Keychain Access 位于/Applications/Utilities 目录中,打开它如下
然后弹出窗口如下:
?
点击继续:
?
?
点击存储:
?
?
?
然后,点击继续,这时就会在你的桌面上生成一个 CertificateSigningRequest.certSigningRequest 文件.
?
?
回到下面的网页中,上传刚才用 KeychainAccess 产生的 HelloRemoteNotification.certSigningRequest文件。
?
很快需要的证书就 OK 了,如下
?
点击“Continue”,然后点击“Done”。
?
发现上面的 Status 是 Enabled,而且多了“Download”按钮,点击它,下载了一个名为
“aps_development.cer”的文件。双击打开它
找到上图中“Keys”栏中名为“HelloRemoteNotification”的 private key(注意是 private key,而不是
public key),右击它,选择“Export “HelloRemoteNotification”...”,这样会导出一个 push.p12 文件
(需要输入密码),如下(目前共有 3 个文件)
下面开始用刚才产生的 push.p12 文件,创建 Profile provision 文件
接着,打开 Devices 那一项,出来如下图所示页面:
点击右上角的 Add Devices,出现下图所示页面:
给自己的设备取个名字,例如:iPhone,Device ID 就是设备的机身号(40 位),机身号可以通过 Xcode 的
window 菜单下的 Organizer 来获得。填写完了以后,点击 Submit 就可以了。
99 美元的帐号允许绑定 100 台移动设备。
4、创建 ProvisioningProfile 文件
在上图中,点击“New Profile”按钮后,如下
填写“Profile Name”;勾选“Certificate”;“App ID”选择正确的、之前我们创建的 ID,即
PushNotification;最后关联需要测试真机设备。点击“Submit”,如下
可以看到多了一个 Provisioning Profile 文件,点击“Download”按钮下载它,这时我们一共产生 4 个文件,
如下
双击“PushNotification.mobileprovision”文件,或把它拖入到 Xcode 中。
5、创建.pem 文件
? 将已有的.cer 文件转成.pem 文件
? 将已有的.p12 文件转成.pem 文件(需要输入密码)
? 最后将上面 2 个.pem 文件合并成 1 个.pem 文件(需要输入新密码)
cd 进入证书所在目录
把.cer 文件转换成.pem 文件:
?
$ openssl x509 -in aps_developer_identity.cer -inform der -out PushChatCert.pem
?
把私钥 Push.p12 文件转换成.pem 文件:
?
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
?
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying – Enter PEM pass phrase:
你首先需要为.p12 文件输入 passphrase 密码短语,这样 OpenSSL 可以读它。然后你需要键入一个新的密码短语来加密 PEM 文件。还是使用”pushchat”来作为 PEM 的密码短语。你需要选择一些更安全的密码短语。
注意:如果你没有键入一个 PEM passphrase,OpenSSL 将不会返回一个错误信息,但是产生的.pem 文件里面将不会含有私钥。
最后。把私钥和证书整合到一个.pem 文件里:
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
为了测试证书是否工作,执行下面的命令:
$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is ‘^]’.
它将尝试发送一个规则的,不加密的连接到 APNS 服务。如果你看到上面的反馈,那说明你的 MAC 能够到
达APNS。按下 Ctrl+C 关闭连接。如果得到一个错误信息,那么你需要确保你的防火墙允许 2195 端口。
然后再次连接,这次用我们的 SSL 证书和私钥来设置一个安全的连接:
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
Enter pass phrase for PushChatKey.pem:
你会看到一个完整的输出,让你明白 OpenSSL 在后台做什么。如果连接是成功的,你可以键入一些字符。
当你按下回车后,服务就会断开连接。如果在建立连接时有问题,OpenSSL 将会给你一个错误消息,
ck.pem 文件就是我们需要得到 Push 服务器 连接 APNS 的文件。
?