您的位置:首页 > 移动开发 > IOS开发

苹果推送通知服务中的iOS 教程

2014-01-22 14:10 447 查看
在iOS上,应用程序不能在后台做了很多。应用程序只允许做有限的活动集合,以便电池寿命是守恒的。

但是,如果一些有趣的事情发生,你希望让用户知道这一点,即使他们目前未使用您的应用程序?

例如,也许用户收到新的鸣叫,他们最喜欢的球队赢了比赛,或者他们的晚餐已准备就绪。由于应用程序当前没有运行,就无法检查这些事件。

幸运的是,苹果已经提供了一个解决这个。而不是你的应用程序不断检查活动或做的工作在后台,你可以写一个服务器端的组件,而不是做到这一点。

而当感兴趣的事件发生时,服务器端的组件可以将应用程序的推送通知!有三样东西一个推送通知可以这样做:

显示一个短文本消息

播放一段简短的声音

在应用程序的图标徽章设置了一些

不过,您可以您认为合适的组合这些,例如,播放声音,并设置徽章,但没有显示一条消息。

在这个两部分的系列教程,你会得到通过做一个简单的应用程序,使用APNS(苹果推送通知服务)来尝试一下吧!

在第一部分中,您将学习如何配置你的应用程序来接收推送通知和收到测试邮件。

本教程是为中级或高级的iOS开发者。如果你仍然是一个初学者到iOS,你应该检查出一些其他教程在本网站第一。另外,强烈建议您先检讨这两项教程(或具有同等知识):

如何写一个简单的PHP
/ MySQL的Web服务的iOS应用

如何使用Web服务写一个iOS应用

事不宜迟,让我们推动通过这个!


入门:简要概述

获得推到适用于您的应用程序需要相当多的努力。这是一个有许多块一个谜。这里是一个概述:





一个应用程序允许推送通知。用户必须确认他希望接收这些通知。

该应用程序接收到一个“设备令牌”。你可以把该设备令牌作为推送通知将被发送到的地址。

该应用程序向设备发送令牌到服务器。

当感兴趣的东西到你的应用情况,服务器会发送一个推送通知到苹果推送通知服务,或APNS的简称。

APNS发送推送通知到用户的设备。

当用户的设备接收推送通知,它显示一个警告,播放声音和/或更新应用程序的图标。用户可以从警报启动的应用程序。该应用程序发出推送通知的内容,并可以处理它,因为它认为合适的。

是推送通知还是值得的,现在我们有本地通知和多任务?你打赌!

本地通知是有限的调度定时事件和无限的后台处理仅适用于该做VOIP,导航或背景音乐应用程序。如果你想通知你对外部事件的应用程序的用户,而应用程序被关闭,你仍然需要推送通知。

在本教程中,我会详细的推送通知系统是如何工作以及如何构建推到你自己的应用程序解释。有很多解释,所以需要你的时间让这一切下沉英寸


您所需要的推送通知

要推送通知添加到您的应用程序,你需要:

一个iPhone或iPad。推送通知没有在模拟器上工作,所以你将需要测试的设备上。

在iOS开发者计划会员资格。你需要做一个新的应用程序ID和供应配置文件为每个应用程序,使用推,以及该服务器的SSL证书。你这样做的的iOS
Provisioning Portal中。

如果你想在这个教程中的示例跟着,你需要创建自己的配置配置文件和SSL证书,你不能用我的。因为它是重要的是得到证书的权利,我将解释如何获得一个详细的步骤。

连接到互联网的服务器。推送通知总是由服务器发送。对于开发您可以使用您的Mac作为服务器(你会做在本教程中),但在生产中使用,你至少需要一个类似的VPS(虚拟专用服务器)。

一个廉价的共享主机帐户是不够的。你需要能够在服务器上运行一个后台进程,安装SSL证书,并且能够使某些端口传出TLS连接。

大多数共享主机提供商,不要让你这样做,尽管他们可能,如果你问。不过,我真的建议使用VPS主机等的Linode


一个推送通知剖析

你的服务器是负责创建推送通知消息,所以它是有用的知道他们的样子。

