iOS上简单推送通知(Push Notification)的实现

时间:2023-12-09 13:19:01

iOS上简单推送通知(Push Notification)的实现

根据这篇很好的教程(http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12),结合自己的实践,写下一点笔记,仅供参考:)

由于篇幅较长,我列出简单的目录,如下

1) 理解Apple推送通知的机制

2) 创建App ID

3) 创建CSR文件

4) 创建Provisioning Profile文件

5) Xcode工程中取得Device Token

6) 创建.pem文件

7) 编写PHP服务器代码,发送通知

1、理解Apple推送通知的机制

iOS上简单推送通知(Push Notification)的实现

从上面的流程图中,可以看到一个能接收推送通知的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

iOS上简单推送通知(Push Notification)的实现

点击“New App ID”按钮后,如下

iOS上简单推送通知(Push Notification)的实现

Description的内容可以任意,Bundle Identifier (App ID Suffix)必须和创建App工程时的Bundle Identifier,如下

iOS上简单推送通知(Push Notification)的实现

点击“Submit”后,点击左侧导航中的“App IDs”,找到刚才新创建的App ID,如下

iOS上简单推送通知(Push Notification)的实现

点击“Configure”后,如下

iOS上简单推送通知(Push Notification)的实现

勾选“Enable for Apple Push Notification service”,然后点击红色的“Configure”按钮,这里暂时只针对Development取得证书。弹出一个对话框,如下

iOS上简单推送通知(Push Notification)的实现

点击“Continue”后,要我们上传一个CSR文件,如下

iOS上简单推送通知(Push Notification)的实现

下面使用钥匙串访问(KeychainAccess)应用程序创建上面需要的CSR文件(.certSigningRequest文件)

3、创建CSR文件

Keychain Access位于/Applications/Utilities目录中,打开它如下

iOS上简单推送通知(Push Notification)的实现

然后弹出窗口如下。

iOS上简单推送通知(Push Notification)的实现

UserEmail Address随意写就可以,Common Name也是一样,注意勾选“Save to disks”,然后点击“Continue”。很快就生成好了所需文件,去找到它。

iOS上简单推送通知(Push Notification)的实现

回到下面的网页中,上传刚才用KeychainAccess产生的HelloRemoteNotification.certSigningRequest文件。

iOS上简单推送通知(Push Notification)的实现

很快需要的证书就OK了,如下

iOS上简单推送通知(Push Notification)的实现

点击“Continue”,然后点击“Done”。

iOS上简单推送通知(Push Notification)的实现

发现上面的Status是Enabled,而且多了“Download”按钮,点击它,下载了一个名为“aps_development.cer”的文件。双击打开它,

iOS上简单推送通知(Push Notification)的实现

找到上图中“Keys”栏中名为“HelloRemoteNotification”的private key(注意是private key,而不是public key),右击它,选择“Export “HelloRemoteNotification”…”,这样会导出一个.p12文件(需要输入密码),如下(目前共有3个文件)

iOS上简单推送通知(Push Notification)的实现

下面开始用刚才产生的.p12文件,创建Profile provision文件

4、创建ProvisioningProfile文件

iOS上简单推送通知(Push Notification)的实现

在上图中,点击“New Profile”按钮后,如下

iOS上简单推送通知(Push Notification)的实现

填写“Profile Name”;勾选“Certificate”;“App ID”选择正确的、之前我们创建的ID,即PushNotification;最后关联需要测试真机设备。点击“Submit”,如下

iOS上简单推送通知(Push Notification)的实现

可以看到多了一个Provisioning Profile文件,点击“Download”按钮下载它,这时我们一共产生4个文件,如下

iOS上简单推送通知(Push Notification)的实现

双击“PushNotification.mobileprovision”文件,或把它拖入到Xcode中。

iOS上简单推送通知(Push Notification)的实现

在Xcode中,找到Code Signing项,如上图,将Debug一项配置成刚才拖入Provisioning Profile对应的iPhone Developer。

5、Xcode工程中取得Device Token

iOS上简单推送通知(Push Notification)的实现

在application:didFinishLaunchingWithOptions:方法里,注册使用远程通知。

iOS上简单推送通知(Push Notification)的实现

添加2个方法,application: didRegisterForRemoteNotificationsWithDeviceToken:和application:didFailToRegisterForRemoteNotificationsWithError:,用于取得Device Token和打印错误。运行我们建的HelloRemoteNotification工程,如果以上步骤都正确,应该打印出Device Token,如下

iOS上简单推送通知(Push Notification)的实现

也可能出错如下

iOS上简单推送通知(Push Notification)的实现

6、创建.pem文件

  • 将已有的.cer文件转成.pem文件
  • 将已有的.p12文件转成.pem文件(需要输入密码)
  • 最后将上面2个.pem文件合并成1个.pem文件(需要输入新密码)

iOS上简单推送通知(Push Notification)的实现

aps_development.cer->HelloRemoteNotification.pem(下面改名为HelloRemoteNotificationCert.pem)

openssl x509 -in aps_development.cer -inform der -out aps_development.cer.pem

HelloRemoteNotification.p12-> HelloRemoteNotificationKey.pem

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

iOS上简单推送通知(Push Notification)的实现

HelloRemoteNotification.pem +HelloRemoteNotificationKey.pem合并成ck2.pem

7、编写PHP服务器代码,发送通知

  1. <?php
  2. // Put your device token here (without spaces):
  3. $deviceToken = '<Xcode控制台输出的Device Token>';
  4. // Put your private key's passphrase here:
  5. $passphrase = '<最后输入的密码>';
  6. // Put your alert message here:
  7. $message = 'My first push notification!';
  8. ////////////////////////////////////////////////////////////////////////////////
  9. $ctx = stream_context_create();
  10. stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck2.pem');
  11. stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
  12. // Open a connection to the APNS server
  13. $fp = stream_socket_client(
  14. 'ssl://gateway.sandbox.push.apple.com:2195', $err,
  15. $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
  16. if (!$fp)
  17. exit("Failed to connect: $err $errstr" . PHP_EOL);
  18. echo 'Connected to APNS' . PHP_EOL;
  19. // Create the payload body
  20. $body['aps'] = array(
  21. 'alert' => $message,
  22. 'sound' => 'default'
  23. );
  24. // Encode the payload as JSON
  25. $payload = json_encode($body);
  26. // Build the binary notification
  27. $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
  28. // Send it to the server
  29. $result = fwrite($fp, $msg, strlen($msg));
  30. if (!$result)
  31. echo 'Message not delivered' . PHP_EOL;
  32. else
  33. echo 'Message successfully delivered' . PHP_EOL;
  34. // Close the connection to the server
  35. fclose($fp);

注意:修改下面两行代码

  1. $deviceToken = '<Xcode控制台输出的Device Token>';
  2. // Put your private key's passphrase here:
  3. $passphrase = '<最后输入的密码>';
  4. ......
  5. ......
  6. stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck2.pem');

运行上面的php脚本,如下

iOS上简单推送通知(Push Notification)的实现

可以看到iPad上面收到的推送通知,如下,表示实践成功!

iOS上简单推送通知(Push Notification)的实现

参考资料:

1、http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12