现在的位置: 首页 > 综合 > 正文

Apple Push Notification Service(APNS)开发指引

2013年10月31日 ⁄ 综合 ⁄ 共 3088字 ⁄ 字号 评论关闭

一.前期准备

1.从Keychain中选择Keychain Access > Certificate Assistant > Request a Certificate From a Certificate Authority...

填写User email(apple开发者帐号)/Common name(key的名字),选择Save to Disk,保存到Desktop,一定要有个复选框出来的!完成后会在钥匙串种加入2个密钥

2.做完上一步,Keychain会增加一个key,在Keychain中找到Key栏,将1中生成的private key导出为.p12文件,比如Test_Push_Notifier_PrivateKey.p12

3.登录developer.apple.com的iOS portal,申请AppID,需要具体到com.XXX.XXX,即不允许最后一个字段为模糊匹配

随后对该AppID进行配置,选中Push Notification,上传前面生成的CSR文件,Portal会自动生成aps_development.cer,下载aps_development.cer

4.在Portal上生成新的Provision,将AppID选中为com.XXX.XXX,并下载新的test.mobileprovision文件,并导入到Xcode之中

5.现在我们有两个文件:Test_Push_Notifier_PrivateKey.p12/aps_development.cer。打开终端,使用openssl对两个文件进行加密:

加密aps_development.cer:

openssl x509 -in aps_development.cer -inform der -out cer_dev.pem

        加密Test_Push_Notifier_PrivateKey.p12

                openssl pkcs12 -nocerts -in Test_Push_Notifier_PrivateKey.p12 -out key.pem

        PHP服务端则将两者合并:

                cat cer_dev.pem key.pem > Push_Notifier.pem

        java服务端要转化为p12格式,用以下命令转化:

openssl pkcs12 -export -in cer_dev.pem -inkey key.pem -out cred_dev.p12

6.测试ApplePushServer正常:

        telnet gateway.sandbox.push.apple.com 2195

7.测试加密证书工作正常:

        openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert cer_dev.pem -key key.pem

二.客户端开发

需要实现的代码和覆盖的方法

1.在AppDelegate.m中修改-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions 

函数体中添加:

        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert)];

2.在AppDelegate.m中添加下列函数:

        -(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken

        {

                NSLog(@"我的设备ID: %@", deviceToken);

        }

        -(void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error

        {

                NSLog(@"注册失败,无法获取设备ID, 具体错误: %@", error);

        }

3.连接设备,运行一次程序,获得deviceToken号码,应该是64个16进制的数,记下来。

4.启动方式和调用方法

程序开启 --> 前台运行-->notification --> didReceiveRemoteNotification 

不更改Application的badge Number

程序开启 --> 后台运行 -->notification --> App出提示,并更改application的badge Number --> 点应用程序图标 --> applicationDidBecomeActive 

程序开启 --> 后台运行 -->notification --> App出提示,并更改application的badge Number --> 点上面出现的提示,或者下拉菜单提示,或者点击alert框的确定--> didReceiveRemoteNotification --> applicationDidBecomeActive 

程序关闭 -->notification --> App出提示,并更改application的badge Number --> 点上面出现的提示,或者下拉菜单提示,或者点击alert框的确定--> didFinishLaunchingWithOptions --> applicationDidBecomeActive 

可以在didFinishLaunchingWithOptions中判断是否是apns来启动的

  NSDictionary* pushInfo = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"]; 
        //获取推送详情
        NSString *pushInfo = [[NSString stringWithFormat:@"%@",[pushInfo  objectForKey:@"aps"]];

在程序中如果要根据apns信息来做修改,就需要注意这样的流程,每个启动方式所调用的方法是不同的。

三.服务器端开发

服务器端 java第三方开发

https://github.com/notnoop/java-apns

四.注意事项

1.production和developer的token是不一样的,需要用ad hoc来beta测试下

2.要将token上传给服务器,服务器要用,此外苹果也不能保证token会保证不变,所以最好将保留过长的token删除再同步次服务器。

3.发布前要将push地址改掉

测试用:gateway.sandbox.push.apple.com 2195

发布用:gateway.push.apple.com 2195

4.不要迷信APNS,苹果不是快递公司保证每个用户签收。

5.接受2196的端口是苹果每次push后会记录下用户收到状况,如果用户已经没有安装这个应用了,则会在服务器保留信息,等服务端访问2196端口,会将这些设备TOKEN传送过来,这样服务端可以将这些设备给disable掉

【上篇】
【下篇】

抱歉!评论已关闭.