IOS推送
IOS推送
- 坑1: php实现 mac 下文本编辑器打开和编辑php文档,标点符号‘ “
编码导致读取.pem格式文件错误,建议再windows下编辑
- 坑2:SSL文件刚生成的时候可能会不可用
无坑讲解IOS APNS 配置
一:配置推送通知非常简单:首先 你需要一个IOS开发者账号,能够进入https://developer.apple.com/account/ 登录苹果开发者中心
然后
创建App ID----à配置应用推送通知----à证书签名请求---à生成SSL文件--à下载SSL文件----à为SSL证书导出p12 文件
说明:
1.上述步骤,在已有AppID时,可以不用再创建AppID,使用已有推送功能的AppID或配置已有AppID使具有推送功能
2.证书签名请求获取的CRS格式文件仅在——生成SSL文件步骤中需要
3.配置推送服务器端还需要将上述“为SSL证书导出p12 文件”导出的p12文件转换为.pem格式文件转换方式为在终端中执行如下:
openssl pkcs12 -in aaa.p12 -out aaa.pem -nodes
Enter Import Password:
MAC verified OK
在此之前我们还要弄清楚苹果所有常用证书,appID,Provisioning Profiles的作用及相互关系,我们可以查看下面这个文档说明,非常详细http://blog.csdn.net/holydancer/article/details/9219333
但也有说的不明确的地方:
如 开发者证书不是任何人都可以创建的,在一个项目组中一般有项目经理进行管理,AppID有项目组长管理,组员一般只有使用配置文件权限
至于APNS的具体配置和说明可以看http://zxs19861202.iteye.com/blog/1532460
这篇文档,说的也是图文并茂,不过按照这篇文档做的话一般使走不通的,因为他说错了,不过原理说的还是那么回事。你看看他讲的原理,然后《IOS网络编程与云端应用最佳实践》第八章8.2的讲解和说明,往下走,使可以做出来的。至于他在第五章中讲解的AppID的创建过程,因为IOS的升级,所以已经过时了,下面使最新的讲解及创建过程(当然,如果作为组员没有权限的话就可以跳过了,直接使用已有的AppID就好)
一:创建App ID
appID,这是每一个应用的独立标识,在设置项中可以配置该应用的权限,比如是否用到了PassBook,GameCenter,以及更常见的push服务,如果选中了push服务,那么就可以创建生成下面第3条所提到的推送证书,所以,在所有和推送相关的配置中,首先要做的就是先开通支持推送服务的appID;
App ID的作用是在信息提供和身份验证过程中对应用进行唯一性识别。它包含两个部分:
Bundle ID是一串由Apple生成的10字符前缀。
Bundle Identifier是一串以反域名规则书写的字符串,该字符串由开发者决定。其中可包含标准的字母和数字(A~Z及0~9),还可以包含点号和连字符。
例如,下面就是一个典型的App ID:
2MDCRUBLFG.com.richwagner.myamazingwebapp
为应用创建App ID的步骤为:
(1) 前往iOS Provisioning Portal网站:https://developer.apple.com/account/overview.action
(2) 单击Identifiers接点击App IDs。
(3) 单击右上角+按钮,打开Create App ID页面(图19-6)。
(4) 在Description——Name输入框中输入应用的名称或描述信息。
(5) 在App ID Prefix --Value下拉框中选择一个ID
(6) 在Bundle ID框中输入自己的反域名规则字符串。
(7) 在App Services中勾选需要的服务,这里必须勾选push Notifications
(8) 点击Continue创建
二.配置应用推送通知
在创建AppID时勾选push Notifications,或者编辑AppID,添加push Notifications服务
三、CSR文件
1、 生成Certificate Signing Request(CSR)
2、填写你的邮箱和常用名称,并选择保存到硬盘。
点击继续:
这样就在本地生成了一个Push.certSigningRequest文件。
四生成SSL文件 he下载SSL文件
SSL certificate文件
1、用你付过费的帐号登录到iOS Provisioning Portal, 找到上面创建的AppID,这样就会生成下面这条记录:
2、点击右侧的Configure:
3、点击Development Push SSL Certificate一行后的Configure:
4、点击Continue:
5、选择前面生成好的Push.certSigningRequest文件,点击Generate,出现如下所示的页面:
6、点击Continue:
7、点击Download,并将文件命名为aps_developer_identity.cer。
8、点击Done,你会发现状态变成了Enabled:
五 为SSL文件导出p12文件
双击aps_developer_dientity.cer 注册到你的钥匙串中,这样你的钥匙串中就会有
在这个文件上右击,选择”导出…”,填入密码保护和管理员用户密码,导出文件
IOS客户端编程
创建一个具备推送通知的应用
首先,我们需要先对Xcode项目进行一些设置,确保App ID和provisioning profile都被设置成良好的状态。(provisioning profile)可以不用手动生成,使用IOS的自动配置也可达到,具体创建过程在上述提到的文档 中有说明。将创建好的provisioning profile文件拖动到Dock中xcode应用图标上,就可以将其安装到应用程序中。
1.在Supporting Files文件夹下选中ProjectName-Info.plist,对右侧视图中的Bundle Identifier选项进行修改,和你自己创建的App ID保持一致(形如:com.parseSampleApp)。
2.在左侧的菜单中选中刚创建的project文件,在下面找到Build Settings然后搜索Code Signing Identity。
3.将对应provisioning profile的所有的值全部设置好。
4.选择左手边Targets下面的项目名称,再次找到Build Settings,来到Code Signing Identity区域,确保所有的值都和新的provisioning profile可对应。使用cmd+Shift+2查看设备的provisioning profile是否可用
代码环节
接下来就开始进入编程模式了。我们需要对应用程序代理(app delegate)进行少量的修改,从而使得我们的应用可以接受到推送通知。步骤如下:
1.注册设备需要在app delegate的[application:didFinishLaunchingWithOptions:]方法中调用[application registerForRemoteNotificationTypes:]方法,代码如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Register for push notifications
[application registerForRemoteNotificationTypes:
UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeAlert |
UIRemoteNotificationTypeSound];
returnYES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {
NSLog(@"regisger success:%@", pToken);
//注册成功,将deviceToken保存到应用服务器数据库中,因为在写向ios推送信息的服务器端程序时要用到这个
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
// 处理推送消息
NSLog(@"userInfo == %@",userInfo);
NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
UIAlertView *createUserResponseAlert = [[UIAlertViewalloc] initWithTitle:@"提示"
message: message
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles: @"确认",
nil];
[createUserResponseAlert show];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Regist fail%@",error);
}
到这里一切顺利的话我们就可以在真机运行了,注册成功我们会得到iphone 的deviceToken,
步骤三、
接下来我们访问http://localhost/push/push.php
iphone就会接收到一条推送消息了,如果有问题的话就检查上面的操作步骤,特别是加红的部分
另外去除标记的方法为,在viewDidApper中加入
int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
if(badge > 0)
{
badge--;
[UIApplication sharedApplication].applicationIconBadgeNumber = badge;
}
推送服务器端PHP实现
PHP代码文件,p12文件转pem文件,在前面已经说过了,把pem文件和php文件放在同一个目录中
<?php
$deviceToken='752b3f41cb33aa1953e49556e2203f8bacac2eac7a78f611e143d6ddc610951d';
//推送方式,包含内容和声音
$body = array('aps' => array('alert' => '新年好. from PHP','badge' => 11,'sound'=>'default'));
//创建数据流上下文对象
$ctx = stream_context_create();
//设置pem格式文件
$pem ='aaa.pem';
//设置数据流上下的本地认证证书
stream_context_set_option($ctx,'ssl','local_cert', $pem);
$pass ='test';
//设置数据流上下的密码
stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);
//产品发布APNS服务器,gateway.push.apple.com
//测试APNS服务器,gateway.sandbox.push.apple.com
//socket通讯
$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
if (!$fp) {
echo '连接失败.';
return;
}
print '连接OK\n';
//载荷信息,JSON编码
$payload = json_encode($body);
//构建发送的二进制信息
$msg = chr(0) . pack('n',32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack('n',strlen($payload)) . $payload;
echo '发送消息:' . $payload .'\n';
fwrite($fp, $msg);
fclose($fp);
?>
BOOC 客户端与推送服务器端联合测试说明文档
一:BOOC 客户端测试 提供给 服务器 的文件
/DOC/aaa.pem ————(文件密码为:test)
/DOC/pusher.php
二:推送服务器端需求:
- PHP 或java实现 的推送服务器端
- 客户端测试时使用的pem格式文件
三:推送服务器端测试项:
客户端提供给推送服务器端 客户端设备ID——deviceToken
- ~/ api/mobile/action.php 页面是否能够接收到客户端提供的deviceToken
- 向指定的deviceToken 是否能够推送消息(在此之前可使用客户端提供的文件测试)
- 推送消息
四:客户端需要测试项:
接收推送消息的响应

浙公网安备 33010602011771号