转自:http://mobiforge.com/developing/story/programming-apple-push-notification-services
http://blog.csdn.net/xinx001/article/details/7445780
本地通知:http://wangjun.easymorse.com/?p=1482
基本概念:
UDID:iPhone 的程序都须要经过 App Store 下载,当某位开发者还没有发布他的程序,又想让你使用测试版。那你只须要将本身机器的 UDID 提供给开发者,由开发者将此UDID 在 Apple 注册,他就能够经过Ad-Hoc的方式直接将测试版程序发送给你,由你安装使用。而这个匹配了 UDID 的程序,也仅仅只能在你的 iPhone 上使用。
application ID(bundle identifier):用来区分app
device tokens:app在注册时候,会有一项问你是否须要apn通知,有的话,apns会返回device tokens给这个应用,device tokens至关于接收推送通知的地址。而后app会把device tokens发送给后台服务器。
在本身的mac电脑上制做本身的私钥密匙,也就是证书申请文件(CSR),你导出这个在钥匙串中的csr文件,就是以xxx.p12命名的私钥文件,
而后把这个CSR文件提交给苹果会生成一个名称为xxx.cer的SSL证书。生成证书以后的下一步是生成配置文件给xcode用
把证书和私钥合成为PEM文件。
基本框架
要让×××送通知服务正常工做,涉及不少方面,下图是一个基本框架:
应用启用推送通知功能,须要用户确认;
应用收到设备识别ID(device token),至关于接收推送通知的地址;
应用将设备识别ID发送到你开发的服务器;
当有推送通知的须要时,你就能够经过你开发的服务组件发送信息到苹果的服务器上;
×××送通知服务将信息推送到用户的设备上。
用户设备接收到推送信息时,显示提示信息或播放提示音或更新主屏图标的提示数字,用户能够从提示信息窗口打开应用程序,应用能够根据提示信息的内容做进一步的处理。
iOS4支持本地通知和后台多任务,是否咱们就不须要推送通知了呢?
答案是否认的,本地通知仅限于周期性定时事件处理,后台多任务也仅限于一些必须保持运行的应用,好比IP语音、后台音乐播放、导航等,若是你须要在你的应用关闭时提醒你的用户,你就必须使用推送通知服务
接下来,咱们来探讨一些实现×××送通知服务的技术细节,内容比较多,泡好一杯咖啡,安静认真地阅读本教程吧。
×××送通知服务的目的
在你的应用中增长×××送通知服务有如下几项准备工做:
一台iPhone或iPad,×××送通知服务不能在模拟器上工做,你必须在真机上测试;
你得有付费开通的iOS 开发者会员资格,你必须在苹果开发者门户(iOS Provisioning Portal)新增一个新的应用ID、对应的配置文件(provisioning profile)、专属于的SLL认证证书;在整个过程当中,你将建立本身的配置文件和证书,获取认证证书是很慎重的过程,必须按照规定执行,后文中有详细 的操做步骤;
一台联入互联网的服务器,×××送通知服务是在互联网上工做,开发时你能够在你的工做站上测试,可是实际使用时,你至少须要一台虚拟我的服务器, 可是要保证能够安装证书,并开放相应的端口与苹果的服务器创建安全套接字(TLS)网络链接,通常IDC虚拟空间提供商不会提供此类额外服务,请先与你的 供应商确认这些细节;
固然,还有专门提供×××送通知服务的网络服务商,你能够自行谷歌之,本文不讨论。
推送通知格式
你的服务器组件将根据事件或须要建立推送通知,你得先了解推送通知的具体格式;
一个推送通知包括设备识别ID,通知主体和一些标识字节,通知主体是咱们要发送的内容。
首先咱们得按JSON格式组织好通知主体,下面是一个最简单的示例:
{"aps":{"alert":"测试信息","sound":"default"}}
用大括号{}将键值对(字典对象)封装起来,有点像NSDictionary。
通知主体至少得包括一个项目:”aps”,这个项的内容仍是一个字典对象,在上面这个示例中,”aps”包括两个字段:alert和sound,让设备收到这个推送通知时,设备会弹出一个提示窗口,内容是测试信息,同时播放标准的提示声音。
在aps这个字段下咱们还能够自定义一些内容:
{"aps":{"alert":{"action-loc-key":"Open","body":"Hello, world!"},"badge":2}}
在这个示例中,字段”alert”也变成一个字典对象,字段”action-loc-key”从新定义弹出提示窗口中确认按钮上的文字,”badge”字段是须要在主屏图标上显示的提示数字,这个示例没有播放声音。
还有不少通知主体内容的设置方式,你能够改变播放的声音,能够根据本地语言化的调置提供本地化的提示文字,甚至于加上你自定义的字段内容。更多资料请移至官方《本地和推送通知开发指引(英)》。
出于效率的考虑,推送通知的字节长度不能超过256个字节,相似于短信或推特(微博),因此在组织JSON通知主体内容时,通常咱们都不保留换行和空格:
{"aps":{"alert":"Hello, world!","sound":"default"}}
这样已经很清楚了,不是吗,超过256个字节的推送通知,苹果的服务器但是会自动过滤掉的。
正式开始
推送通知不保证发送接收的可靠性!!??
是的,就算APNS接收发送的请求,推送通知的接收也是没有保证的。
认真考虑你的应用是否适用推送通知,如今没有办法确认推送通知发送的状态和接收与否,发送时间也没法获得保证,可能几秒也能够半小时。
并且,若是用户设备经过受限的局域网在线或处于关机状态,也是收不到推送通知的。
APNS会尝试在设备从新上线时发送最后一条推送通知,可是这种尝试不会持续太长时间,以后推送通知就永远失效了。
别期望在APNS里查找历史记录
发送推送通知的成本可能比你估计的要高!增长这个功能很简单,可是要维护一个比较大的用户群或一些特殊应用场合时,你可能须要承担较高的成本。
只要监控你网站上的更新,并发送通知到你的用户是比较简单的,可是若是你提供的功能包括自定义监控其余网站的更新时,你的服务器要可以运行得了可能远超过你估计的监控任务。
因此你还必须从维护成本上考虑你的应用是否须要这功能。
好了,理论性的东西就这么多了,如今是时候来实践一下了。在编写代码以前,你还须要在苹果的开发者门户网站上处理一些烦人的步骤。
配置文件和证书
我勒个去!
APNS须要认证证书!
要在你的应用中启用推送功能,一个对应的配置文件是必不可少的,你须要用它来跟APNS确认APP,不是吗?
配置文件和证书只能经过对应有效的苹果开发者计划成员来取得,这样才能保证只有你的服务组件才能发推送通知到你的应用。
若是你有过开发经验,你知道应用配置文件分为开发和发布两种类型,推送配置文件也有两种:
开发(Development).对应着你开发测试时用的应用配置文件
发布(Production).对应着你正式发布时用的应用配置文件
在本教程中,咱们只要关注开发配置文件便可。
准备证书申请文件(Certificate Signing Request )
还记得初次经过苹果开发者门户获取开发证书的过程吗?下面的过程你应该会以为比较熟悉。可是仍是要认真地浏览其中的细节,大多数故障问题都跟证书有关。
数字证书基于公私钥加密方式,这里咱们并不须要了解加密的过程,你只要了解数字证书老是和我的私钥文件合并使用就好了。证书是公钥的部分,用于创建基于SSL的加密网络链接,并不须要高强度的保密,而私钥不一样,这是“私的”,你须要好好地保存。
要申请数字认证,你须要先准备一个证书申请文件(CSR),准备好后会在“钥匙串”程序(MAC OS)中生成一个新的私钥项目,把证书申请文件发给证书发放方(这里是苹果开发者门户),你将能够获取一个对应的SSL证书。
在你的MAC电脑上的【应用程序/实用工具】下打开“钥匙串访问”程序(Applications/Utilities/Keychain Access),在【Keychain Access/Certificate Assistant】菜单中选择【Request a Certificate from a Certificate Authority….】
若是你没有找到这个菜单项或是提示“Request a Certificate from a Certificate Authority with key”,你还须要额外在开发者门户里下载并安装 WWDR Intermediate Certificate 。
确认没有选中窗口列表中的任何私钥,你应该能够看到如下窗口:
输入你的邮件地址,虽然有人建议说最好是跟开发资格的用户一致,可是看起来不同也没有关系。
输入PushChat(示例应用名称)在common name 项,实际上随便你填什么,只要你到时可以经过命名找到你的私钥就行。
选择【保存在本地磁盘(Saved to disk)】,将CSR保存为“PushChat.certSigningRequest”。
如今你在“钥匙串访问”程序中Keys分类下应该能够找到一个新的私钥项目,右击并选择Export。
将私钥保存为文件,保存时会提示你输入口令,命名为“PushChatKey.p12”。
为了方便在本教程里引用,我使用“pushchat” 做为口令,实际应用时应该使用高强度的密码口令。可不能忘记口令,不然后面你可能没法访问私钥文件。
准备应用ID(App ID)和SSL证书
登入苹果开发者门户。
首先,咱们先填写一个新的应用ID,每一个推送通知服务都对应着惟一的应用,在这里,你不能使用通配符。
在左项菜单中选择APP IDs,点击按钮【New App ID】。
填写以下:
Description: PushChat
Bundle Seed ID: Generate New (this is the default option)
Bundle Identifier: com.hollance.PushChat
这里你得填上本身的标识:com.yoursite.PushChat,由于你在XCODE得用一样的标识开发应用。
稍等一会,你就能够生成对应这个APP的SSL证书,你的服务组件经过这个证书也只能发送通知到这个APP。
填写完毕,你应该能够看到下列信息:
在【Apple Push Notification service】列,有两行有橙色小圆点起始的信息:【Configurable for Development】 和【Configurable for Production】。 这就意味着这个应用ID已经准备好了,接下来设置相关的选项。点击【Configure】连接。
点选【Enable for Apple Push Notification service】框,点击对应【Development Push SSL Certificate】的设置按钮 【Configure】,弹出 ×××送服务SSL证书助理(Apple Push Notification service SSL Certificate Assistant)窗口 :
首先提示你准备好证书签名申请文件,咱们上面已经准备好了,点击继续,在下一步中进行上传CSR文件的操做,选中以前生成的CSR文件而后点击生成(Generate)。
生成证书须要几秒钟,接着点继续按钮(Continue)。
下载生成的证书并保存为“aps_developer_identity.cer”。点击完成按钮(Done)关闭助理窗口返回APP ID界面。
你能够看到,咱们已经激活开发用的证书认证,若是须要你能够在这里从新下载证书,开发证书的有效期为3个月。
等你要正式发布你的应用的时候,你必须在开发认证那一项目下把这个过程从新来一遍。
备注:开发认证的证书有效期为一年,你必须在到期前从新生成一次来保证你的系统正常运行。
在本例中你不须要安装这个证书,若是你双击文件进行了安装,你能够在钥匙串访问程序中查找到,这个证书已经和私钥绑定在一块儿了。
制做PEM文件
如今咱们有三个文件:
认证签名申请文件(CSR)
私钥文件(PushChatKey.p12)
SSL证书文件(aps_developer_identity.cer)
妥善地保存好这三个文件,特别是CSR文件,在你的证书失效以后,你可能会再次用到它来申请证书。原来的私钥还能够用,只有SSL证书文件是新的。
咱们须要转换证书和私钥文件为一种经常使用格式,示例中咱们使用PHP开发服务组件,咱们须要把证书和私钥文件合并为PEM格式文件。
咱们不用关心是哪种具体的PEM编码格式(实际上我也不是很清楚),关键是PHP能够用来与服务器创建有效的网络链接,其余的编程语言可能会用到其它格式的文件。
在这里,咱们用MAC电脑的命令行工具OpenSSL来操做,打开一个“终端”(Terminal)程序:
经过cd命令转到存放三个文件的文件夹,我这里的操做是:
$ cd /Users/matthijs/Desktop
转换证书 .cer 文件到 .pem 文件格式:
$ openssl x509 -in aps_developer_identity.cer -inform der -outPushChatCert.pem
转换私钥 .p12 文件 到 .pem 文件格式:
$ openssl pkcs12 -nocerts -outPushChatKey.pem -inPushChatKey.p12
EnterImportPassword:
MAC verified OK
Enter PEM pass phrase:Verifying-Enter PEM pass phrase:
在这里,你首先要输入私钥文件的口令以便访问.p12文件,接着要求输入一次新的口令来加密新的PEM文件,这里咱们都用“pushchat” ,你也可使用更复杂的口令来保护你的私钥。
备注:若是你不输入一个6位以上的加密口令,openssl工具将给出错误信息并取消操做。
最后,咱们把这两个文件合并成一个 .pem 文件:
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
想测试一下证书是否正常,来试一下:
$ telnet gateway.sandbox.push.apple.com 2195Trying17.172.232.226...Connected to gateway.sandbox.push-apple.com.akadns.net.Escape character is'^]'.
这里是生成一个普通的网络链接,若是有上面的信息,说明你的电脑能够联上APNS服务器,按Ctrl+C关闭链接。
若是有问题,你须要检查一下网络和防火墙的端口2195的设置。
此次咱们试一试用私钥和证书进行SSL加密链接:
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195-cert PushChatCert.pem -key PushChatKey.pem
Enterpass phrase forPushChatKey.pem:
你应该能够看到接下来的整个输出,咱们已经站在正确的起跑线上了。
若是链接成功,你能够输入几个字符,当你按下回车,链接就断开了,链接失败的话也会有提示信息。
特别提示你有两个不用的APNS服务器,一个用于测试的沙盒服务器,一个用于正式使用的服务器,咱们制做的证书是用于测试的,因此上面的示例中咱们使用的是沙盒服务器的地址。
准备配置文件
开发者门户上的操做尚未完,点击左项菜单上的【Provisioning】,点击【New Profile】新建一个配置文件。
填入以下内容:
配置名称Profile Name: PushChat Development
证书(Certificates):选中你的开发者证书
应用ID(App ID): PushChat
设备(Devices): 选中你的开发设备
这里的操做跟你以前的没有什么不用,只是具有推送功能的应用须要一个新配置文件来跟设置好的APP对应起来。
点击发送按钮(Submit),新的配置文件就会从新生成,稍等片刻,再刷新页面便可下载新的配置文件(PushChat_Development.mobileprovision)。
将配置文件下载并加载到XCode(双击或拖到XCode图标上)。
准备正式发布前,你也要这样操做来准备用发布用的配置文件。
简单的示例应用
你还在吗?经历了这么多终于能够来点兴奋点的事情了,不过上面的这些过程是必不可少的,至少这些也不须要每天搞的,不然是会死人的,不是吗?
咱们已经实现与沙盒服务器的加密网络链接,如今就让咱们来实现推送通知的发送吧。
打开你的XCode,选择【File】【New Project】,选择【View-based Application】点击继续:
填入如下内容:
Product Name: PushChat
Company Identifier: com.hollance
Device Family: iPhone
根据你的实际状况填入应用名称和开发者标识,这里咱们就填入“com.hollance.PushChat”。你应该填入跟你在开发者门户里填入的一致信息(com.yourname.PushChat)。
完成新建项目的操做,打开PushChatAppDelegate.m,修改 didFinishLaunchingWithOptions 过程:
-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{self.window.rootViewController =self.viewController;[self.window makeKeyAndVisible];// 通知设备须要接收推送通知 Let the device know we want to receive push notifications[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert)];return YES;}
调用registerForRemoteNotificationTypes 通知系统应用是须要接收推送信息的。
在你的设备上编译运行应用,模拟器是不支持推送信息的。XCode应该会自动选择配置文件,若是出现签名错误,你须要在 Code Signing build settings手动选择以前下载的配置文件。应用启动时会注册推送通知服务,弹出下面的确认窗口提示用户容许此应用接收推送通知服务。
应用只会提示询问一次,若是用户选择接受,设备就一切就绪了。若是用户选择了拒绝,应用将永远没法接收到信息,用户能够在设备的设置项目中修改此项设定。
应用的名称将会添加到设置程序中的通知项目下,用户能够方便地在这里开启或关闭或自定义接收信息的种类和方式。
应用也能够经过程序来激活具体的提示方式:
UIRemoteNotificationType enabledTypes =[[UIApplication sharedApplication] enabledRemoteNotificationTypes];
还有额外的一件事,为了发送信息到指定的手机,咱们还须要一些操做:
-(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{NSLog(@"个人设备ID: %@", deviceToken);}-(void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{NSLog(@"注册失败,没法获取设备ID, 具体错误: %@", error);}
当应用注册推送服务成功时,就能够获取用户设备识别ID(Token ID),这是对应你的设备一个32位的惟一编码,你能够理解为推送信息的地址。
运行应用,在XCode的终端窗口你能够看到如下信息:
个人设备ID:<740f4707 bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf 61bb78ad>
设备识别ID(Token ID)是加密的数据结构,储备在NSData对象中。这里你知道它是32位长度就够了,上面你看到的是64个16进制的字符,咱们将使用这个格式,固然<>和空格要过滤掉。
在模拟器中运行,didFailToRegisterForRemoteNotificationsWithError会返回错误:method will be called as push notifications are not supported in the simulator.
应用准备好了,就差最后一件事了。
发送咱们的推送通知
以前咱们都谈到要有服务器或服务组件来实现推送通知的发送和管理,在这里,咱们先不急着搭建服务器,这里有一个简单的PHP脚本用来创建到APNS的链接和发送测试信息到以前的设备上。
你能够在MAC上直接使用:
下载SimplePush源代码 解开后,修改simplepush.php中的如下几个地方:
// Put your device token here (without spaces):
$deviceToken ='0f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78';// Put your private key's passphrase here:
$passphrase ='pushchat';// Put your alert message here:
$message ='My first push notification!';
复制设备识别ID到变量$deviceToken,别留下任何一个空格,完彻底全就是64个16进制字符;指定私钥的口令和要发送的信息内容;复制ck.pem到脚本所在文件夹,ck.pem包括了证书和私钥。
开启终端程序( Terminal):
$ php simplepush.php
若是一切OK的话,脚本将返回:
Connected to APNS
Message successfully delivered
几秒钟内,你应该能够在设备上收到推送的信息了。
注意若是应用在开启运行状态的话,你看不到任何信息,信息被直接发送给应用自己,可是咱们尚未经过编程来处理收到的信息,不信你能够再试一下。
若是PHP脚本退出并返回错误信息,请检查PEM文件是否正确、链接沙盒服务器是否正常。
PHP脚本具体的实现过程就不讨论了,有兴趣的或须要自行搭建服务器来管理发送推送通知的能够看此教程的下篇(请找原出处)。
接下来呢
如今你已经成功地实现了应用的推送通知服务,在此教程的下篇中,咱们来开发一个简单的短消息应用(PushChat)来实现用户之间的推送通知功能。还有完整用于在后台不间断提供推送通知服务的服务组件API。
下面是苹果的官方文档php
RemoteNotificationsPG.pdf (2.5 MB)编程
本文转载自:http://guafei.iteye.com/blog/1808445xcode