推式通知短消息,由该设备令牌,有效载荷,和其他几个位和字节。有效载荷是你所感兴趣的东西,因为它包含您将要发送各地的实际数据。

您的服务器应提供有效载荷为JSON字典。有效载荷为一个简单的推送消息看起来像这样:
{
	“APS”:
	{
		“提醒”:“你好,世界!”
		“声音”:“默认”
	}
}


对于JSON的门外​​汉,由花括号{}分隔块包含一个字典,它包含键/值对(就像一个NSDictionary)的。

的有效载荷是一个包含至少一个项目时,“APS”,它本身也是一个字典的字典。在我们的例子中,“APS”包含“提醒”和“声音”的领域。当收到这个推送通知,它显示与文本的警报视图“你好,世界!”并播放标准的声音效果。

还有你可以添加到“APS”部分来配置通知其他物品。例如:
{
	“APS”:
	{
		“提醒”:
		{
			“行动-LOC键”:“打开”,
			“身体”:“你好,世界!”
		},
		“徽章”:2
	}
}


现在,“警戒”是它自己的字典。“动作-LOC键”提供了一种替代文本“查看”按钮。在“徽章”字段包含将要在应用程序图标上显示的号码。此通知将不会播放声音。

还有更多的方法来配置JSON负载。您可以更改时播放的声音,你可以提供本地化的文本,你可以添加你自己的领域。欲了解更多信息,请查看官方的本地和推送通知编程指南

推送通知的目的是要小;有效载荷的大小可​​以是不超过256个字节。这使得你对尽可能多的房间,在SMS消息或鸣叫配合。智能推送服务器不会浪费在换行和空白空间,并生成一些看起来像:
{“APS”:{“警示”:“你好,世界”,“声音”:“默认”}}


这是不容易看懂对于我们人类,但它节省了足够的字节,使其值得的。推送通知的有效载荷超过256字节将不会被APNS接受。


推送通知陷阱





推送通知是不可靠的!

他们是不可靠的!没有保证推送通知将实际交付,即使APNS服务器接受他们。

至于你的服务器而言,推送通知是火和忘记,没有办法找出的通知的状态是你把它交给APNS后。交货时间可能也不同,从秒到半小时。

此外,用户的iPhone可能无法收到推送通知所有的时间。他们可能是一个WiFi网络,不允许连接要作出APNS,因为所需要的端口被阻塞。或手机可能被关闭。

APNS会尽量提供它收到该设备时,它重新联机的最后通知,但它只会尽量在有限的时间。一旦超时,推送通知将会永远失去了!





看后APNS服务器比尔

他们可以是昂贵的!如果你对自己的数据添加推送功能,您的应用程序是相当容易和便宜,但如果你有很多你需要轮询的用户或数据可能很昂贵。

例如,它是没有问题的,如果你想通知你的用户在你自己的RSS源的内容发生改变。因为您可以控制​​的RSS提要,并知道什么时候改变了
- 当您更新您的网站内容 - 你的服务器可以在适当的时候发出的通知。

但是,如果你的应用程序是一个RSS阅读器,可以让用户把自己的网址?在这种情况下,你需要拿出一些机制来检测更新这些提要。

实际上,这意味着你的服务器需要不断轮询这些饲料的变化。如果你有很多用户,你可能必须安装一堆新的服务器来处理所有的处理和带宽。对于这类应用程序,推送可能会变得非常昂贵的,可能并不值得。

好了,够了理论。它的时间来学习如何做到这一点推动的事情。之前,我们可以得到的好东西
- 编程! - 有一些无聊的设置工作要在在iOS Provisioning Portal中完成的,所以让我们得到了以尽可能快。


配置配置文件和证书,噢,我的!





APNS需要一个证书!

要启用推送通知在您的应用程序,它需要与被配置为推一个供应配置文件签署。此外,您的服务器需要签署​​其通信APNS与SSL证书。

该供应配置文件和SSL证书是紧密联系在一起的,而且只适用于单一的应用程序ID。这是一种保护,确保只有你的服务器可以发送推送通知到您的应用程序的实例,并没有其他人。

如你所知,应用程序使用的开发和分发不同的配置配置文件。也有两种类型的推送服务器证书:

