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推送通知的机制

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

点击“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目录中,打开它如下

然后弹出窗口如下。

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

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

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

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

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

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

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

4、创建ProvisioningProfile文件

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

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

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

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

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

5、Xcode工程中取得Device Token

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

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

也可能出错如下

6、创建.pem文件

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

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

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脚本,如下

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

参考资料:

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

iOS上简单推送通知(Push Notification)的实现的更多相关文章

  1. 转:向IOS设备发送推送通知

    背景 SMS 和 MMS 消息是由无线运营商通过设备的电话号码向特定设备提供的.实现 SMS/MMS 的服务器端应用程序的开发人员必须费大量精力才能与现有的封闭电信基础架构进行交互(其中包括获取电话号 ...

  2. ios如何实现推送通知

    推送通知的步骤:1.询问是否允许推送通知.2.如果用户允许在APPDELEGATE 中实现 - (void)application:(UIApplication *)application didRe ...

  3. APNS 远程推送通知 PUSH deviceToken

    服务器向客户端推送消息:      当应用程序推到后台,或者根本就没有运行(我们的代码无能为力)      如果这种情况之下,应用程序想和用户交互(传统的做法 不可能)      推送 APNS:Ap ...

  4. iOS 玩转推送通知

    转自:http://www.cocoachina.com/ios/20160316/15665.html 前言 推送通知,想必大家都很熟悉,关于原理之类的,这里就不过多阐述.在这里我们主要介绍下iOS ...

  5. 【读书笔记】iOS网络-使用推送通知

    一,本地通知 本地通知有64位的最大限制.虽然,你依然可以调度通知,不过到到达的通知数被限定为接近64个,并且按照fireDate的顺序排序,系统会忽略掉其余的通知.这意味着如果现在有64个调用的本地 ...

  6. 推送通知iOS客户端编写实现及推送服务器端编写

    http://blog.csdn.net/tonny_guan/article/details/8963262 1.iOS客户端编程 推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主 ...

  7. iOS 远程推送通知

    1.什么是推送通知 在某些特殊情况下,应用程序被动收到的以不同种界面形式出现的提醒信息 推送通知的作用:可以让不在前台运行的app通知app发生了改变 iOS中得推送通知种类 远程推送通知(Remot ...

  8. IOS之推送通知(本地推送和远程推送)

    推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...

  9. iOS远程消息推送

    iOS 推送基础知识 Apple 使用公共密钥数字证书对来自 iOS 应用程序的推送请求进行身份验证,所以您首先需要创建身份验证密钥,并向 Apple 注册它们.我将在下一节中花相当长的篇幅来直接介绍 ...

随机推荐

  1. css 清除浮动最佳方法!

    .clear:after{content:'\0020';display:block;height:0;clear:both} .clear{*zoom:1}

  2. netcat使用

    一.端口监听(实时消息) 首先在A计算机上,它充当的是服务器角色,$ nc -l 3333 这时就创建了一个监听端口(listening socket(server)).- -l 它让 nc 监听一个 ...

  3. ORACLE 日常处理办法

    Oracle删除当前用户下所有的表的方法 1.如果有删除用户的权限,则可以: drop user user_name cascade; 加了cascade就可以把用户连带的数据全部删掉. 删除后再创建 ...

  4. C#中 字符串转换为计算公式

    //方法一 利用DataTable中的Compute方法 例如:1*2-(4/1)+2*4=6 string formulate = string.Format("{0}*{1} - {2} ...

  5. KinectV2+Ubuntu 14.04+Ros 安装教程

    前言 个人理解错误的地方还请不吝赐教,转载请标明出处,内容如有改动更新,请看原博:http://www.cnblogs.com/hitcm/ 如有任何问题,feel free to contact m ...

  6. Javascript 截取2位小数

    今天在处理数据时,前台界面金额需要保留两位小数,所以只能使用Javascript 来进行截取. var regex = /([0-9]+\.[0-9]{2})[0-9]*/; var localMon ...

  7. 【C#】Excel做的数据表、SQLParameter代码生成工具

    转载请注明出处http://www.cnblogs.com/Vulpers/ 做了一个小的代码生成工具,用于新建数据表时能够快速生成一些重复性很高的代码,目前仅支持SqlServer数据库及C#语言, ...

  8. java定时任务实现

    在java中需要使用到定时任务是,可以通过quartz来实现.

  9. JSNO

    JSON 编辑 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了 ...

  10. Three ways to set specific DeviceFamily XAML Views in UWP

    Three ways to set specific DeviceFamily XAML Views in UWP http://igrali.com/2015/08/02/three-ways-to ...