更新时间: 2021-03-08
# 功能描述
当 App 进入后台 2 分钟之后或被杀进程或被冻结,SDK 将处于后台暂停状态。此时融云的长连接通道会断开,融云 Server 会通过 APNs 将消息以远程推送的形式下发到客户端。 此状态下如果有人给该用户发送消息,融云的服务器会根据 deviceToken 和推送证书将消息发送到苹果推送服务器,苹果服务器会将该消息推送到客户端。
流转图:

# 配置说明
# 申请证书及配置文件
# 创建 App ID
访问 苹果开发者网站 (opens new window),点击
Account
登陆进入账户页面。点击
Certificates, Identifiers & Profiles
。点击左侧菜单栏
Identifiers
,然后点击+
。选中
App IDs
,然后点击Continue
。填写
Description
,选择Explicit
,并填写Bundle ID
。在
Capabilities
中勾选Push Notifications
,然后点击Continue
。确认信息并点击
Continue
。确认信息并点击
Register
。注册成功后可在
Identifiers
找到注册的App ID
。
# 创建推送证书
点击
Certificates
,然后点击+
。在
Services
中找到需要创建的证书种类,此处我们以Sandbox & Production
为例。为证书绑定 App ID,然后点击
Continue
。此处需要我们上传
Certificate Signing Request
文件,文件创建参考第 5 步。找到 Mac 应用中的
钥匙串访问
。点击
钥匙串访问
,选择证书助理
,再选择从证书颁发机构请求证书
。填入相关信息,点击
继续
。点击
存储
。点击
Choose File
,然后上传CertificateSigningRequest.certSigningRequest
文件,然后点击Continue
。点击
Download
。双击
cer
文件,在钥匙串的左侧选择登陆
和证书
,然后可以在右侧列表中找到类似下图中的信息,然后右键导出为p12
文件。- 开发 & 生产环境证书名为:
Apple Push Services:xxx.xxx.xxx
- 开发环境证书名为:
Apple Development IOS Push Services:xxx.xxx.xxx
- 开发 & 生产环境证书名为:
# 创建配置文件
点击
Profiles
,然后点击+
。选择对应环境,然后点击
Continue
。为配置文件关联 App ID,然后点击
Continue
。选择开发者证书,然后点击
Continue
。选择要安装的设备,点击
Continue
。填写
Profile Name
,点击Generate
。点击
Download
。双击下载的
Provisioning Profile
文件,添加到Xcode
,使用该App ID
即可进行真机调试。
# 上传推送证书
开发者可前往 开发者后台 (opens new window),点击
应用标识
并找到当前需要集成的项目,然后点击设置推送
,如果未创建可点击添加
。开发者在点击了
设置推送
或者添加
之后,需要在此页面填写如下信息并保存。- Bundle Identifier
- 推送证书
- 推送证书密码
其他项为选填项。
推送证书是开发者导出的 p12 证书,且不支持环境互换,开发环境只能上传开发证书,生产环境上传生产证书,导出时不建议设置证书密码为空。

# 请求推送权限
请求推送权限:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) { if (granted) { //点击允许 [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { }]; } else { } }]; }else if ([[UIDevice currentDevice].systemVersion floatValue] >8.0){ //iOS8 - iOS10 [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]]; } // 注册获得device Token [application registerForRemoteNotifications];
已复制
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{ [application registerForRemoteNotifications]; }
已复制
2
3
设置 deviceToken:
如果您的 SDK 版本已升级到 2.9.25,请使用下面这种方式:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [[RCIMClient sharedRCIMClient] setDeviceTokenData:deviceToken]; }
已复制
2
3
如果您的 SDK 版本未升级到 2.9.25,请使用下面这种方式:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [self getHexStringForData:deviceToken]; [[RCIMClient sharedRCIMClient] setDeviceToken:token]; } // Data 转换成 NSString(NSData ——> NSString) - (NSString *)getHexStringForData:(NSData *)data { NSUInteger len = [data length]; char *chars = (char *)[data bytes]; NSMutableString *hexString = [[NSMutableString alloc] init]; for (NSUInteger i = 0; i < len; i ++) { [hexString appendString:[NSString stringWithFormat:@"%0.2hhx", chars[i]]]; } return hexString; }
已复制
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 测试推送
开发者在集成完上述文档之后,可直接测试推送是否集成成功。
- deviceToken 是唯一标识客户端的凭证,所以必须上传应用服务器才能使用远程推送。
- 模拟器收不到远程推送。
- 越狱的设备 APNs 服务不能保证,所以不一定能收到远程推送。
- APNs 使用 BundleID 区分 App,使用通配符 BundleID 的 App 将无法使用远程推送,参考 创建 App ID 中第 5 步。
# 开发环境测试
测试步骤如下:
- APP 连接融云成功之后杀掉 APP 进程。
- 在 消息服务 (opens new window) 直接发送一条单聊消息内容。
- 查看手机是否收到本 APP 的推送。
- 如果未收到,请查看上述文档是否正确集成,或可直接提交工单 (opens new window) 并提供您的消息 ID
# 生产环境测试
方案一:
如果 App 是 App-Store
类型的,但是还没有在 App Store 上架,在上架之前如果想使用生产环境测试远程推送,需要生成一个 Ad-Hoc
的 Provisioning Profile
,并在 Xcode 中使用其进行打包,导出为 Ad Hoc Deployment
。参考 官方文档 (opens new window)。
方案二:
开发者可使用 TestFlight
模式进行测试。参考 官方文档 (opens new window)。
# 获取推送内容
# 内容格式
融云消息的远程推送内容格式如下:
{ "aps" : { "alert" : "You got your emails.", "badge" : 1, "sound" : "default" }, "rc":{ "cType":"PR", "fId":"2121", "oName":"RC:TxtMsg", "tId":"3232", "rId":"3243", "id":"5FSClm2gQ9V9BZ-kUZn58B", "rc-dlt-identifier":"2FSClm2gQ9Q9BZ-kUZn54B" }, "appData":"xxxx" }
已复制
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
数据说明:
参数 | 类型 | 说明 |
---|---|---|
alert | String | 远程推送显示的内容。自带的消息会有默认显示,如果您使用的是自定义消息,需要在发送时设置。对应于 iOS 发送消息接口中的 pushContent。 |
cType | String | 会话类型。PR 指单聊、 DS 指讨论组、 GRP 指群组、 CS 指客服、SYS 指系统会话、 MC 指应用内公众服务、 MP 指跨应用公众服务。 |
fId | String | 消息发送者的用户 ID。 |
oName | String | 消息类型,参考融云消息类型表.消息标志;可自定义消息类型。 |
tId | String | 为 Target ID。 |
rId | String | 为接收者的用户 ID。 |
id | String | 当前推送的消息唯一标识,对应消息路由功能中的 msgUID。 |
rc-dlt-identifier | String | 当发送的是一条撤回消息推送时,为需要撤回消息的 ID,对应消息路由功能中的 msgUID。 |
appData | String | 远程推送的附加信息,对应于 iOS 发送消息接口中的 pushData。 |
# 内容获取
点击通知栏的远程推送时,如果 App 未被系统冻结,开发者可使用下面方式获取:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { // userInfo为远程推送的内容 }
已复制
2
3
点击通知栏的远程推送时,如果此时 App 已经被系统冻结,开发者可使用下面方式获取:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 远程推送的内容 NSDictionary *remoteNotificationUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; ... return YES; }
已复制
2
3
4
5
6
7
8
9
# 自定义
# 声音与振动
推送声音,用户收到推送消息时的通知提示音,融云消息推送提示声音与振动,默认为手机系统设置的声音与振动提示状态。
在 iOS 平台下,可通过 开发者后台 (opens new window)设置,在 服务管理
的 应用标识
下找到对应的应用,点击 设置推送
并在 自定义 Push 声音
中输入自定义声音名,保存设置。
此操作需要开发者将自己创建的声音一同打包到应用程序中。

# 自定义铃声设置
融云支持按消息类型自定义设置推送铃声,需要在融云开发者后台 (opens new window)自定义推送铃声中设置,设置成功后,所有 iOS 用户离线状态下接收的该类型消息,都会使用设置的自定义铃声进行提醒。

此操作需要开发者将自己创建的声音一同打包到应用程序中。
# 推送显示内容
开发者如果想自定义远程推送的推送内容。可以在消息发送时直接修改 pushContent
内容。
# 推送显示样式
开发者可设置推送显示样式,需要开发者自行创建 Notification Extension。