发展。如果你的应用程序是运行在调试模式,并与开发配置文件签署(代码签名身份是“iPhone开发”),那么你的服务器必须使用开发证书。

生产。该分布是Ad
Hoc或在App Store上的应用程序(在代码签名标识是“iPhone分派」)必须跟使用生产证书的服务器。如果有这些不匹配,推送通知无法传递到您的应用程序。

在本教程中,您将不会与分布状况和证书打扰,只是使用那些发展。


生成证书签名请求(CSR)

还记得你不得不去的iOS
Provisioning Portal中,使一个开发证书后,您注册的iPhone开发者计划?如果是这样,那么这些接下来的步骤应该是熟悉的。不过,我劝你还是跟着他们没错。大多数问题的人有越来越推送通知来的工作是由于问题的证书。

数字证书是基于公钥
- 私钥加密。你并不需要了解加密使用证书什么,但你需要知道的证书始终工作在同一个私有密钥组合。

该证书是这个密钥对的公共部分。它是安全的把它给别人,这就是当你通过SSL进行通信究竟会发生什么。私钥,但是,应保持...私人。这是个秘密。你的私钥是无人能敌,但你自己的。重要的是要知道你不能使用该证书,如果你没有私钥。

当你申请一个数字证书,你需要提供一个证书签名请求,或企业社会责任的简称。当您创建CSR,一个新的私钥被放入您的钥匙串制成。然后,您将CSR发送到证书颁发机构(在这种情况下,它是iOS的开发者门户网站),这将产生基于在企业社会责任的信息,为您的SSL证书。

在Mac上打开钥匙串访问(它是在应用程序/实用工具),然后选择菜单选项从证书颁发机构申请证书...





如果你没有这个菜单选项或它说:“申请一个证书从证书颁发机构与重点”,然后下载并安装WWDR中级证书第一。另外,还要确保没有私人密钥在钥匙串访问主窗口中选择。

您现在应该看到如下窗口:





在这里输入您的电子邮件地址。我听到人们建议您使用您用于注册的iPhone开发者计划相同的电子邮件地址,但它似乎接受任何电子邮件地址就好了。

输入“PushChat”为通用名称。你可以输入任何你想要的这里,但选择一些描述性的。这让我们以后容易地找到私钥。

检查保存到磁盘,然后单击Continue(继续)。将文件另存为“PushChat.certSigningRequest”。

如果你去的钥匙串访问的键部分,你会看到一个新的私钥已经出现在您的钥匙串。用鼠标右键单击它并选择导出。





保存私钥PushChatKey.p12并输入密码。

在本教程的方便,我用密语“pushchat”,以保护p12文件,但你真的应该选择一些不太容易被猜到。私钥必须是一个秘密,还记得吗?请选择一个密码,你可以回忆一下,否则你将无法在以后使用的私有密钥。


使应用程序ID和SSL证书

登录到iPhone开发中心,并从右侧面板中的“选择证书,标识符和配置文件”。





您将看到以下画面(不新开发中心的UI外观圆润:))





因为你正在做iOS应用程序选择证书iOS应用程序部分。

现在,你要建立一个新的App
ID。每个推应用程序需要它自己唯一的ID,因为推送通知发送到一个特定的应用程序。(不能使用通配符标识。)

转到应用程序的ID在侧边栏,然后单击+按钮。





填写以下详细信息:

应用程序ID说明:PushChat

应用程序服务检查推送通知复选框

明确应用程序ID:com.hollance.PushChat

com.yoursite.PushChat
- -而不是使用地雷,如果你在这里选择自己的捆绑标识符这可能是最好的。你需要在你的Xcode项目设置同样的包ID。之后你完成填充所有细节按Continue(继续)按钮。您会被要求验证应用程序ID的详细信息,如果一切似乎还好点击提交

华友世纪!您已成功注册了一个新的应用程序ID。





在几分钟后,你会生成你的推送服务器使用,使以APNS建立安全连接的SSL证书。此证书是与你的应用程序ID。你的服务器只能发送推送通知到特定的应用程序,而不是任何其他应用程序。

之后您所做的应用程序ID,它表明这样在列表中了:





选择PushChat从列表应用程序ID。这将打开如下图所示的手风琴:





