离线推送 V2TIMOfflinePushInfo.vendorParams 说明

本文介绍离线推送 V2TIMOfflinePushInfo.vendorParams 的各字段说明和使用示例。

字段说明

特性分类
字段
类型
使用说明
备注
FCM 消息优先级
fcmPriority
String
FCM 推送消息优先级设置:
"normal":普通优先级,应用在前台运行时,普通优先级消息会被立即传递。当应用在后台运行时,消息传递可能会延迟。如果是对时间不太敏感的消息(例如新电子邮件通知、使界面保持同步或在后台同步应用数据),建议您选择普通传递优先级;
"high":高优先级,即使设备处于低电耗模式,FCM 也会立即尝试传递高优先级消息。 高优先级消息适用于对时间敏感的用户可见内容。
vivo 通知类型
vivoNotifyType
Integer
vivo 通知类型:
1:无。
2:响铃。
3:振动。
4:响铃和振动。
默认值:4。
OPPO 私信模板
oppoTemplateId
String
OPPO 私信申请的模板 ID,申请方式详见 OPPO 私信通道
下发对应私信模板时必须携带,不支持自拟。
说明:
控制台也支持单独设置模板 ID, 主要用来支持 IM 场景下 (category = "IM") 推送消息生效模板 ID:
控制台设置模板 ID 后,会默认填充 V2TIMOfflinePushInfo 的 title 和 desc 字段内容给模板标题和内容,格式如下:
{
"oppoTitleParam": {
"title":"titleInfo"
},
"oppoContentParam":{
"desc":"descInfo"
}
}
对应的申请模板示例:

以上,可以支持存量 IM 场景的离线消息适配私信模板功能,达到存量用户 IM 消息依然可通过信通道的目标。IM 类型消息也建议使用该方式使用私信模板。
oppoTitleParam
JSON String
OPPO 标题模板填充参数:
例:私信模板 ID 标题模板为:欢迎来到$ {city} $ ,$ {city} $ 欢迎您。
此参数内容为:{“city”:“北京”}
oppoContentParam
JSON String
OPPO 内容模板填充参数:
例:私信模板 ID 对应的内容模板为:欢迎$ {userName} $ 来到$ {city} $
参数内容为:{“userName”:“汤姆”,“city”:“深圳市”}
推送模板
pushTemplateId
String
推送模板 ID。
模板在控制台创建并生成,客户端发送时指定。
pushTemplateParam
JSON String
推送模板填充参数。
例:
对应的模板是:
{appName} 发来一条消息
您参与的会议,地址 {address} ,将于 {time} 后开始!
参数内容为:
{
"appName": "TIMPush",
"address":" 1908 会议室 ",
"time":" 3 分钟 "
}
鸿蒙自定义铃音
harmonySound
String
自定义消息通知铃声。
此处设置的铃声文件必须放在应用的 /resources/rawfile 路径下。例如设置为 alert.mp3,对应应用本地的 /resources/rawfile/alert.mp3 文件。支持的文件格式包括 MP3、WAV、MPEG 等,如果不设置,则用默认系统铃声。
当请求不携带 soundDuration 字段时,建议铃声时长不超过 30 秒,若超过 30 秒则截断处理;当请求携带 soundDuration 字段时,详情请参见 soundDuration 字段说明。
harmonySoundDuration
Integer
自定义消息通知铃声时长。
需要配合 harmonySound 字段使用,只有当请求同时携带 harmonySound 字段,harmonySoundDuration 字段才会生效。仅支持数字,单位为秒,取值范围 [1, 60]。
harmonySound 字段传入的自定义消息通知铃声会播放至 harmonySoundDuration 字段值后停止,若自定义消息通知铃声对应的时长不足 harmonySoundDuration 字段值则会循环播放,在达到 harmonySoundDuration 字段值后停止。

用法示例

Android
iOS
C++
Java
Kotlin
V2TIMOfflinePushInfo v2TIMOfflinePushInfo = new V2TIMOfflinePushInfo();
Map<String, Object> map = new HashMap<>();
map.put("fcmPriority", "high");
map.put("vivoNotifyType", 4);

map.put("oppoTemplateId", "oppoid");
Map<String, Object> oppoTitleMap = new HashMap<>();
oppoTitleMap.put("title", "title");
map.put("oppoTitleParam", new Gson().toJson(oppoTitleMap));
Map<String, Object> oppoContentMap = new HashMap<>();
oppoContentMap.put("desc", "desc");
map.put("oppoContentParam", new Gson().toJson(oppoContentMap));

map.put("pushTemplateId", "templateid");
Map<String, Object> pushTemplateParamMap = new HashMap<>();
pushTemplateParamMap.put("key1", "value1");
map.put("pushTemplateParam", new Gson().toJson(pushTemplateParamMap));

map.put("harmonySound", "ring.mp3");
map.put("harmonySoundDuration", 10);

String param = new Gson().toJson(map);
v2TIMOfflinePushInfo.setVendorParams(param);
val map = mutableMapOf<String, Any>(
"fcmPriority" to "high",
"vivoNotifyType" to 4,
"oppoTemplateId" to "oppoid",
"pushTemplateId" to "templateid",
"harmonySound" to "ring.mp3",
"harmonySoundDuration" to 10
)

val oppoTitleMap = mapOf("title" to "title")
map["oppoTitleParam"] = Gson().toJson(oppoTitleMap)

