跳转至

配置推送

提示

为开发者工程接入 SDK 推送,共需完成下面 7 步:

  1. 开启服务
  2. 生成 p12 证书
  3. 上传 p12 证书
  4. 生成 provisioning profile
  5. 设置 provisioning profile
  6. 请求权限
  7. 允许推送

开启服务 登录 Apple Developer,进入 Identifiers 选择 App IDs

image image

开发者可以新建一个 AppID,或者在原有的 AppID 上增加 Push NotificationService

注意

AppBundleID 不能使用通配符,否则将无法使用远程推送服务。

image

开启远程推送服务

image

生成 p12 证书

选中应用的 AppID ,选择 Edit

image

Push Notification 下方有两个 SSL Certificate ,分别是用于开发环境和生产环境的远程推送证书。

image

点击 Create Certificate ,这时候会提示需要一个 Certificate Signing Request(CSR)

image

根据其说明,在 Mac 上打开钥匙串应用,在菜单中点击“从证书颁发机构请求证书”。

image

输入您的邮箱、姓名或公司名,选择保存到磁盘,点击继续,就会生成一个 *.certSigningRequest 文件。

image

然后返回 Apple Developer 网站,点击 Continue,上传生成的 .certSigningRequest 文件,点击 Generate ,即可生成推送证书。

image

按照上面同样的步骤,生成生产环境的推送证书。

image

注意

iOS 9.2 开始,Apple Developer 上生成的生产环境推送证书,名称为 Apple Push Services: XXX, 之前生成的生产环境推送证书名称为 Apple Production IOS Push Services: XXX

此时,可以在 Push Notification 下方看见目前每个环境对应的推送证书。

image

将上面的 SSL Certificate 都下载到 Mac 本地,双击打开,系统会将其导入钥匙串中。 打开钥匙串应用,选中对应的证书,右键选择导出。保存 P12文件时,可以为其设置密码,也可以不设置密码。

image

image

上传 p12 证书

在融云开发者平台,您需要在 App -> IM 服务 -> 应用标识 路径下,填写 iOS Bundle Identifier,并在对应的环境下上传刚才导出的 P12 证书。

image

注意

  1. Bundle Identifier 必须填写,必须与您工程设置的 BundleID 一致。
  2. 您上传的 P12 证书必须与环境相匹配。开发环境必须上传 Development 的 Push 证书,生产环境必须上传 Production 的 Push 证书。

生成 provisioning profile

Xcode 编译打包的时候,需要使用使用 provisioning profile 来指明 AppID证书设备

而远程推送与证书、设备相关,所以必须正确设置相应环境的 provisioning profile,否则将无法收到远程推送,点击查看原因说明

Apple Developer 中,选择 Provisioning Profile,选择生成开发环境或者生产环境的 provisioning profile

image

选择对应的 AppID

image

选择允许使用的开发者证书。

image

选择允许使用的设备。

image

输入要名称即可生成。

image

image

提示

如果 AppApp-Store 类型的,但是还没有在 App Store 上架,在上架之前如果想使用生产环境测试远程推送,需要生成一个 Ad-HocProvisioning Profile ,并在 Xcode 中使用其进行打包,导出为 Ad Hoc Deployment

更多内容,可以参考:苹果文档 - Exporting Your App for Testing

设置 provisioning profile

将生成的 provisioning profile 下载到 Mac 本地,双击打开,则 Xcode 默认会将其导入。 在您 Xcode 工程中,Targets -> Build Settings -> Code Signing -> Provisioning Profile 路径下,选择刚才下载的证书。

image

Debug 模式下选择 devprovisioning profileRelease 模式下选择 distributionprovisioning profileXcoderun 的时候默认使用 Debug 模式,在 Archive 的时候默认使用 Release 模式,您如果需要也可以修改。

image

image

注意

无论是 DebugRelease,需要确保在打包/运行时使用的 provisioning profile 必须和正在使用的 Appkey 环境一致,才能收到推送。

请求权限