在“推送通知”行通知,有两个橘***灯亮,表示说,在开发和发布栏“可配置”。这意味着你的应用程序ID可用于推送,但你仍然需要对此进行设置。点击设置按钮来配置这些设置。





向下滚动到推送通知部分,并选择创建证书的按钮开发的SSL证书一节。





“新增的iOS证书”​​向导出现:





它要求你的第一件事就是生成一个证书签名请求。你已经做到了,所以单击Continue(继续)。在接下来的步骤中,您上传的企业社会责任。选择您先前生成的CSR文件,然后单击生成





这需要几秒钟来生成的SSL证书。单击Continue(继续),当它完成。

现在点击下载拿到证书-它被命名为“aps_development.cer”。





正如你所看到的,你有一个有效的证书,并推现已发展。必要时,可以在这里再次下载证书。开发证书是唯一的有效期为3个月。

当您准备好释放你的应用程序,用于***证书重复此过程。的步骤是相同的​​。

注:生产证书一年仍然有效,但你想续订一年之前是在确保没有停机时间的应用程序。

您不必将证书添加到您的钥匙串,尽管你可以,如果你通过双击下载的希望aps_development.cer文件。如果你这样做,你会看到,它现在与私钥相关联。


***PEM文件

所以,现在你有三个文件:

企业社会责任

私钥为P12文件(PushChatKey.p12)

SSL证书,aps_development.cer

在安全的地方存放这三个文件。你可以扔掉的企业社会责任,但在我看来,这是比较容易保持。当您的证书过期,您可以使用相同的CSR生成一个新的。如果你要生成新的CSR,你也将得到一个新的私钥。通过重新使用的CSR您可以继续使用您现有的私有密钥,只有。cer文件会改变。

您必须将证书和私钥转换成格式,更实用。因为我们的服务器的推送部分将用PHP编写的,你会的证书和私钥组合成一个使用PEM格式的单个文件。

什么是质子交换膜的细节并不重要(事实上,我不知道),但它可以更容易为PHP使用的证书。如果你写你的推送服务器在另一种语言中,这些下面的步骤可能并不适用于您。

你要使用命令行的OpenSSL工具这一点。打开一个终端,然后执行以下步骤。

去你下载的文件,在我的情况下,桌面上的文件夹:
$ CD〜/桌面/


所cer文件转换成PEM文件。:
$ openssl的X509,在aps_development.cer-告知DER出PushChatCert.pem


。私钥的p12文件转换成PEM文件。:
$ openssl的PKCS12-nocerts出PushChatKey.pem式PushChatKey.p12
进口输入密码: 
MAC地址验证OK
输入PEM密码短语: 
验证 - 输入PEM密码短语:


首先,您需要输入密码了。p12文件,这样的openssl可以读取它。然后,你需要输入将用于对PEM文件加密的新密码。同样在本教程中我使用了“pushchat”为PEM密码短语。你应该选择一些更安全。

注意:如果你不输入PEM密码短语,openssl的不会给出错误信息,但生成的pem文件不会有私钥在里面。

最后,结合了证书和密钥到一个单一的PEM文件。:
$猫PushChatCert.pem PushChatKey.pem> ck.pem


在这一点上它是测试是否该证书的作品是一个好主意。执行下列命令:
$ TELNET gateway.sandbox.push.apple.com 2195
尝试17.172.232.226 ...
连接到gateway.sandbox.push-apple.com.akadns.net。
转义字符为'^]'。


这试图让到APNS服务器有规律的,未加密的连接。如果你看到上面的反应,那么你的Mac可以达到APNS。按Ctrl
+ C来关闭连接。如果你得到一个错误信息,那么请确保您的防火墙允许在端口2195的传出连接。

让我们尝试重新连接,使用我们的SSL证书和私钥建立安全连接这个时候:
$ openssl的指令主要-CONNECT gateway.sandbox.push.apple.com:2195 
    证书PushChatCert.pem键PushChatKey.pem
输入密码短语PushChatKey.pem:


你应该会看到一大堆的输出,这是openssl的让你知道的引擎盖下是怎么回事。

