当前位置:主页 > 查看内容

即时通信 IM 离线推送(iOS) - SDK 文档

发布时间:2021-10-17 00:00| 位朋友查看

简介:配置离线推送 如想要接收 APNs 离线消息通知,需要遵从如下几个步骤: 申请 APNs 证书。 上传证书到 IM 控制台。 在 App 每次登录时,向苹果获取 deviceToken。 调用 setAPNS 接口将其上报到 IM 后台。 配置过 APNs 的 App ,当其切到后台或者被用户 Kill 之……

配置离线推送

如想要接收 APNs 离线消息通知,需要遵从如下几个步骤:

  1. 申请 APNs 证书。
  2. 上传证书到 IM 控制台。
  3. 在 App 每次登录时,向苹果获取 deviceToken。
  4. 调用 setAPNS 接口将其上报到 IM 后台。

配置过 APNs 的 App ,当其切到后台或者被用户 Kill 之后,腾讯云就可以通过苹果的 APNs 后台对该设备进行离线消息推送,详细推送原理请参见 Apple Push Notification Service。

注意:

对于已经退出登录(主动登出或者被踢下线)的用户,不会收到任何消息通知。

步骤1:申请 APNs 证书

申请 APNs 证书的具体操作步骤请参见 Apple 推送证书申请。

步骤2:上传证书到控制台

  1. 登录 即时通信 IM 控制台。
  2. 单击目标应用卡片,进入应用的基础配置页面。
  3. 单击【iOS平台推送设置】右侧的【添加证书】。
  4. 选择证书类型,上传 iOS 证书(p.12),设置证书密码,单击【确认】。
    注意:

    • 上传证书名最好使用全英文(尤其不能使用括号等特殊字符)。
    • 上传证书需要设置密码,无密码收不到推送。
    • 发布 App Store 的证书需要设置为生产环境,否则无法收到推送。
    • 上传的 p12 证书必须是自己申请的真实有效的证书。
  5. 待推送证书信息生成后,记录证书的 ID。

步骤3:App 向苹果后台请求 DeviceToken

您可以在您的 App 中添加如下代码,用来向苹果的后台服务器获取 DeviceToken:

// 向苹果后台请求 DeviceToken
- (void)registNotification
{
  if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
  {
      [[UIApplication sharedApplication] registerUserNotificationSettings:
              [UIUserNotificationSettings settingsForTypes:
              (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge)
              categories:nil]];
      [[UIApplication sharedApplication] registerForRemoteNotifications];
  }
  else
  {
      [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
              (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
  }
}
//在 AppDelegate 的回调中会返回 deviceToken,需要在登录后上报给腾讯云后台
-(void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
  //记录下 Apple 返回的 deviceToken
  _deviceToken = deviceToken;
}

步骤4:登录 IM SDK 后上传 Token 到腾讯云

在 IM SDK 登录成功后,就可以调用 setAPNS 接口,将 步骤3 中获取的 DeviceToken 上传到腾讯云后台,实例代码如下:

V2TIMAPNSConfig *confg = [[V2TIMAPNSConfig alloc] init];
// 企业证书 ID,上传证书到 IM 控制台后生成
confg.businessID = businessID;
// 苹果后台请求的  deviceToken
confg.token = deviceToken;
[[V2TIMManager sharedInstance] setAPNS:confg succ:^{
   NSLog(@"-----> 设置 APNS 成功");;
} fail:^(int code, NSString *msg) {
   NSLog(@"-----> 设置 APNS 失败");
}];
注意:

businessID 需要与控制台分配的证书 ID 保持一致。

推送格式

推送格式示例如下图所示。

通用推送规则

对于单聊消息,APNs 推送规则如下,其中昵称是发送方用户昵称,如果未设置昵称,则只显示内容。

昵称:内容

对于群聊消息,APNs 推送规则如下,其中名称展示优先级为消息发送者的群名片>群昵称,如果都没有,则不展示。

名称(群名):内容

不同类型消息推送规则

APNs 推送内容部分由消息体中各个 Elem 内容组成,不同 Elem 的离线消息展示效果如下表所示。

参数 说明
文本 Elem 直接显示内容
语音 Elem 显示[语音]
文件 Elem 显示[文件]
图片 Elem 显示[图片]
自定义 Elem 显示发送消息时设置的 desc 的字段,如果 desc 不设置,则不进行推送

多 App 互通

如果将多个 App 中的 SDKAppID 设置为相同值,则可以实现多 App 互通。不同 App 需要使用不同的推送证书,您需要为每一个 App 申请 APNs 证书 并完成 离线推送配置。

自定义 iOS 推送提示音

请在调用 sendMessage 发送消息的时候设置 offlinePushInfo 的iOSSound字段, iOSSound 传语音文件名(带后缀),语音文件需要链接进 Xcode 工程。

自定义离线推送展示

请在调用 sendMessage 发送消息的时候设置 offlinePushInfo 的titledesc字段,其中 title 设置后,会在默认的推送内容上多展示 title 内容,desc 设置后,推送内容会变成 desc 内容。

自定义离线推送点击跳转逻辑

请在调用 sendMessage 发送消息的时候设置 offlinePushInfo 的ext 字段,当用户收到离线推送启动 APP 的时候,可以在 AppDelegate -> didReceiveRemoteNotification 系统回调获取到 ext 字段,然后根据 ext 字段内容跳转到指定的 UI 界面。

本文以 “denny 给 vinson 发送消息” 的场景为例。

  • 发送方:denny 需在发送消息时设置推送扩展字段 ext
// denny在发送消息时设置 offlinePushInfo,并指定 ext 字段
V2TIMMessage *msg = [[V2TIMManager sharedInstance] createTextMessage:@"文本消息"];
V2TIMOfflinePushInfo *info = [[V2TIMOfflinePushInfo alloc] init];
info.ext = @"jump to denny";
[[V2TIMManager sharedInstance] sendMessage:msg receiver:@"vinson" groupID:nil priority:V2TIM_PRIORITY_DEFAULT
onlineUserOnly:NO offlinePushInfo:info progress:^(uint32_t progress) {
} succ:^{
} fail:^(int code, NSString *msg) {
}];
  • 接收方:vinson 的 App 虽然不在线,但可以接收到 APNS 离线推送,当 vinson 点击推送消息时会启动 App:
// vinson 启动 APP 后会收到以下回调
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
  // 解析推送扩展字段 desc
  if ([userInfo[@"ext"] isEqualToString:@"jump to denny"]) {
      //跳转到和 denny 的聊天界面
  }
}

常见问题

普通消息为什么收不到离线推送?

首先,请检查下 App 的运行环境和证书的环境是否一致,如果不一致,收不到离线推送。
其次,检查下 App 和证书的环境是否为开发环境,如果是开发环境,向苹果申请 deviceToken 可能会失败,生产环境暂时没有发现这个问题,请切换到生产环境测试。

自定义消息为什么收不到离线推送?

自定义消息的离线推送和普通消息不太一样,自定义消息的内容我们无法解析,不能确定推送的内容,所以默认不推送,如果您有推送需求,需要您在 sendMessage 的时候设置 offlinePushInfo 的 desc字段,推送的时候会默认展示 desc 信息。


本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:Parquet格式 - 日志服务 下一篇:没有了

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