首页 > 技术文章 > ios 推送证书的配置和制作

huangzizhu 2014-12-02 15:25 原文

iOS 消息推送 (Message) 证书设置指南

本文档包括:

  1. 创建App ID
  2. 创建并配置Provisioning Profiles
  3. 创建并配置Certificates
  4. 技术支持

1. 创建App ID

如果你已经拥有所需的App ID,请跳至创建并配置Provisioning Profiles

登陆Apple Member Center https://developer.apple.com/membercenter

a.选择Certificates, Identifiers & Profiles

Certificates, Identifiers & Profiles

b.选择Identifiers中的App IDs

Identifiers App IDs

c.创建Explicit App ID

Explicit App ID

d.App Services选择Push Notifications

App Services

至此bundle IdentifierIDApp ID已经创建完毕,最终形如下图: iOS App IDs

注意

上面在Member Center设置的App id需要和工程的bundle Identifier一致 Xcode bundle Identifiers

2. 创建并配置Provisioning Profiles

a.选择Development(如果是发布上线,需要选择Distribution)

Provisioning Profile Development

b.创建新的Provisioning Profiles,并选择之前生成好的App ID

Create Provisioning Profile 
Select App ID

c.选择你自己的开发证书,并选择好需要调试Push的开发设备


Config Provisioning Profile

注意 
1、如果需要的设备不在列表中,需要通过左侧的Devices中手动添加,或者通过XCode的Organizer自动添加。
2、Provisioning Profiles创建完成后是可以重新编辑更新的

d.下载刚刚创建Provisioning Profiles,并双击导入至电脑

e.在XCode的Target中对应Build Settings选择这个Provisioning Profiles

XCode Build Setting Provisioning Profile
如果电脑中有Provisioning Profiles中引用的证书,XCode会自动选择相应的证书对代码进行签名

至此iOS Push Notification客户端的配置就完成了,如果你一切配置正确,第一次真机启动应用时会弹出是否允许消息通知的提示框。

3. 创建并配置Certificates

a.创建certSigningRequest

a1.在Mac中开启“钥匙串访问(keychain)”应用,并从证书助理中选择“从证书颁发机构请求证书”

KeyChain Request

a2.填写邮件地址、名称并保存到磁盘

Create certSigningRequest

b.根据certSigningRequest创建Certificates

b1.回到Apple Member Center选择Development证书(如果是发布上线,需要选择Distribution)

Certificates development

b2.选择证书的类型“Apple Push Notification service SSL (Sandbox)”

Apple Push Notification service SSL

b3.选择之前创建的AppId

Certificates, App ID

b4.下一步提示创建certSigningRequest,我们已经创建完毕,直接下一步选择即可

Create CSRGenerate Certificater

b5.没有问题的话,便创建成功,下载至本地并导入钥匙串访问(KeyChain)即可

Import KeyChain

c.导出p12证书

c1.在钥匙串访问(KeyChain)的我的证书中选择刚刚导入的证书,选择导出,注意不要选中私钥,并设置相应密码即可

Export Certificates

最后导出包含证书和密钥的p12文件

命名为 apns-dev-gmbridge.p12

生成这个之后后台同学需要的文件格式是pem文件,需要做一个转换

pem文件是服务器向苹果服务器做推送时候需要的文件,主要是做服务器的同学要用,下面介绍一下pem文件的生成。

  • 打开Keychain Access,在Certificates里面找到上篇文章中介绍的包含推送的证书。分别将certificate和private key导出得到.p12文件。例如:Apple Development Push Services > Export “Apple Development Push Services ID123”,保存为 apns-dev-cert.p12。对“Private Key”做同样操作,保存为 apns-dev-key.p12 文件。
  • 需要通过终端命令将这些文件转换为PEM格式:
    openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
    openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
    此处要求输入一个密码,输入123456.
  • 移除密码(上面的123456)
    openssl rsa -in apns-dev-key.pem -out apns-dev-key.pem
  • 最后,你需要将键和许可文件合成为apns-dev.pem文件,此文件在连接到APNS时需要使用:
    cat apns-dev-cert.pem apns-dev-key.pem > apns-dev.pem

同样 Distribution Certificate 的pem文件生成方式一样。
openssl pkcs12 -clcerts -nokeys -out apns-dis-cert.pem -in apns-dis-cert.p12
openssl pkcs12 -nocerts -out apns-dis-key.pem -in apns-dis-key.p12
openssl rsa -in apns-dis-key.pem -out apns-dis-key.pem
cat apns-dis-cert.pem apns-dis-key.pem > apns-dis.pem
 
接受push通知还需要真机的token
使用下面这个代码可以打印出token, 在
didRegisterForRemoteNotificationsWithDeviceToken
这个函数里面

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];

    ViewController *controller = [[ViewController alloc] init];
    self.window.rootViewController = controller;
    
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability)];
    
    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    NSLog(@"My token is:%@", token);
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
    
    NSString *error_str = [NSString stringWithFormat: @"%@", error];
    NSLog(@"Failed to get token, error:%@", error_str);
}

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

 

推荐阅读