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 是否能够推送消息(在此之前可使用客户端提供的文件测试)
  • 推送消息

 

 

四:客户端需要测试项:

 接收推送消息的响应

 

posted @ 2014-07-08 08:43  战时事  阅读(415)  评论(0)    收藏  举报