如果连接成功,你应该能够键入几个字符。当您按下回车,服务器应断开。如果有一个问题,建立连接,openssl的会给你一个错误消息,但你可能有过输出向上滚动,找到它。

注意:有两种不同的APNS服务器:“沙箱”的服务器,你可以使用测试,以及您在生产模式下使用实时服务器。上面,我们使用了沙箱服务器,因为我们的证书是用于开发,而不是生产使用。


使得供应配置文件

你尚未跟iOS开发中心。点击预置描述文件中的侧边栏按钮,然后单击+按钮。





这将打开供应配置文件向导的iOS。


第1步:选择类型

在向导的第一步选择“的iOS应用程序开发者”选项按钮,然后按Continue(继续)





步骤2:配置

选择您在上一节中创建的PushChat应用程序ID。这将确保该供应配置文件明确绑在PushChat应用程序。





步骤3:产生

在此步骤中选择要在此配置配置文件包含证书。这一步应该是相当常规了吧。





第4步:选择设备

选择您想在这个配置配置文件包括的设备。既然你正在创建的发展概况,您通常会选择这里开发中使用的设备。





步骤5:命名此配置文件

将配置设定档名称为“PushChat发展”,如下图所示。





就快完成了!最后按下下载按钮,这将下载新创建的开发配置文件。

新增的配置设定档Xcode中通过双击它或者将其拖动到Xcode的图标。

如果你已经准备好释放你的应用程序,以公开,你将不得不重复这个过程,使一个特设或App Store的分布概况。


一个非常基本的应用程序

到目前为止,事情还没有真正令人兴奋的,但那些预赛是必要的。我想告诉你详细介绍如何生成证书,因为它不是你做的东西每天都推不工作,没有它。

你已经建立了你的证书是通过连接到沙盒服务器有效。让我们来测试,如果你实际上可以发送一些推送通知!

火了Xcode中,选择文件,新建项目。在助手,挑单视图应用程序,然后继续下一个步骤。





我填写这些字段,如下所示:

产品名称:PushChat

机构名称:雷Wenderlich

公司标识:com.hollance

器件系列:iPhone

产品名称和公司标识共同构成了包ID。就我而言,就是“com.hollance.PushChat”。你应该选择一个产品名称和公司标识相对应的应用程​​序ID,您之前在Provisioning
Portal中(com.yourname.PushChat)制成。确保“使用演示图板”和“使用自动引用计数”复选框被选中。

完成助理和开放AppDelegate.m。更改应用程序:didFinishLaunchingWithOptions:方法看起来像这样:

-  (BOOL )应用:(的UIApplication * )应用didFinishLaunchingWithOptions :(NSDictionary中  * ) launchOptions { 
	/ /让设备知道我们要接收推送通知
	[ [的UIApplication sharedApplication ] registerForRemoteNotificationTypes :
		( UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert )] ;
 
    返回 YES ;
 }

新的呼叫registerForRemoteNotificationTypes:告诉这个应用程序要接收推​​送通知的OS。

构建和运行应用程序。你需要这样做您的设备上,因为模拟器不支持推送通知。Xcode中应该会自动选择新的供应配置文件。如果你得到一个代码符号错误,那么请确保正确的配置文件中的代码签名生成设置中选择。

当应用程序启动和寄存器的推送通知,它显示了一个消息,通知这个应用程序希望发送推送通知用户。





该应用程序会询问这个只有一次。如果用户选择“确定”,那么我们应该准备就绪。但是,如果他们选择“不允许”,那么我们的应用程序将永远不会收到推送通知。用户可以改变他们的决定,在手机的设置。





您的应用程序的名称将被添加到手机的设置,通知下。用户可以启用或禁用在这里为您的应用程序的通知,包括徽章,声音和提醒单独设置。





你的应用可以找出哪些类型的推送通知的启用通过:

UIRemoteNotificationType enabledTypes =  [ [的UIApplication sharedApplication ] enabledRemoteNotificationTypes ] ;

有一件事你需要以能够接收推送通知的补充。以下内容添加到AppDelegate.m

-  (无效)的应用:(的UIApplication * )应用didRegisterForRemoteNotificationsWithDeviceToken :(NSData的 * ) deviceToken
 { 
	的NSLog (@ “我的标记是:%@”,deviceToken ) ;
 }
 
