php写的可以在本机发送iOS push程序
最后更新于:2022-04-01 20:01:06
用于客户端,本机发push消息,把下面这段代码拷贝到文件以.php后缀名,和证书放到同一目录;ck.pem需要自己生成。具体步骤[详见这里](http://blog.csdn.net/hherima/article/details/45583865)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b13bc245.jpg)
~~~
’push测试2’,
'action-loc-key'=>'ok');
// Create the payload body
$pushInfo['aps'] = array(
'alert' => $alert,
'sound' => '1',
// 'content-available' => 1//,//for 静默下载。
'badge' => 1
);
$pushInfo['usrdefined'] = array('ptype'=>'6',
'pushid'=>'4865',
//自定义字段
'appleid'=>’123456’
);
// Encode the payload as JSON
$payload = json_encode($pushInfo);
// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));
if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;
// Close the connection to the server
fclose($fp);
~~~
● 填写token的时候,把空格去掉。
● cd到文件的目录,键入命令 php xxx.php,如果收到此消息说明发送成功
Connected to APNS
Message successfully delivered
';
浅谈iOS Push 在iOS6/7/8/9中的进化
最后更新于:2022-04-01 20:01:04
### 简介
在iOS设备安装APP后,通常都会询问是否允许发送通知(下图),同意后,一般情况下用户都会收到某APP的push。比如,用户收到一条微博,他们喜欢的球队赢了比赛,或者他们的晚饭准备好了,既然APP不在运行,所以APP不能检查这些事件。 幸运的是Apple针对这些问题提供了解决方案。开发者可以写一个服务端的组建,替代客户端不停的检测或者在后台工作。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1398816.jpg)
### Push的原理
push 消息走的APNs服务器,设备和APNs(Apple Push Notification Service)服务器之间建立了一个安全通道。关于push的原理,如下图,[详细看这里](http://blog.csdn.net/hherima/article/details/45583787)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0f6c94e.jpg)
把图片翻译一下就是:
1. 客户端向 APNs注册一下,并获取token
2. APN是将token传给客户端
3. 客户端将token发给自己的Server
4. 在合适的时候,自己的Server给APNs发送push消息。
5. 最终APNs发送给客户端
### iOS Push 在iOS6/7/8/9中的进化
那么随着iOS版本的进化,Push交互和功能也在变化
iOS6 (待补充)
iOS7 支持后台push,静默push。设备不显示,也不响铃,[点击了解更多](http://blog.csdn.net/hherima/article/details/50469519)
iOS8 支持push的[更多交互](http://www.cocoachina.com/ios/20150112/10901.html)(比如快速回复、删除单个push等)
开发人员的接口的变化
~~~
/* 下面几个是iOS6/7/8上的接口,统一在- (void)application:didReceiveRemoteNotification:中处理*/
- (void)application:didReceiveRemoteNotification://iOS6
- (void)application:didReceiveRemoteNotification:fetchCompletionHandler://iOS7,iOS8
- (void)application:handleActionWithIdentifier:forRemoteNotification:completionHandler://iOS8
~~~
如果不做处理,iOS7上可以会遇到push重复的问题,解决办法[点这里](http://blog.csdn.net/hherima/article/details/47133171)
### 开发过程中,程序员如何测试push
这里有php开发的一短代码(拷贝到文件以php后缀名)。需要你生成证书和provisionfile。这样可以用本机给iOS APP发送push了。里面用的的ck.pem需要自己生成。
[点击这里下载](http://blog.csdn.net/hherima/article/details/50470409)
### Push需要注意的地方
● 自己Server发的每一条Push,客户端都会收到么?答案是否定的,Push是不可靠的,push通知是fire-and-forget,比如手机关机,那么自然就收不到,虽然Apple会尝试几次。
● iOS8发的时间点起,无论那个iOS系统,push消息的body大小调整为2k,注意这里是iOS8的时间点,也就是2014年秋,就目前来说push的限制应该是2k不再是256了
● 测试Push的时候,区分好Appstore证书和开发证书。两者不能相互发Push
';
iOS7 Background Remote Notification(后台远程通知——静默push)
最后更新于:2022-04-01 20:01:02
### 简介
iOS 7在推送方面最大的变化就是允许:应用收到通知后在后台(background)状态下运行一段代码,可用于从服务器获取内容更新。功能使用场景:(多媒体)聊天,Email更新,基于通知的订阅内容同步等功能,提升了终端用户的体验。
Remote Notifications 与之前版本的对比可以参考下面两张 Apple 官方的图片便可一目了然。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b12e348f.jpg)
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b13395ba.jpg)
如果只携带content-available: 1 不携带任何badge,sound 和消息内容等参数,则可以不打扰用户的情况下进行内容更新等操作即为“Silent Remote Notifications”。
### 客户端设置
开启Remote notifications
需要在Xcode 中修改应用的 Capabilities 开启Remote notifications,请参考下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b137f08d.jpg)
修改通知处理函数
当注册了Backgroud Modes -> Remote notifications 后,notification 处理函数一律切换到下面函数,后台推送代码也在此函数中调用。
~~~
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
~~~
### 服务端推送设置
推送消息携带 content-available: 1 是Background 运行的必须参数,如果不携带此字段则与iOS7 之前版本的普通推送一样。
### 限制与注意
● “Silent Remote Notifications”是在 Apple 的限制下有一定的频率控制,但具体频率不详。所以并不是所有的 “Silent Remote Notifications” 都能按照预期到达客户端触发函数。
● “Background”下提供给应用的运行时间窗是有限制的,如果需要下载较大的文件请参考 Apple 的 NSURLSession 的介绍。
● “Background Remote Notification” 的前提是要求客户端处于Background 或 Suspended 状态,如果用户通过 App Switcher 将应用从后台 Kill 掉应用将不会唤醒应用处理 background 代码。
更详细的说明资料请查阅 Apple 官方的 iOS 开发文档。
本文摘自:[极光push](http://docs.jpush.cn/display/dev/iOS+7+Background+Remote+Notification)
';
iOS6和iOS7处理push不同之处,解决重复push,-(void) application: didReceiveRemoteNotification: fetchCompletionHandl
最后更新于:2022-04-01 20:00:59
假设读者已经知道push的基本知识,本文只是解决一些适配,兼容问题。如果对push 不甚了解,参考下面的文章
1.【iOS push全方位解析】(一) [push的概述](http://blog.csdn.net/hherima/article/details/45583787)
2.【iOS push全方位解析】(二) [生成push证书,生成Provisioning Profile](http://blog.csdn.net/hherima/article/details/45583865)
3.【iOS push全方位解析】(三)[一个极简的demo,并测试一下push](http://blog.csdn.net/hherima/article/details/45624075)
4.[给iOS程序添加push代码](http://blog.csdn.net/hherima/article/details/44854373)
======================正文=======================
客户端需要处理三中情况:
### 1. 客户端在前台。通常是弹窗
● iOS6 的-(void) application: didReceiveRemoteNotification:被调用
● iOS7 的-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:被调用
所以,为了兼容iOS6.通常的做法是,在-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:中调用-(void) application: didReceiveRemoteNotification: 方法。
● push处理模块,判断一下程序是否是活跃 [UIApplication sharedApplication].applicationState == UIApplicationStateActive。
进而判断是否需要弹出对话框。
### 2. 客户端在后台,但是还活着
大致原理同第一条,注意处理是否弹框。
### 3. 客户端被杀死的状态,进来push消息;滑动(点击)push消息调起客户端。
● iOS 6调用 -(void) application: didFinishLaunchingWithOptions:带有launchDictionary,里面包含了push消息
需要简单处理一下,获取真正的内容[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]
● iOS 7以后调用两个方法:
-(void) application: didFinishLaunchingWithOptions:
-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:
**这样就有一个坑。iOS7以上,可能就重复处理同一个push消息了。**
【解决】:由于只有iOS7以上都会调用-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:方法。
那么,为了兼容iOS6:在-(void) application: didFinishLaunchingWithOptions:中只处理iOS6。
4.现在的APP都有一个启动图过程。如果push消息过来,APP正好是被杀死状态,且假设启动后有启动图。
**这中push拉起APP后是直接处理push的,不弹框。**
【解决】首先想到的方法是:暂存这个push消息,然后等启动图完了再展示push内容。注意,等到启动图完成,再使用push模块
[UIApplication sharedApplication].applicationState == UIApplicationStateActive就不好用了,因为此时APP应该是活跃的了,就需要弹框了。所以,需要push模块支持一个强制不弹框的接口。
';
一个极简的demo,并测试一下push
最后更新于:2022-04-01 20:00:57
这是一篇来自[raywenderlich](http://www.raywenderlich.com)的教程,内容翔实!结构简单透彻、讲解循序渐进、文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下:
1.【iOS push全方位解析】(一) [push的概述](http://blog.csdn.net/hherima/article/details/45583787)
2.【iOS push全方位解析】(二) [生成push证书,生成Provisioning Profile](http://blog.csdn.net/hherima/article/details/45583865)
3.【iOS push全方位解析】(三)一个极简的demo,并测试一下push。(本博文)
[这里查看原文](http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1)
### 一个极简的demo
到目前为止,上面还不是做的还不够让人兴奋,但是那些准备工作还是很有必要的。本教程像你详细展示了如何生成证书,因为每天都会用到证书,而且没有证书push就不好。刚才你刚搞了一个证书,可以连接到APNS。现在让我们来测试一下吧。
打开Xcode选择File,New Project。在面板中选择Single View Application并下一步:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1236339.jpg)
(建工程)
我是这么填的:
● Product Name:PushChat
● Organization Name:Ray Wenderlich
● Company Indemnifier:com.hollance
● Device Family:iPhone
Product Name和Company Identifier 一起构成了Bundle ID。在我的例子中是“com.hollance.PushChat”.你应该选择一个Product name 和Company Identifier,即,从之前在Provisioning Portal中生成的App ID中获取(例如com.yourname.PushChat)。确保勾选“User Stroyboards”并且“Use Automatic Reference Counting”。好,完成创建工程。进入AppDelegate.m。改一下代码:
~~~
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Let the device know we want to receive push notifications
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
return YES;
}
~~~
函数registerForRemoteNotificationTypes是高速iOS该App想接收push通知。编译并运行该App。你应该在真机上运行,因为模拟器不支持push通知。Xcode会自动选择新的的provisioning profile。当程序启动并注册push通知,手机上弹一个消息,告知用户该app想发送push通知。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1266118.jpg)
(发送push 通知提醒)
app仅仅弹出一次这样的对话框询问用户。如果用户点击OK,那就一切就设置好了。如果点击“Don't Allow”,那么这个app将永远收不到push通知了。用户可以更改push的设置在手机设置中。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b127ba85.jpg)
(设置push通知)
app的名字被添加到设置中,在这里用户可以enable和disable app的push通知,包括badge、声音和alert样式。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b129c87b.jpg)
(详细设置push通知)
你的app可以设置具体是哪一种push,比如:
UIRemoteNotificationType enabledTypes = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
在AppDelegate.m中还要添加一个逻辑,来收到push通知
~~~
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSLog(@"My token is: %@", deviceToken);
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}
~~~
当你的app在远程push 通知注册后,会返回一个device token。这是一个32字节的数字,可以唯一标识你的设备。可以吧device token想象成一个push通知的地址。再次运行app,你应该在控制台看到下面的输出:
My token is:
<740f4707 bebcf74f 9b7c25d4 8e335894 5f6aa01d a5ddb387 462c7eaf 61bb78ad>
token是一串儿二进制的数据,在一个NSData中存放着。Apple不想让开发者对token做什么更改。对我们而言知道它是一个32字节长的数据就足够了。
APP工程的修改就这些了,还有一件事做完,就能看到push通知了。
### 发送第一个push通知
我之前很多次提到的,你需要搞一个server来发送push通知。这里为了测试,你不必设置一个server了。我已经写好一个简单的php脚本,可以连接到APNS并发送指定token的push通知。你可以在mac上运行。
[下载SimplePush code](http://d1xzuxjlafny7l.cloudfront.net/downloads/SimplePush.zip)并解压,你还需要改一下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!';
~~~
将app工程运行结果中的device token拷贝到$deviceToken变量,去掉空格和回车。一共是64个十六进制字符。将私钥的密码放放到$passphrase变量;设置你希望的文本内容到$message变量。
将ck.pem拷贝到SimplePush文件夹下,记得!ck.pem文件一定是包含了证书和私钥。打开命令行:
**$ php simplepush.php**
如果一切正常,脚本输出是:
**Connected to APNS
Message successfully delivered**
几秒钟后,你的设备收到了第一个push通知。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b12b5e47.jpg)
(push测试成功)
注意:app启动后什么也看不到。push消息是被派发了,但是app中并没有处理它。
';
生成OpenSSL证书,Provisioning Profile
最后更新于:2022-04-01 20:00:55
这是一篇来自[raywenderlich](http://www.raywenderlich.com)的教程,内容翔实!结构简单透彻、讲解循序渐进、文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下:
1.【iOS push全方位解析】(一) [push的概述](http://blog.csdn.net/hherima/article/details/45583787)
2.【iOS push全方位解析】(二) 生成push证书,生成Provisioning Profile(本篇)
3.【iOS push全方位解析】(三) [一个极简的demo,并测试一下push](http://blog.csdn.net/hherima/article/details/45624075)
[这里查看原文](http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1)
### Provisioning Profile和证书,Oh My!
为了App中push通知好用,App需要provisioning profile签名。另外,App Server需要用SSL证书对push通知签名。provisioning profile和SSL 证书是紧密连接在一起的,并且仅对一个App ID可用,这么做可以保证只有你的App Server可以发送push消息到你的App而不是别人的App。
正如你所知,App使用不同的provisioning profile分别用于开发和发布。同样,也有两种push证书:
● Development 被开发者provisioning profile签名的app,App Server必须使用开发者证书发送通知。
● Production 按照Ad Hoc或者APP Store发布的app,App Server必须使用production证书。如果两者混淆,那么App则收不到push通知。
本教程仅使用development 证书
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0f9e82d.jpg)
### 生成Certificate Signing Request(CSR)
还记得你是如何为App真机联调生成Development 证书么?如果记起来了,下面的步骤会很熟悉。但,我建议你还是严格按照步骤操作。大多数做push通知开发的时候,都遇到了证书问题。
数字证书是基于公-私钥的密码学。你不必知道cryptography如何使用证书:,但是你有必要了解:证书总是跟私钥一起工作的。证书只是“公-私钥”的公开部分。发给其他人是安全的,然而,私钥应该被保护好,它是一个秘密。私钥不是别人的事儿,而是你自己的事!有一点很重要:没有私钥,不能使用证书。
无论什么时候,请求一个数字证书,需要提供一个Certificate Signing Request(简写CSR)。当生成CSR,一个新的私钥被放到mac的钥匙串中了。接着,你发送CSR到一个证书机构(这里就是iOS developer protal),该机构将基于你提交的CSR生成SSL证书。
打开mac中的“钥匙串”,选择菜单,“Request a Certificate from a Certificate Authority”
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0fb24f9.jpg)
(图)请求证书1
如果你没有这个菜单选项或者显示“Request a certificate from a certificate Authority with key”,你下载并安装[WWDR InterMediate Certificate](https://developer.apple.com/certificationauthority/AppleWWDRCA.cer) ,并确保在钥匙串窗口中没有选中任何一个私钥。
你应该看到下图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0fc3804.jpg)
(图)请求证书2
输入email地址。我听说需要使用,用于App签名的email相同。但是,好像其他什么email都ok。
输入“PushChat”作为名字,这儿可以输入任何字符,找一个好记的,方便后面我们发现私钥。选中【 Saved to disk】点击“Continue”。将文件保存为“PushChat.certSigningRequest”。在“密钥”这个栏中可以看到刚刚申请的private,右键,并选择“Exprot”
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0fd32e5.jpg)
(图)导出证书
保存私钥为PushChatKey.p12并输入一个密码。本教程中,我使用“pushchat”作为p12文件的密码,但是你应该选一个容易记的密码。这个密钥(p12)文件需要保密。
### 生成App ID和SSL证书
登录iOS Dev Center选择右侧面板的“Certificate,Identifiers&Profile”。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0fe867a.jpg)
(图)iOS dev center
下面的界面出现了
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1013148.jpg)
(图)Certificate,Identifiers&Profile大纲
既然我们搞iOS app,在iOS Apps中选择“certificates”。现在你可以生成一个新的App ID。每一个push App需要唯一的ID,因为push通知是发送给指定的app
在左侧点击“App IDs”,点击“+”按钮
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b102ceaf.jpg)
(图)添加App id
输入下面的信息:
● App ID Description:PushChat
● App Services Check the push Notification Checkbox
● Explicit App ID
你最好使用自己的BundleIdentifier-com.yoursite.PushChat-而不是使用我的。你还需要在Xcode中设置相同的Bundle ID。输入这些信息后,点击“Continue”。将询问你是否确定这些信息,如果一切无误后点击“Submit”
哈哈!你已经成功注册了一个新的App ID
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b105ecc8.jpg)
(图)App ID生成了
接下来几分钟,你还会生成SSL证书,App Server将使用这个SSL证书跟APNS建立一个安全连接。这个证书跟App ID相连。APP Server只能发送push通知给这个App ID的程序,而不是其他App。
生成App ID后,它看在列表中这个位置:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1079abb.jpg)
(图)App id的展示
在列表中点击这个PushChat App id,一个相关的窗口出现了:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b10915be.jpg)
(图)App id详情
注意在“Push Notification”这一行,两个橙色的原点,“Configurable”分别在Develop和Distribution栏。这表示你的App ID可以用于push,但是你还需要设置一下。点击“setting”按钮,配置一下:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b10a909f.jpg)
(图)App id config
向下滚动到“Push Notification”这一段,选择Develop SSL Certificate这一行的“Create Certificate”按钮。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b10c4527.jpg)
(图)生成证书
“Add iOS Certificate”向导出现了:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b10da6aa.jpg)
(图)向导
第一件事,询问你生成Certificate signing Request,这一步你已经做完了,点击“continue”。下一步,你该上传CSR文件。选择刚才生成的CSR,点击“Generate”。
生成SSL 证书这将花费几秒钟,当它进行完成,点击“Continue”。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1101fe2.jpg)
现在点击“Download”来获取证书,它自动被命名为“aps_development.cer”
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b111942f.jpg)
(图)下载证书
正如你看到的,你已经有一个可用的证书,现在开发可以用push了。如果有需要,你还可以下载这个证书。开发者push证书三个月有效。
当你发布app,重复上面的操作。获取一个production 证书。步骤是相似的。production证书的有效期是一年,你需要确保在期限前。
没必要添加这个certificate到钥匙串,当然你可以双击aps_development.cer文件,你会发现它跟私钥关联起来了。
### 制造PEM文件
到目前位置,你有三个文件:
● CSR文件
● PushChatKey.p12私钥文件
● SSL证书(aps_development.cer)
将这三个文件保存好。你可以把CSR扔了,但是我觉得存着更容易一些。当证书过期,你可以使用那个CSR来生成一个新的证书。如果你生成一个新的CSR,还要导出一个新的私钥(p12)。通过复用CSR你可以使用已有的私钥,仅.cer文件会变化。
你得将证书和私钥转成更容易使用的格式。因为,我们的app Server是用PHP写的,所以你需要将证书和私钥合成为PEM格式。PEM格式对PHP来说更容易使用。如果你的app Server使用其他语言写的,下面这些步骤不使用了。
你将使用OpenSSL命令行来操作。打开命令行执行下面的步骤,进入证书的下载文件夹,我的是桌面:
$ cd ~/Desktop/
转换cer为pem文件
$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
转换p12为pem文件
$ openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12
Enter Import Password:
MAC verified OK
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
你第一次需要输入p12的密码,这样opensll可以读取它。接着你还为PEM需要输入一个新的密码。这儿我还使用“pushchat”,你可以使用更安全的密码。
注意:如果你没有输入PEM密码,openssl不会提示错误信息,但是生成的pem文件并没有私钥。
最后,合成证书和key为一个pem文件
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
至此,检查一下证书是否正常。执行下面的命令:
$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226...
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is '^]'.
上面是一个普通,没有加密的连接到APNS Server。看到以上的信息,说明你的mac可以连接到APNS。Ctrl + C关闭连接。如果得到错误消息,确保防火墙对2195是放开的。
我们再连接一次,这次使用SSL证书和私钥建立安全连接
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195
-cert PushChatCert.pem -key PushChatKey.pem
Enter pass phrase for PushChatKey.pem:
你应该看到一大堆输出,这些是openssl想让你知道后面在干什么。如果连接成功,你可以键入一些字符。输入回车,服务器关闭了连接。如果建立连接的时候有问题,openssl会给出错误信息,但是你得向上滚动查找到并查看。
【注意】:有两个APNS服务器:沙盒服务器用于测试,线上live用于生产模式。这里,我们使用沙盒服务器,因为我们的证书是development的,不是distribution的
-----------------------------------------------------------------------------------------------------------------------------
译者加:
生成openssl证书和ck.pem的过程可以归纳为:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b115e39c.jpg)
-----------------------------------------------------------------------------------------------------------------------------
### 制造provisioning profile
在iOS Dev Center 还没有,点击左侧栏的Provisioning profiles按钮,点击“+”按钮。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1177bb7.jpg)
(+provisioning file)
**Step1:选择类型**
选择“iOS App development”选项按钮,点击continue
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1189f56.jpg)
(provision develop)
**Step2:配置**
选择PushChat app ID,可以保证provisioning profile准确的绑定了PushChat App
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b11a4de3.jpg)
(选择app id)
**Step3:生成**
选择要包含的证书,这一步现在应该很常规。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b11bded4.jpg)
(选择证书)
**Step4:选择devices**
选择你想包含的设备,
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b11dfe6d.jpg)
**Step5:profile的名字**
设置provisioning profile的名字为“PushChat Development”
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b12098c5.jpg)
(provisioning name)
你几乎已经完成了,最后,点击“Download”按钮,下载最新生成的provisioning profile。
双击provisioning profile添加到Xcode或者拖拽到xcode中。
如果你是发布App,可重复相似的过程。生成一个Ad Hoc或者App Store发布的profile。
';
iOS PUSH概述
最后更新于:2022-04-01 20:00:53
这是一篇来自[raywenderlich](http://www.raywenderlich.com)的教程,内容翔实!结构简单、讲解循序渐进、文章质量上乘!是一篇难的的博文!使用半瓶的英语水平翻译了一下:
1.【iOS push全方位解析】(一)push的概述(本博文)
2.【iOS push全方位解析】(二)[生成push证书,生成Provisioning Profile](http://blog.csdn.net/hherima/article/details/45583865)
3.【iOS push全方位解析】(三)[一个极简的demo,并测试一下push](http://blog.csdn.net/hherima/article/details/45624075)
[这里查看原文](http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1)
在iOS中,App在后台不能做太多的事情,仅被允许做一些有限的活动,这样电池寿命就得到了保护。但,如果某些有趣的时间发生,并且又希望让用户知道,即便是用户并没有正在使用该App。
比如,用户收到一条新微博,他们喜欢的队赢得了比赛,或者他们的晚饭准备好了,既然App并不在运行,所以APP不能检测到这些事件。
幸运的是Apple针对这些问题提供了解决方案。开发者可以写一个服务端的组建,替代客户端不停的检测或者在后台工作。
当遇见感兴趣的事件发生,服务端组建可以发送一个push通知到这个App;
push通知可以做下面三件事:
● 显示一条短文本消息
● 播放一段声音
● 设置在APP图标badge数量
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0f520f6.jpg)
<学习如何在app中添加push通知>
开发者可以组合这些特性,比如,播放一段声音,并设置badge数字,但是不显示文本消息。
通过这一系列的文章,你自己将实现一个简单的APP并使用push通知。下面这部分文章,你将学会怎样配置APP接受push通知,并发送一个测试消息。
本篇教程适用于中高级iOS开发,如果你还是iOS新人,你应该看看其他教程。另外强烈推荐大家看看下面两个教程
● [How To Write A Simple PHP/MySQL Web Service for an iOS App](http://www.raywenderlich.com/2941/how-to-write-a-simple-phpmysql-web-service-for-an-ios-app)
● [How To Write an iOS App That Uses A Web Service](http://www.raywenderlich.com/2965/how-to-write-an-ios-app-that-uses-a-web-service)
废话少说,我们开始吧
### Getting Started:Brief Overview
给APP推送push通知要做相当多的工作,下图是一个多方组成的拼图:
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0f6c94e.jpg)
(push工作原理图)
1. 一个App启用push通知。用户得确认,自己就会收到这些通知。
2. App 收到一个“device token”,你可以认为device token是一个地址,push通知将被发送到这儿。
3. App发送该device token到你App的Server。
4. 当有趣的事件发生后,App的Server发送一个push通知到Apple Push Notification Service(简写为APNS)
5. APNS发送一个push通知到用户的设备。
当用户设备收到push通知,设备上显示一个alert,播放一段声音或者更新App的icon。用户通过alert可以启动App,并给予了push的内容。
push通知还值得存在么,既然我们有了本地通知和多任务。本地通知仅限于设定好时间的事件,并且只有“VOIP,地图导航和后台播放”才能使APP后台运行。假如你想通知那些App已经被close的用户,还需要push通知。
本教程,我会详细阐述push通知机制,和怎么在App中构建push。内容较多,享受它吧。
### push通知需要准备什么
为了给APP添加push通知,你需要:
一台iPhone或iPad。push通知在模拟器上不好用,所以你需要在真机上测试。
iOS Developer Program membership。你需要创建一个新的App ID和provisioning profile还有SSL证书(APP Server使用)。这些都在iOS Provisioning Potral中操作。
如果你想跟随本文的例子,你还需要创建你自己的provisioning profile和SSL 证书;你不能用我的。因为拿到证书很重要,我会阐述申请一个新的证书的详细步骤。
一个服务器用来连接网络。push通知总是由Server发出的。作为开发,可以使用你的Mac作为Server,但是作为产品发布,你至少需要一个类似于VPS(Virtual Private Server)的东西。
一种廉价的共享主机托管账户是不够的,你需要在后台运行,安装SSL 证书,并且支持特定端口TLS外边连接。
大多共享主机托管提供者,不让你这么搞。可能你请求后,他会这么干。我真心建议使用VPS,比如【Linode】
### 剖析一个push通知
App Server负责创建push消息,所以,知道push消息长什么样子很有用。一个push通知是一个条短消息,包含了device token,payLoad,还有一些其他字节。payLoad是包含了真是的数据。App Server应该提供一个JSON格式的字典。一个简单push消息的payLoad像这样:
~~~
{
"aps":
{
"alert": "Hello, world!",
"sound": "default"
}
}
~~~
一对{}包含了一个字典。payload是一个字典,至少包含一项“aps”,在上面的例子中,aps包含了两个字段alert和sound。客户端收到这种push通知,显示一个alert文本“helloworld”并播放了标准效果的声音。
还可以在aps中添加其他items,比如:
~~~
{
"aps":
{
"alert":
{
"action-loc-key": "Open",
"body": "Hello, world!"
},
"badge": 2
}
}
~~~
现在alert是一个字典了。“action-loc-key”给提供可选择的文本。badge字段包含了显示在APP icon上的数字。该push不会播放声音。
JSON格式的payload有很多中配置。开可以改变播放的声音,可以提供本地化的文本,可以自定义添加字段。点击这里查看更多[Local and Push Notification Programming Guide](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction.html).
push通知本身应该是短小为目的,payload最大是256bytes,,跟短信和微博大小差不多。聪明的push 服务器不会浪费空格和换行符,生成的push消息想这样子:
~~~
{"aps":{"alert":"Hello, world!","sound":"default"}}
~~~
这样我们读起来不太容易,但是它节省了字节。payload超过256的push通知,将不会被APNS接受。
### push通知的问题
它并不可靠。没有人保证push通知将准确的派发,即使APNS服务器接受了它们。正如 App Server担心的那样,push通知是fire-and-forget。没办法知道发给APNS的push消息的状态。派发的时间也是相差很大,可能秒级可能半个小时。
另外,iPhone用户可能一直没有启用push通知功能;可能在一个wifi环境,该wifi环境阻塞了APNS的端口;可能iPhone已经关机了。APNS会尝试发送最后一个通知,当phone回到在线后。但APNS仅会尝试一定次数,超过这个次数。这个push消息就永远丢了。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0f87a2e.jpg)
(push 并不可靠)
可能很贵。在App中添加push功能很容易也很廉价。在大用户量下,push通知变得昂贵了。比如:你在RSS变化的时候,通知你的用户。因为你控制着RSS并知道什么时候变化了。你在网站上更新,Server就发出了通知。但是,假如你的App是一个RSS feed,允许用户把自己的URL放进去。在这种情况下,你需要想出一些机制来检测更新那些资料。
实际中,你的Server需要不停的记录这些变化的feeds。如果你有大量用户,可能需要扩充服务器和宽带。这样push通知变得很昂贵并且不值得了。
理论知识差不多了,开始学习怎么做push通知吧。在开始之前,我们需要在iOS provisioning portal上做一些烦人的设置工作。
硬货是下一篇 [http://blog.csdn.net/hherima/article/details/45583865](http://blog.csdn.net/hherima/article/details/45583865)
';
给iOS程序添加push代码
最后更新于:2022-04-01 20:00:50
给iOS程序添加push代码 Adding Code for a Push Enabled iOS Application
现在,我们开始开发项目,为了使该App能够接受push通知,我们需要对程序进行一些修改。
We are now ready to start programming. We need to make a few modification to the app delegate in order to receive push notifications.
1.给当前设备注册push通知,在App delegete中的-application:didFinishLaunchingWithOptions: 调用方法:[application registerForRemoteNotifications]
To register the current device for push, call the method[application registerForRemoteNotifications] in the app delegate's-application:didFinishLaunchingWithOptions: method.
~~~
/*代码*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
// Register for Push Notitications, if running iOS 8
if ([application respondsToSelector:@selector(registerUserNotificationSettings:)]) {
UIUserNotificationType userNotificationTypes = (UIUserNotificationTypeAlert |
UIUserNotificationTypeBadge |
UIUserNotificationTypeSound);
UIUserNotificationSettings *settings = [UIUserNotificationSettingssettingsForTypes:userNotificationTypes
categories:nil];
[application registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
} else {
// Register for Push Notifications before iOS 8
[application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound)];
}
...
}
~~~
2.如果上一步的注册push成功,那么回调函数method-application:didRegisterForRemoteNotificationsWithDeviceToken在
APPdelegate中被调用。我们需要实现这个方法,并用它来通知解析这种新设备。
If the registration is successful, the callback method-application:didRegisterForRemoteNotificationsWithDeviceToken: in the application delegate will be executed. We will need to implement this method and use it to inform Parse about this new device.
~~~
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
// Store the deviceToken in the current installation and save it to Parse.
PFInstallation *currentInstallation = [PFInstallation currentInstallation];
[currentInstallation setDeviceTokenFromData:deviceToken];
currentInstallation.channels = @[@"global" ];
[currentInstallation saveInBackground];
}
~~~
3.当一个push通知过来的时候,程序不在前台,该通知则显示在iOS系统通知中心,然而,如果收到push通知的时候,app是active的
为了实现,该通知能在APP上面弹出来,我们可以实现:app的delegate方法[application:didReceiveRemoteNotification]
这种情况,我们简单调用解析,解析器创建一个模态alert并显示push的内容。
另外:如果程序完全退出,先调用didFinishLaunchingWithOptions把程序启动起来。
When a push notification is received while the application is not in the foreground, it is displayed in the iOS Notification Center. However, if the notification is received while the app is active, it is up to the app to handle it. To do so, we can implement the [application:didReceiveRemoteNotification] method in the app delegate. In our case, we will simply ask Parse to handle it for us. Parse will create a modal alert and display the push notification's content.
~~~
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
[PFPush handlePush:userInfo];
}
~~~
4.现在,你可启动APP检查一下上面的逻辑是否都设置正确了。如果正确,第一次启动APP的时候你应该会看到一个模态alert来询问用户
是否允许发送push通知。
You should now run your application (on your iOS device) to make sure everything is set up correctly. If it is, the first time you run this app you should see a modal alert requesting permission from the user to send push notifications.
原贴地址:[https://parse.com/tutorials/ios-push-notifications](https://parse.com/tutorials/ios-push-notifications)
github地址:[https://github.com/ParsePlatform/PushTutorial](https://github.com/ParsePlatform/PushTutorial)
';
前言
最后更新于:2022-04-01 20:00:48
> 原文出处:[iOS push开发专栏](http://blog.csdn.net/column/details/ios-push-hherima.html)
作者:[hherima](http://blog.csdn.net/hherima)
**本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!**
# iOS push开发专栏
> 全面介绍iOS push原理、开发技巧、测试工具、各版本适配。
文章容易理解,处理常见push的问题。
';