向用户请求允许推送。


//AppDelegate Class
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    /**
     * 推送处理1
     */
	 if ([application
            respondsToSelector:@selector(registerUserNotificationSettings:)]) {
      //注册推送, 用于iOS8以及iOS8之后的系统
      UIUserNotificationSettings *settings = [UIUserNotificationSettings
          settingsForTypes:(UIUserNotificationTypeBadge |
                            UIUserNotificationTypeSound |
                            UIUserNotificationTypeAlert)
                categories:nil];
      [application registerUserNotificationSettings:settings];
    } else {
      //注册推送,用于iOS8之前的系统
      UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge |
                                         UIRemoteNotificationTypeAlert |
                                         UIRemoteNotificationTypeSound;
      [application registerForRemoteNotificationTypes:myTypes];
    }

}
/**
 * 推送处理2
 */
//注册用户通知设置
- (void)application:(UIApplication *)application
    didRegisterUserNotificationSettings:
        (UIUserNotificationSettings *)notificationSettings {
  // register to receive notifications
  [application registerForRemoteNotifications];
}

设置deviceToken。

/**
 * 推送处理3
 */
- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  NSString *token =
      [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"
                                                             withString:@""]
          stringByReplacingOccurrencesOfString:@">"
                                    withString:@""]
          stringByReplacingOccurrencesOfString:@" "
                                    withString:@""];

  [[RCIMClient sharedRCIMClient] setDeviceToken:token];
}

deviceToken 是系统提供的,从苹果服务器获取的,用于 APNs 远程推送必须使用的设备唯一值。

需要将 didRegisterForRemoteNotificationsWithDeviceToken: 获取到的 deviceToken ,转为 NSString 类型,并去掉其中的空格和尖括号,传给 SDK

SDK 会将此 deviceToken 保存,在 Connect 时会自动上传到融云服务器,并与用户 ID 绑定,用于远程推送。

允许推送

以上步骤都已经实现后,还需要使用您 App 的用户允许通知,才能收到远程推送。可以在设备的设置应用中,查看当前 App 是否允许通知。

获取推送内容

内容格式

融云消息的远程推送内容格式如下:

{
  "aps" :
			{
				 "alert" : "You got your emails.",
				 "badge" : 1,
				 "sound" : "default"
			},
	 "rc":{
				 "cType":"PR",
				 "fId":"2121",
				 "oName":"RC:TxtMsg",
				 "tId":"3232",
				 "id":"5FSClm2gQ9V9BZ-kUZn58B",
				 "rc-dlt-identifier":"2FSClm2gQ9Q9BZ-kUZn54B"
	 },
	 "appData":"xxxx"
}

rc 数据说明:

名称 类型 说明
alert String 远程推送显示的内容。自带的消息会有默认显示,如果您使用的是自定义消息,需要在发送时设置。对应于 iOS 发送消息接口中的 pushContent。
cType String 会话类型。PR 指单聊、 DS 指讨论组、 GRP 指群组、 CS 指客服、SYS 指系统会话、 MC 指应用内公众服务、 MP 指跨应用公众服务。
fId String 消息发送者的用户 ID。
oName String 消息类型,参考融云消息类型表.消息标志;可自定义消息类型。
tId String 为 Target ID。
id String 当前推送的消息唯一标识,对应消息路由功能中的 msgUID。
rc-dlt-identifier String 当发送的是一条撤回消息推送时,为需要撤回消息的 ID,对应消息路由功能中的 msgUID。
appData String 远程推送的附加信息,对应于 iOS 发送消息接口中的 pushData。

内容获取

点击通知栏的远程推送时,如果此时 App 已经被系统冻结,则您在 AppDelegate-application:didFinishLaunchingWithOptions: 中可以捕获该消息。

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

    ...

    return YES;
}

如果 App 未被系统冻结,则在 AppDelegate-application:didReceiveRemoteNotification:中可以捕获该消息。

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo {
    // userInfo为远程推送的内容
}