如想要接收 APNs 离线消息通知,需要遵从如下几个步骤:
配置过 APNs 的 App ,当其切到后台或者被用户 Kill 之后,腾讯云就可以通过苹果的 APNs 后台对该设备进行离线消息推送,详细推送原理请参见 Apple Push Notification Service。
注意:对于已经退出登录(主动登出或者被踢下线)的用户,不会收到任何消息通知。
申请 APNs 证书的具体操作步骤请参见 Apple 推送证书申请。
注意:
- 上传证书名最好使用全英文(尤其不能使用括号等特殊字符)。
- 上传证书需要设置密码,无密码收不到推送。
- 发布 App Store 的证书需要设置为生产环境,否则无法收到推送。
- 上传的 p12 证书必须是自己申请的真实有效的证书。
您可以在您的 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;
}
在 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 中的 SDKAppID
设置为相同值,则可以实现多 App 互通。不同 App 需要使用不同的推送证书,您需要为每一个 App 申请 APNs 证书 并完成 离线推送配置。
请在调用 sendMessage 发送消息的时候设置 offlinePushInfo 的iOSSound
字段, iOSSound
传语音文件名(带后缀),语音文件需要链接进 Xcode 工程。
请在调用 sendMessage 发送消息的时候设置 offlinePushInfo 的title
和 desc
字段,其中 title
设置后,会在默认的推送内容上多展示 title
内容,desc
设置后,推送内容会变成 desc
内容。
请在调用 sendMessage 发送消息的时候设置 offlinePushInfo 的ext
字段,当用户收到离线推送启动 APP 的时候,可以在 AppDelegate -> didReceiveRemoteNotification
系统回调获取到 ext
字段,然后根据 ext
字段内容跳转到指定的 UI 界面。
本文以 “denny 给 vinson 发送消息” 的场景为例。
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 后会收到以下回调
- (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
信息。
TOP云 (west.cn)3月17日消息,品牌 域名 之于品牌到底有多重要,这已无需赘言...
主机配置DHCP服务器时安装DHCP服务的方法: 在Windows Server 2003系统中默认没...
本文为您介绍资源栈创建失败的原因。 资源栈重名 同一用户创建的资源栈名不能重...
1. 接口描述 接口请求域名: vpc.tencentcloudapi.com 。 本接口(CreateDhcpIp...
本文介绍日志服务的LiveTail功能及相关操作。 前提条件 已通过Logtail采集到日志...
Java程序员发展前景怎么样?大不大?Java程序员想有一个持续的提高过程,要为自己...
服务器租用 一般由具有实力的主机服务公司提供硬件,并负责基本软件的安装、配置...
SaaS企业在克服全球疫情大流行的业务影响时,面临着许多不确定性。 前方没有固定...
UDP 监听器简介 您可以在负载均衡实例上添加一个 UDP 监听器转发来自客户端的 UD...
1.背景概述 在使用Markdown写文章插入图片后,由于使用的是本地电脑的图片,此时...