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

b.选择Identifiers中的App IDs

 

c.创建Explicit App ID

d.App Services选择Push Notifications

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

注意

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

2. 创建并配置Provisioning Profiles

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

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

 

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

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

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

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


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

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

3. 创建并配置Certificates

a.创建certSigningRequest

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

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

b.根据certSigningRequest创建Certificates

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

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

b3.选择之前创建的AppId

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

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

c.导出p12证书

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

最后导出包含证书和密钥的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


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 {
    
}