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

http://blog.csdn.net/daydreamingboy/article/details/7977098

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)

HelloRemoteNotification.p12-> HelloRemoteNotificationKey.pem

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

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

[php] view plaincopy

  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);

注意:修改下面两行代码

[php] view plaincopy

  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

时间: 2024-10-24 13:55:46

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

iOS推送通知(Push Notification)的Erlang实现

本文来自:瑞仙的Erlang开发博客 原文链接:http://blog.csdn.net/zhongruixian/article/details/39528765 一.前言 关于cer/pem证书转换,网上很多资料,我这就不说了, 网上有PHP实现的Push Notification,可以参考, 为了更好的做PUSH服务定制,我这里以Erlang(gen_server)实现iOS Push Notification 二.协议 1.协议分析 表1 名称 长度 描述 Command 1 字节 固定

iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送、本地推送

iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送本地推送 2015-05-03 14:12 3510人阅读 评论(0) 收藏 举报 本文章已收录于:  iOS知识库  分类: [IOS -事件响应者链](3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可见的 推送通知是可见的(能用肉眼看到) iOS中提供了2种推送通知 本地推送通知(L

iOS开发 - ANPs推送通知

推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可见的 推送通知是可见的(能用肉眼看到) iOS中提供了2种推送通知 本地推送通知(Local Notification) 远程推送通知(Remote Notification) 推送通知的呈现效果总结 总结一下,推送通知有5种不同的呈现效果 在屏幕顶部显示一块横幅(显示具体内容) 在屏幕中间弹出一个UIAlertView(显示具体内容) 在锁屏界面显示一块横幅(锁屏状态下,显示具体内

苹果iOS APNS消息推送通知

参考链接: http://www.tairan.com/archives/194 http://www.tairan.com/archives/240 https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ProvisioningDevelopment.html#//apple_ref/doc/uid/TP40008194

ios如何实现推送通知

推送通知的步骤:1.询问是否允许推送通知.2.如果用户允许在APPDELEGATE 中实现 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{ } 3.将token发送到服务器上 4.服务器收到toke后 发送推送通知,客户端相应该推送同通知 代码如下: [cpp] view plaincopy //每次唤醒

iOS 玩转推送通知

转自:http://www.cocoachina.com/ios/20160316/15665.html 前言 推送通知,想必大家都很熟悉,关于原理之类的,这里就不过多阐述.在这里我们主要介绍下iOS8及iOS9之后关于推送的新功能.大家可能见过听说过,但可能有一些朋友并没有上手做过.这篇文章便给大家详细介绍推送中的快捷按钮及快捷回复等功能的实现. 快捷点赞,如微博点赞功能 效果图大家可以先看下: 首先先说如何为自己的推送添加快捷功能,该Demo中的动作 “赞”,代码如下: //创建消息上面要添

APNS 远程推送通知 PUSH deviceToken

服务器向客户端推送消息: 当应用程序推到后台,或者根本就没有运行(我们的代码无能为力)      如果这种情况之下,应用程序想和用户交互(传统的做法 不可能) 推送 APNS:Apple Push Notification Service deviceToken:标示某一台iPhone上的某一个应用程序 1.(用户必须确认需要收到推送消息)注册远程通知中心向APNS获取64位的字符串deviceToken 注册远程通知中心 [[UIApplication sharedApplication] r

iOS开发中通知(Notification)快速入门及推送通知实现教程

iOS开发中通知(Notification)快速入门及推送通知实现教程 标签: NSNotificationCenterNSNotification 2016-11-14 00:18 232人阅读 评论(0) 收藏 举报  分类: iOS(400)  转载自:http://www.111cn.NET/sj/ios8/90190.htm 通知(Notification)是开发框架中观察者模式的一种实现方式,内部的实现机制由Cocoa框架支持,通常用于试图控制器和数据模型的交互.通过通知,可以向一个

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

推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification):手机应用本身的通知,比如:闹铃 远程推送通知:(Remote Notification)从服务器发送过来的通知 推送通知的作用:让不在前台运行的App,告知用户App内部发生了什么事情.比如我们正在聊微信,突然界面上面出现了黑色半透明横幅(QQ好友给你发送的消息)这就是一个推送通知. 推送通知的呈