val oppoContentMap = mapOf("desc" to "desc")
map["oppoContentParam"] = Gson().toJson(oppoContentMap)

val pushTemplateMap = mapOf("key1" to "value1")
map["pushTemplateParam"] = Gson().toJson(pushTemplateMap)

val param = Gson().toJson(map)
val v2TIMOfflinePushInfo = V2TIMOfflinePushInfo()
v2TIMOfflinePushInfo.vendorParams = param
OC
Swift
NSMutableDictionary *map = [@{
@"fcmPriority": @"high",
@"vivoNotifyType": @4,
@"oppoTemplateId": @"oppoid",
@"pushTemplateId": @"templateid",
@"harmonySound": @"ring.mp3",
@"harmonySoundDuration": @10
} mutableCopy];

NSDictionary *oppoTitleMap = @{@"title": @"title"};
NSData *titleData = [NSJSONSerialization dataWithJSONObject:oppoTitleMap options:0 error:nil];
NSString *oppoTitleJson = [[NSString alloc] initWithData:titleData encoding:NSUTF8StringEncoding];
[map setObject:oppoTitleJson forKey:@"oppoTitleParam"];

NSDictionary *oppoContentMap = @{@"desc": @"desc"};
NSData *contentData = [NSJSONSerialization dataWithJSONObject:oppoContentMap options:0 error:nil];
NSString *oppoContentJson = [[NSString alloc] initWithData:contentData encoding:NSUTF8StringEncoding];
[map setObject:oppoContentJson forKey:@"oppoContentParam"];

NSDictionary *pushTemplateParamMap = @{@"key1": @"value1"};
NSData *pushTemplateData = [NSJSONSerialization dataWithJSONObject:pushTemplateParamMap options:0 error:nil];
NSString *pushTemplateJson = [[NSString alloc] initWithData:pushTemplateData encoding:NSUTF8StringEncoding];
[map setObject:pushTemplateJson forKey:@"pushTemplateParam"];

NSData *paramsData = [NSJSONSerialization dataWithJSONObject:map options:0 error:nil];
NSString *params = [[NSString alloc] initWithData:paramsData encoding:NSUTF8StringEncoding];

V2TIMOfflinePushInfo *v2TIMOfflinePushInfo = [[V2TIMOfflinePushInfo alloc] init];
v2TIMOfflinePushInfo.vendorParams = params;
var map: [String: Any] = [
"fcmPriority": "high",
"vivoNotifyType": 4,
"oppoTemplateId": "oppoid",
"pushTemplateId": "templateid",
"harmonySound": "ring.mp3",
"harmonySoundDuration": 10
]

let oppoTitleMap: [String: String] = ["title": "title"]
if let titleData = try? JSONSerialization.data(withJSONObject: oppoTitleMap),
let oppoTitleJson = String(data: titleData, encoding: .utf8) {
map["oppoTitleParam"] = oppoTitleJson
}

let oppoContentMap: [String: String] = ["desc": "desc"]
if let contentData = try? JSONSerialization.data(withJSONObject: oppoContentMap),
let oppoContentJson = String(data: contentData, encoding: .utf8) {
map["oppoContentParam"] = oppoContentJson
}

let pushTemplateParamMap: [String: String] = ["key1": "value1"]
if let pushTemplateData = try? JSONSerialization.data(withJSONObject: pushTemplateParamMap),
let pushTemplateJson = String(data: pushTemplateData, encoding: .utf8) {
map["pushTemplateParam"] = pushTemplateJson
}

let paramsData = try! JSONSerialization.data(withJSONObject: map)
let params = String(data: paramsData, encoding: .utf8)!

let v2TIMOfflinePushInfo = V2TIMOfflinePushInfo()
v2TIMOfflinePushInfo.vendorParams = params;
#include <sstream>
#include <string>

V2TIMOfflinePushInfo offline_push_info;
//std::string param = R"({"fcmPriority":"high","vivoNotifyType":4})";

std::ostringstream param;
// 拼主结构体
param << "{";
param << "\"fcmPriority\":\"high\",";
param << "\"vivoNotifyType\":4,";
param << "\"oppoTemplateId\":\"oppoid\",";
param << "\"pushTemplateId\":\"templateid\",";
param << "\"harmonySound\":\"ring.mp3\",";
param << "\"harmonySoundDuration\":10,";

// 拼oppoTitleParam的json字符串
std::string oppo_title_json = "{\"title\":\"title\"}";
param << "\"oppoTitleParam\":\"";
for (const char c : oppo_title_json) {
// 转义嵌套json里的双引号
if (c == '"') param << '\\';
param << c;
}
param << "\",";

// 拼oppoContentParam的json字符串
std::string oppo_content_json = "{\"desc\":\"desc\"}";
param << "\"oppoContentParam\":\"";
for (const char c : oppo_content_json) {
if (c == '"') param << '\\';
param << c;
}
param << "\",";

// 拼pushTemplateParam的json字符串
std::string push_template_json = "{\"key1\":\"value1\"}";
param << "\"pushTemplateParam\":\"";
for (const char c : push_template_json) {
if (c == '"') param << '\\';
param << c;
}
param << "\"}";
offline_push_info.vendorParams = param.str();
注意:
IMSDK 8.7 及以上版本支持。

API 参考