iOS

iOS推送证书设置指南

Posted by Nick Deng on 2017-03-27

创建 App ID

点击Certificates, IDs & Profiles图标

  • 在证书管理界面创建相应的 APPID,Bundle ID 与项目对应即可

选择APPIDs选项

  • 创建 App ID,如果已经自动创建好了可以跳过这一步骤

点击 ➕

创建App ID,Bundle ID与项目对应即可

  • 在创建 App ID 的时候在 App Services 内勾选 Push Notifications 功能,申请推送权限
    勾选Push Notifications

到这里 App ID 已经创建完毕


配置和下载证书

  • 选择证书管理界面 点击 ➕ 创建一个新的证书
    Snip20170305_9.png

  • 我们直接选择创建一个测试证书

创建一个测试证书

  • 选择你刚刚的创建的 App ID

选择配置的App ID

  • 按照提示导出签名证书并上传

签名证书

  • 进入系统自带的钥匙串访问应用,点击 钥匙串访问 ->证书助理->从证书颁发机构请求证书
    请求证书

  • 填写相关信息,并且选择保存到本地磁盘

保存到磁盘

  • 回到将刚刚请求完的证书上传至刚刚的页面

选择.certSigningRequest上传

  • 点击 download 获取 aps.cer 证书文件

获取 aps.cer

  • 双击 aps.cer 文件,会自动打开钥匙串程序

双击aps.cer文件

  • 鼠标右击,点击导出 p12 证书

导出p12证书

  • 自定义一个密码用来保护 p12 证书

设定密码

到此推送的 p12 证书已经创建完毕了,可将该证书上传至服务器


Provisioning Profile 的创建

  • 创建 Provisioning Profile 的前提是已经创建了待发布应用所使用的 Bundle ID 的 App ID,而且为该 App ID 创建了 APNs 证书,也就是完成了我上面叙述的几个步骤,这个时候我们就可以来创建 Provisioning Profile 了。

  • 选择 Provisioning Profile,点击 ➕ 进行创建

Snip20170305_29.png

  • 这个地方红框中框出的选项依次代表
  1. 开发测试环境
  1. 上传到 appstore 的生产环境(如果是企业证书这里会是 In House)
  2. 用于内部测试的生产环境

这里我们选择测试环境

  • 选择对应的 App ID

选择对应的App ID

  • 选择所属的开发者证书
    选择所属的开发者证书

  • 为该 Provisioning Profile 选择将要安装的设备
    选择将要安装的设备

  • 给该 Provisioning Profile 填写名称
    填写名称

  • 创建完成点击下载
    创建完成

  • 线上环境的创建方式相同,你可以在填写名称时表明时测试环境还是先上环境


Xcode 配置

  • 双击下载下来的 Provisioning Profile,可以添加到 xcode

  • 点击项目,选择目标 TARGETS 后进入 Build Setting 界面,搜索“Code signing”,加载创建 Provisioning Profile 时指定的开发者证书

指定开发者证书

  • 导入对应的 Provisioning Profile debug 导入沙盒环境的 Provisioning Profile,release 导入生产环境的 Provisioning Profile

导入Provisioning Profile

  • 在 xcode Capabilities 开启推送功能

Capabilities 开启推送

接入云信 apns 推送

  • 完成相应证书配置

  • 登陆云信后台 云信后台,进入证书管理界面

进入云信证书管理

  • 在标识管理中填入自己应用的 Bundle ID

Bundle ID填写

  • 将导出的好的 p12 证书上传到云信后台,需要注意证书一定要与项目中的环境对应,沙盒证书对应测试环境,生产证书对应线上环境,如果出现错误会导致推送收不到

上传证书

#复习一下导出 p12 证书

  • 点击 download 获取 aps.cer 证书文件

获取 aps.cer

  • 双击 aps.cer 文件,会自动打开钥匙串程序

双击aps.cer文件

  • 鼠标右击,点击导出 p12 证书

导出p12证书

  • 自定义一个密码用来保护 p12 证书

设定密码

到此推送的 p12 证书已经创建完毕了,可将该证书上传至服务器

编写推送代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//
// AppDelegate.m
// YXPushTester
//
// Created by Nick Deng on 2017/3/5.
// Copyright © 2017 UnclePluto. All rights reserved.
//

#import "AppDelegate.h"
#import "NIMSDK.h"

@interface AppDelegate () <NIMLoginManagerDelegate>

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%@",launchOptions);
#if defined(DEBUG)||defined(_DEBUG)
// debug环境初始化sdk并声明后台上传的证书名
[[NIMSDK sharedSDK] registerWithAppID:@"你的appkey" cerName:@"云信后台上传的测试证书名"];
#else
// release 环境初始化sdk并声明后台上传的证书名
[[NIMSDK sharedSDK] registerWithAppID:@"你的appkey" cerName:@"云信后台上传的线上证书名"];
#endif
[[[NIMSDK sharedSDK] loginManager] addDelegate:self];
// 向苹果服务器注册apns服务
[self registerAPNs];
// 登陆一个云信账号,只有成功登陆后才可以收到云信推送
[[[NIMSDK sharedSDK] loginManager] login:@"account"
token:@"password"
completion:^(NSError *error) {
NSLog(@"%@",error);
}];
return YES;
}

// 设置登陆回调监听
- (void)onLogin:(NIMLoginStep)step{
NSLog(@"%ld",(long)step);
}

// 注册具体实现
- (void)registerAPNs
{
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerForRemoteNotifications)])
{
UIUserNotificationType types = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types
categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
UIRemoteNotificationType types = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
}
}


// 注册成功 苹果服务器下发deviceToken
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
// 将deviceToken 上传至云信服务器。这样云信服务器才知道推送到哪个设备
[[NIMSDK sharedSDK] updateApnsToken:deviceToken];
NSLog(@"didRegisterForRemoteNotificationsWithDeviceToken: %@", deviceToken);

}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
NSLog(@"receive remote notification: %@", userInfo);
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
NSLog(@"fail to get apns token :%@",error);
}


@end

```