集成 APNs 远程推送
融云服务端已集成 APNs 服务端功能。当 App 被杀进程,或者在后台被挂起,或者在后台存活超过 2 分钟,SDK 长连接通道会断开,此时融云服务端可将消息通过 APNs 通道通知客户端。
融云服务端对 APNs 的支持
融云服务端支持与 Apple APNs 服务端的以下验证方式:
类别 | 区别 | 必要凭证 |
---|---|---|
使用验证令牌(P8) | APNs 侧对基于令牌的推送请求处理更快。同一帐户下的应用程序可以使用同一个 P8 证书,不区分沙盒与生产环境。P8 证书永久有效。 | 您需要从 Apple 开发人员账户中获取签名密钥(.p8 后缀的文本文件),并提供给融云。融云将使用您的密钥对 APNs 推送请求中的 Token 进行签名。 |
使用 TSL 证书(P12) | 必须与 Apple App ID 绑定,仅可用于该 App。APNs 证书可以只支持沙盒环境(P12 证书),同时支持生产环境和沙盒环境(P12 通用证书)。有效期一年。 | 您可以从 Apple 开发人员账户获取该证书,并提供给融云。融云将使用该证书与 APNs 进行身份验证。证书在一年后过期,请务必在过期前创建新证书,然后将其提供给融云。 |
以上内容摘自 Apple 官方开发者文档。如有疑问,详见 Apple 开发者帐户帮助:使用验证令牌与 APNs 通信 与 使用 TLS 证书与 APN 通信。
下图以使用 TSL 证书为例,说明融云离线消息触发 APNs 推送的流程:
Apple 开发者账户的操 作
您必须持有 App ID 才能使用 APNs 推送服务。以下描述了如何从 Apple 开发者账户页面创建 App ID,以及为 App ID 启用 Push Notifications(推送通知功能)。
创建 App ID
如已持有 App ID,请跳过此步骤,直接查看启用 App ID 的推送功能。
以下步骤描述如何从 Apple 开发者账户创建 App ID:
-
在 Certificates, Identifiers & Profiles(证书、标识符和描述文件)中,点按边栏中的 Identifiers (标识符),然后点按左上方的添加按钮 (+)。
-
从选项列表中选择 App IDs(App ID),点按 Continue(继续)。
-
从选项中,确认已自动选择了 App ID 类型,然后点按 Continue(继续)。
-
在 Description(描述)栏位中输入 App ID 的名称或描述。请选择 Explicit App ID (精确 App ID),并在 Bundle ID 栏位中输入 App 的 Bundle ID。
您在这里输入的精确 App ID 应该与 Xcode 中目标的 Summary (摘要)面板中输入的 Bundle ID 一致。
-
Capabilities (功能)下面会显示您的 App 类型和可以使用的功能。选中相应的复选框,以启用您想要使用的 App 功能。
请勾选 Push Notifications 以启用推送通知功能。
-
点按 Continue(继续),检查注册信息,然后点按 Register(注册)。
关于上述创建 App ID 步骤的详细说明,可参考 Apple 开发者帐户帮助文档:注册 App ID。
启用 App ID 的推送功能
以下内容来自 Apple 开发者账户帮助文档: 启用推送通知。
以下步骤描述如何从 Apple 开发者账户为已有的 App ID 启用推送通知功能。如已启用,可跳过该步骤。
-
在 Certificates, Identifiers & Profiles(证书、标识符和描述文件)中,点按边栏中的 Identifiers (标识符),然后找到对应的 App ID 进行配置。
-
在 Capabilities 中勾选 Push Notifications。
启用 App ID 的推送功能后,请根据需要选择创建 P8 证书或者 P12 证书。
使用验证令牌(P8)
如需了解 “使用验证令牌与 APNs 通信”,可参见 Apple 开发者文档 Establishing a Token-Based Connection to APNs。以下步骤来自 Apple 开发者账户帮助文档: 创建并下载启用了 APNs 的私钥。
您需要从 Apple 开发人员账户中创建并下载用于 APNs 推送服务的私钥(.p8
后缀的文本文件,也称为 “P8 证书”)。
-
在 Certificates, Identifiers & Profiles(证书、标识符和描述文件)中,点按边栏中的 Keys (密钥),再点按左上方的添加按钮 (+)。
-
在 Key Name(密钥名称)下面,为密钥输入唯一的名称。勾选 Apple Push Notifications service (APNs),以启用 APNs 服务,再点按 Continue(继续)。
-
检查密钥配置,再点击 Confirm。
-
点按 Download(下载),立即生成并下载密钥文件。密钥会以文件扩展名为
.p8
的文本文件形式下载到本地。- 注意:请记录下 Key ID,后续需要使用。
- 警告:密钥只可下载一次,下载后将从您的开发者帐户中移除,因此请务必妥善保管。如果 Download(下载)按钮处于停用状态,则表示您已经下载过这个密钥。
-
点按 Done(完成)。
获取 .p8
文件后,您可以前往融云控制台上传文件。详见上传证书到融云。
使用 TSL 证书(P12)
如需了解 p12 证书及“使用 TLS 证书与 APNs 通信”,可参见 Apple 开发者文档 Establishing a Certificate-Based Connection to APNs。
创建 p12 证书需要先从本地创建证书签名请求 (CSR),再前往 Apple 开发者账户 上传 CSR 生成证书(.cer
)文件,下载到本地,在 Mac 上导出为 .p12
格式的证书。
创建证书签名请求
Mac 上的“钥匙串访问”让您可以创建证书签名请求 (CSR)。
-
打开 Mac 应用中的钥匙串访问,选择证书助理,再选择从证书颁发机构请求证书。
-
填写证书信息,并保存到磁盘。
- 在证书助理对话框中,在“用户电子邮件地址”栏位中输入电子邮件地址。
- 在常用名称栏位中,输入密钥的名称 (例如,RongCloud)。
- 将 CA 电子邮件地址栏位留空。
- 选取存储到磁盘, 然后点按继续。
生成 cer 格式证书
如有多个 App,则需要为每个 App 生成单独的客户端 TLS 证书。
本步骤描述如何从 Apple 开发者账户生成 .cer
后缀的推送证书。注意,本步骤创建的 .cer
文件必须转换为 .p12
后缀的文件后才能在融云控制台上传使用。
以下两种方式仅存在 UI 操作上的区别,任选一种即可。
-
方式一:从 Apple 开发账户的 Certificates(证书)页面操作,生成
.cer
文件。-
在 Certificates, Identifiers & Profiles(证书、标识符和描述文件)中,点按边栏中的 Certificates (证书),然后点按左上方的添加按钮 (+)。
-
选择证书种类,点按 Continue(继续)。
- Apple Push Notification service SSL(Sandbox):仅可向 APNs Sandbox 环境推送。仅可在融云控制台的环境使用此类证书,生产环境不允许使用此类证书。
- Apple Push Notification service SSL(Sandbox & Production):可向 APNs Sandbox 和 Production 环境推送,可在融云应用的开发环境和生产环境中使用。
-
选择需要生成证书的 App ID,点按 Continue(继续)。
-
在 Mac 上创建证书签名请求。如果您已按上文指导创建了 CSR 文件,可跳过这一步。
-
点击 Choose File(选取文件),将生成的请求证书(CSR文件)上传,点按 Continue(继续)。
-
点击 Download 将证书下载到本地。
-
-
方式二:从 Apple 开发账户的 Identifiers (标识符)页面操作,生成
.cer
文件。提示-
在 Certificates, Identifiers & Profiles(证书、标识符和描述文件)中,点按边栏中的 Identifiers (标识符),然后选择要设置的 App ID。
-
在 Capabilities(功能)下,确认已选中 Push Notifications (推送通知)复选框。
-
点按 Configure(配置),进入创建证书页面。选择需要配置证书的环境,点按 Create Certificate(创建证书)。APNs 提供生产与开发两个环境。
- Development SSL Certificate:仅可向 APNs Sandbox 环境推送。仅可在融云控制台的环境使用此类证书,生产环境不允许使用此类证书。
- Production SSL Certificate:可向 APNs Sandbox 和 Production 环境推送,可在融云应用的开发环境和生产环境中使用。
-
在 Mac 上创建证书签名请求。如果您已按上文指导创建了 CSR 文件,可跳过这一步。
-
点击 Choose File(选取文件),将生成的请求证书(CSR文件)上传,点按 Continue(继续)。
-
点击 Download 将证书下载到本地。
-
转换 cer 文件为 P12 格式证书
-
双击下载到本地的证书文件(
.cer
),证书会自动导入钥匙串中。证书的名称为Apple [Development/Production] iOS Push Services: [Bundle ID]
,或者Apple Push Services: [Bundle ID]
。 -
在 Mac 应用 钥匙串访问 中,左侧点击 登陆 和 证书,选择刚导入的证书,右键导出为扩展名为
.p12
的证书文件。 -
系统将显示一个对话框,提示输入将用于保护导出项目的密码。您在此输入的密码将在后续将 p12 证书上传到融云后台时使用,请务必记录该密码。
-
再输入一次证书密码,执行导出操作。
在融云控制台配置 APNs 推送
您需要将创建的 APNs Auth Key 文件(P8)或者 TSL 证书(P12)上传到融云后台,融云服务端才能与 APNs 通信,向 iOS 客户端发送推送通知。
-
前往 融云控制台,点击 应用标识 并找到当前需要集成的项目,然后点击 IM 服务>应用标识及推送设置>设置推送。如果未创建可点击 添加。
-
填写 Bundle Identifier。
-
如果您创建了 P8 证书文件,鉴权方式请选择 Token Authentication。具体步骤如下:
-
点击上传 P8 文件,选择您创建的 APNs 签名密钥
.p8
文件。 -
填写 Key ID(参见创建 p8 证书)。
-
填写 Team ID。您可以在 Apple 开发者账户 的 Membership 页面获取 Team ID。
-
-
如果您创建了 P12 证书文件,请注意融云应用的生产环境仅接受 APNs 通用证书(Sandbox & Production)。请根据证书类型和当前环境选择合适的鉴权方式:
- 如果上传 APNs 开发证书(Sandbox),请选择 P12 证书。
- 如果上传 APNs 通用证书(Sandbox & Production),请选择 P12 通用证书。
- 上传证书,填写证书密码。
- 如果在融云应用的开发环境中使用 APNs 通用证书(Sandbox & Production),请在推送环境中向 APNs 的 Sandbox 或 Production 环境推送。在生产环境使用 APNs 通用证书时,仅支持推送到 APNs 的 Production 环境,无需选择。
创建 Provisioning Profile 文件
您需要创建一个 Provisioning Profile(配置文件),才能在设备上运行您的应用程序,使用推送通知功能。您需要从 Apple 开发者账户创建并下载预置描述文件,然后在 Xcode 中安装预置描述文件。
-
在 Certificates, Identifiers & Profiles(证书、标识符和描述文件)中,点按边栏中的 Profiles (标识符),然后点按左上方的 添加按钮 (+)。
-
选择 Provisioning Profile 的环境后点按 Continue
-
选择要创建 Provisioning Profile 的 App ID 后,点按 Continue。
-
选择所属的开发者证书, 如果创建了多个,选择 Select All,点按 Continue。
-
为该 Provisioning Profile 选择将要安装的设备(一般选择 Select All),点按 Continue。
-
填写 Profile Name。建议命名为环境 + AppID,点击 generate 完成创建。
-
创建成功后,点击 Download 下载到本地。
-
双击下载的 Provisioning Profile 文件,添加到 Xcode。
客户端配置
请求推送权限
无论是本地推送还是远程推送,都需要申请权限。
- (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。融云服务器可以使用这个 token 将用向 Apple Push Notification 的服务器提交请求,然后 APNs 通过 token 识别设备和应用,将通知推给用户。
-
iOS 10 及以后,向 APNs 推送服务注册,以获取 device Token:
// iOS 10 及以后,注册获得device Token
[application registerForRemoteNotifications]; -
iOS 8-10,在 application:didRegisterUserNotificationSettings: 回调中向 APNs 推送服务注册,以获取 device Token:
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
[application registerForRemoteNotifications];
}
设置 device token
用户设备向 APNs 注册推送服务后,可获得 NSData
类型的 device Token。
请在 application:didRegisterForRemoteNotificationsWithDeviceToken: 回调中将该 device token 通过 setDeviceTokenData 提供给融云。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
[[RCIMClient sharedRCIMClient] setDeviceTokenData:deviceToken];
}
获取推送数据
如果 App 需要支持 iOS 版本 7+,可使用 didReceiveRemoteNotification:fetchCompletionHandler: 方法获取推送数据(userInfo
)。
在 iOS 10 及更高版本上,您需要使用 UNUserNotificationCenterDelegate
的两个 delegate 方法来获取通知信息。
-
如果 App 在前台,可以使用 userNotificationCenter:willPresentNotification:withCompletionHandler:,获取推送数据(
userInfo
)。 -
App 用户点击通知时可以使用 userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:,获取推送数据(
userInfo
)。/// ios >= 10.0
#pragma mark - UNUserNotificationCenterDelegate
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler NS_AVAILABLE_IOS(10_0){
// userInfo为远程推送的内容
completionHandler();
}
#endif
如果点击通知栏的远程推送时,App 已经被系统冻结,可使用下面方式获取:
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 远程推送的内容
NSDictionary *remoteNotificationUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
...
return YES;
}
App 可以通过 getPushExtraFromLaunchOptions 或 getPushExtraFromRemoteNotification 获取远程推送数据。
融云消息的远程推送内容格式如下:
{
"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"
}
参数 | 类型 | 说明 |
---|---|---|
alert | String | 远程推送显示的内容。自带的消息会有默认显示,如果您使用的是自定义消息,需要在发送时设置。对应于 iOS 发送消息接口中的 pushContent 。 |
cType | String | 会话类型。PR (单聊)、DS (讨论组)、GRP (群组)、 CS (客服)、SYS (系统会话)、 MC (应用内公众服务)、MP (跨应用公众服务)、PH (不落地通知)、UG (超级群)。 |
bId | String | 超级群的频道 ID。仅超级群消息的远程推送内容会携带该字段。如果消息不属于任何频道,则 bId 字段为空字符串。 |
fId | String | 消息发送者的用户 ID。 |
oName | String | 消息类型。融云内置消息类型(详见内置消息类型 中的 ObjectName )或自定义的消息类型。 |
tId | String | 为 Target ID。 |
rId | String | 为接收者的用户 ID。 |
id | String | 当前推送的消息唯一标识,对应消息路由功能中的 msgUID。 |
rc-dlt-identifier | String | 当发送的是一条撤回消息推送时,为需要撤回消息的 ID,对应消息路由功能中的 msgUID。 |
appData | String | 远程推送的附加信息,对应于 iOS 发送消息接口中的 pushData。 |