-  (无效)的应用:(的UIApplication * )应用didFailToRegisterForRemoteNotificationsWithError :(NSError * )错误
 { 
	的NSLog (@ “无法得到令牌,错误:%@” ,错误) ;
 }

当你的应用程序寄存器用于远程(推送)的通知,它会尝试获取“设备令牌”。这是唯一地标识您的设备一个32字节的数字。认为该设备令牌作为一个推送通知将被传递给地址。

再次运行该应用程序,你应该看到在Xcode的控制台窗口是这样的:
我的标记是: 
<740f4707 bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf 61bb78ad>


令牌是一个不透明的二进制数据结构,塞进一个NSData对象。苹果不希望你更动它的内部。我们的目的是足以知道它是目前32个字节长。正如你可以在上面看到,该令牌可通过64个十六进制字符来表示。您将使用它的格式,但你还是去掉方括号并留下了空间。

如果你在模拟器中运行的应用程序,该应用程序:didFailToRegisterForRemoteNotificationsWithError:方法将被称为推送通知不支持的模拟器。

这是它的应用程序。还有一件事要做,那你终于可以看到一些推送通知在行动!


发送你的第一个推送通知

正如我之前提到的几次,你需要设置一个发送推送通知到你的应用服务器。对于这第一个考验,你不打算设立一个服务器只是还没有。相反,我给你设置到APNS建立连接,并发送推送通知到您所指定的设备令牌一个非常简单的PHP脚本。您可以从您的Mac直接运行此。

下载SimplePush代码并将其解压缩。你需要做出一些改变simplepush.php

/ /把你的设备令牌在这里(不带空格):
$ deviceToken  =  '0 f744707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bbad78' ;
 
/ /把你的私钥的口令在这里:
$的密码 =  'pushchat' ;
 
/ /把你的提醒讯息:
$消息 =  '!我的第一个推送通知“ ;

你应该从应用程序复制设备令牌到$
deviceToken变量。一定要留出了空间和支架,它应该仅仅是64个十六进制字符。把你的私钥的口令为$的密码,并且要发送的$消息的文本。

您复制ck.pem文件到SimplePush文件夹。记住,ck.pem文件包含你的证书和私钥。

然后打开终端,输入:
$ PHP simplepush.php


如果一切顺利,该脚本应该说:
连接到APNS
消息成功传递


并在几秒钟内你会收到你的第一个推送通知:





请注意,你不会看到任何东西时,应用程序是开放的。推送邮件传递,但你没有在应用程序构建任何东西来处理它。关闭应用程序,然后再试一次。

如果simplepush.php脚本错误消息退出,然后检查是否已正确所做的PEM文件,并且可以连接到沙盒服务器没有问题(见上文)。

现在,它是什么并不重要剧本究竟。我会解释更多关于此系列中的第二部分,当我们建立一个真正的推送服务器。


故障排除

这部分有一些提示,以跟踪,如果你面对的问题得到推送通知来上班。

收到了一些通知,但还不是全部:如果你同时发送多个推送通知,您会收到只有几个,不要害怕,那是有意的行为。APNS维护的QoS(服务质量)的队列中的每个设备具有一个推应用程序。此队列的大小是1,因此,如果您发送多个通知,然后最后一个通知将被覆盖。

问题连接到推送通知服务:

一种可能性在这里可能是有防火墙阻止使用的APN的端口。请确保您解除封锁这些端口

这里另一种可能性可能是因为你已经得到了私钥和CSR文件错误。而更新本教程中我自己犯了这个错误并修复它使用正确的私钥。请记住,每个应用程序ID都有一个唯一的CSR和私钥组合。

无法获得当地颁发者证书。这个错误意味着从服务器的证书无法验证。为了解决这个问题,你需要下载的委托CA根证书。这可以通过使用该命令的终端来完成:
卷曲-O https://www.entrust.net/downloads/binary/entrust_2048_ca.cer[/code] 
那么你还需要添加
stream_context_set_option($ CTX,“SSL”,“cafile','entrust_2048_ca.cer');


到第16行后simplepush.php文件。

原文出处:http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: