全部文档

更新时间: 2021-02-19

# 功能描述

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

流转图:

# 配置说明

# 申请证书及配置文件
# 创建 App ID
  1. 访问 苹果开发者网站 (opens new window),点击 Account 登陆进入账户页面。

  2. 点击 Certificates, Identifiers & Profiles

  3. 点击左侧菜单栏 Identifiers,然后点击 +

  4. 选中 App IDs,然后点击 Continue

  5. 填写 Description,选择 Explicit,并填写 Bundle ID

  6. Capabilities 中勾选 Push Notifications,然后点击 Continue

  7. 确认信息并点击 Continue

  8. 确认信息并点击 Register

  9. 注册成功后可在 Identifiers 找到注册的 App ID

# 创建推送证书
  1. 点击 Certificates,然后点击 +

  2. Services 中找到需要创建的证书种类,此处我们以 Sandbox & Production 为例。

  3. 为证书绑定 App ID,然后点击 Continue

  4. 此处需要我们上传 Certificate Signing Request 文件,文件创建参考第 5 步。

  5. 找到 Mac 应用中的 钥匙串访问

  6. 点击 钥匙串访问,选择 证书助理,再选择 从证书颁发机构请求证书

  7. 填入相关信息,点击 继续

  8. 点击 存储

  9. 点击 Choose File,然后上传 CertificateSigningRequest.certSigningRequest 文件,然后点击 Continue

  10. 点击 Download

  11. 双击 cer 文件,在钥匙串的左侧选择 登陆证书 ,然后可以在右侧列表中找到类似下图中的信息,然后右键导出为 p12 文件。

    • 开发 & 生产环境证书名为:Apple Push Services:xxx.xxx.xxx
    • 开发环境证书名为:Apple Development IOS Push Services:xxx.xxx.xxx
# 创建配置文件
  1. 点击 Profiles,然后点击 +

  2. 选择对应环境,然后点击 Continue

  3. 为配置文件关联 App ID,然后点击 Continue

  4. 选择开发者证书,然后点击 Continue

  5. 选择要安装的设备,点击 Continue

  6. 填写 Profile Name,点击 Generate

  7. 点击 Download

  8. 双击下载的 Provisioning Profile 文件,添加到 Xcode,使用该 App ID 即可进行真机调试。

# 上传推送证书
  1. 开发者可前往 开发者后台 (opens new window),点击 应用标识 并找到当前需要集成的项目,然后点击 设置推送,如果未创建可点击 添加

  2. 开发者在点击了 设置推送 或者 添加 之后,需要在此页面填写如下信息并保存。

    • 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];
已复制
1
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];
}
已复制
1
2
3

设置 deviceToken:

如果您的 SDK 版本已升级到 2.9.25,请使用下面这种方式:

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [[RCIMClient sharedRCIMClient] setDeviceTokenData:deviceToken];
}
已复制
1
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;
}
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 测试推送

开发者在集成完上述文档之后,可直接测试推送是否集成成功。

  1. deviceToken 是唯一标识客户端的凭证,所以必须上传应用服务器才能使用远程推送。
  2. 模拟器收不到远程推送。
  3. 越狱的设备 APNs 服务不能保证,所以不一定能收到远程推送。
  4. APNs 使用 BundleID 区分 App,使用通配符 BundleID 的 App 将无法使用远程推送,参考 创建 App ID 中第 5 步。
# 开发环境测试

测试步骤如下:

  1. APP 连接融云成功之后杀掉 APP 进程。
  2. 消息服务 (opens new window) 直接发送一条单聊消息内容。
  3. 查看手机是否收到本 APP 的推送。
  4. 如果未收到,请查看上述文档是否正确集成,或可直接提交工单 (opens new window) 并提供您的消息 ID
# 生产环境测试

方案一:

如果 App 是 App-Store 类型的,但是还没有在 App Store 上架,在上架之前如果想使用生产环境测试远程推送,需要生成一个 Ad-HocProvisioning 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"
}
已复制
1
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为远程推送的内容
}
已复制
1
2
3

点击通知栏的远程推送时,如果此时 App 已经被系统冻结,开发者可使用下面方式获取:

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 远程推送的内容
    NSDictionary *remoteNotificationUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];

    ...

    return YES;
}
已复制
1
2
3
4
5
6
7
8
9

# 自定义

# 声音与振动

推送声音,用户收到推送消息时的通知提示音,融云消息推送提示声音与振动,默认为手机系统设置的声音与振动提示状态。

在 iOS 平台下,开发者可通过 开发者后台 (opens new window) - 应用标识 - 自定义 Push 声音中,输入自定义声音名保存设置,同时需要开发者将自己创建的声音一同打包到应用程序中即可。

# 自定义铃声设置

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

此操作需要开发者将自己创建的声音一同打包到应用程序中。

# 推送显示内容

开发者如果想自定义远程推送的推送内容。可以在消息发送时进行处理。

  1. 如果是使用 SDK 默认的 UI 操作发送的消息,开发者可拦截下面方法处理:
- (RCMessageContent *)willSendMessage:(RCMessageContent *)messageContent{
    
    [[RCIM sharedRCIM] sendMessage:self.conversationType targetId:self.targetId content:messageContent pushContent:@"自定义推送内容" pushData:nil success:^(long messageId) {
        
    } error:^(RCErrorCode nErrorCode, long messageId) {
        
    }];
    
    return nil;
}
已复制
1
2
3
4
5
6
7
8
9
10
  1. 如果开发者是自己调用发送接口发送的消息,可直接修改 pushContent 内容。
# 推送显示样式

开发者可设置推送显示样式,需要开发者自行创建 Notification Extension。

文档是否解决您的问题 ?

如果遇到产品相关问题,您可 提交工单 寻求帮助