IOS推送

1、要注意顺序问题,一定要按照这个顺序来:

生成钥匙串请求 -->配置下载开发证书-->  配置App ID ,配置、下载SSL证书-->Provisioning证书

生成钥匙串请求

1)在应用程序里的使用工具中找到钥匙串访问。

 

2)填写你的邮箱和常用名称,常用名要记一下,CA电子邮件地址保持默认,并选择保存到硬盘。

3)点击继续。

4)保存位置在桌面,点击存储。

到这里点击完成后我们会在桌面上看到一个Push.certSigningRequest的请求文件,也就是我们说的CSR文件。在我们生成CSR文件的同时,会在钥匙串访问中生成一对秘钥,名称为刚才我们填写的常用名。

配置App ID ,配置、下载SSL证书

1) 使用开发者帐号登录IOS Provisioning ,选择或新建一个App Id

2) 创建完后,进入App Id列表,可以看到新建的App Id默认是没有激活推送功能的,点击Edit进入编辑页面,

3)点击Development Push SSL Certificate一行后的Create Certificate...,进入推送功能激活页面

4)点击Continue:

5)选择前面生成好的Push.certSigningRequest文件,点击Generate

6)点击Continue

7)点击Download,文件名为aps_developer.cer,我们把他放在桌面。

8)点击Done,你会发现状态变成了Enabled:

现在我们的开发证书已经配置并下载好了,发布证书的配置过程和开发证书是一致的。

下载完后双击,会跳到钥匙串访问里。这就是我们之后要进行测的证书。

下载Provisioning证书

1)到Provisioning标签下查看证书是否支持Push Notification

2)重新下载Provisioning证书并导入到Xcode中,如果调试是出现“未找到应用程序的授权字符串”。

而且Bundle Identifier、Code Signing指定的开发证书绑定的AppId要和推送证书绑定的AppId一致

p12文件

1)导出密钥

2)右键选择导出

3)导出的文件名我们叫做Push

4)在这里需要输入一个密码来对文件进行加密。这里我们选择123321,当然你也可以自己选择是什么,但是这个密码必须要铭记,切记!

5)然后输入你电脑的密码,点击允许。

这样我们就在桌面上生成了一个Push.p12文件

到此为止,我们在桌面上一共生成了三个文件。一个是CSR请求文件,一个是aps_development .cer的SSL证书文件,还有一个刚才生成的Push.p12秘钥文件。

 

测试代码:

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

 

     if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){

        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings
                                                                             settingsForTypes(UIUserNotificationTypeSound | 
 UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)  categories:nil]];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }
    else
    {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
    }

 

    return YES;

 

}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {

    NSLog(@"regisger success:%@", pToken);

    //注册成功,将deviceToken保存到应用服务器数据库中

}

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

    // 处理推送消息

    UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"通知" message:@"我的信息" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:nilnil];

    [alert show];

    [alert release];

NSLog(@"%@", userInfo);

}

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

    NSLog(@"Regist fail%@",error); 

}

到这里一切顺利的话我们就可以在真机运行了,注册成功我们会得到iphone 的deviceToken

处理证书

现在我们的准备工作已经做完了。要开始对生成的文件进行处理了。原因上面已经解释过,因为我们的服务链接苹果服务器也是需要证书的,但是我们直接生成的证书windows系统(我们一般的服务器都是win系统的)是不识别的,所以我们需要生成一个后缀为pem的带证书带秘钥的文件。

打开终端,cd到我们那三个文件所在的位置

1)把.cer的SSL证书转换为.pem文件,执行命令:

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

2)把私钥Push.p12文件转化为.pem文件:

openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12

3)对生成的这两个pem文件再生成一个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服务。如果你看到上面的反馈,那说明你的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:

我们输入123321按回车

当你在最后的时候你看到这样说明你已经成功了:

CONNECTED(00000003)

depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa isincorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust CertificationAuthority - L1C

verify error:num=20:unable to get local issuercertificate

verify return:0

……省略……

SSL-Session:

    Protocol  : TLSv1

    Cipher    : AES256-SHA

    Session-ID:

    Session-ID-ctx:

    Master-Key:C7A47EED5E1F5……省略……369D4

    Key-Arg   : None

    Start Time:1361862882

    Timeout   : 300 (sec)

    Verify return code: 0 (ok)

在这里提醒一下,也许你会看到像我这样的提示:verify error:num=20:unable to get local issuercertificate

verify return:0

其实是没问题的。

 

 

另外去除标记的方法为,在viewDidApper中加入

int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;

    if(badge > 0)

    {

        badge--;

        [UIApplication sharedApplication].applicationIconBadgeNumber = badge;

    }

 

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。