HarmonyOS

最近更新时间:2024-10-10 17:57:31

我的收藏
本文旨在介绍如何自主集成鸿蒙推送服务。

配置鸿蒙控制台

2. API 库中,选择您的项目,然后搜索推送,找到推送服务

3. 启用推送服务。

4. 凭证 > 项目级凭证中,选择您的项目,然后找到服务帐号密钥创建凭证

5. 填写名称,然后生成公私钥,最后创建并下载 JSON
凭证
)。

6. 打开我的项目
7. 选择您的项目。

8. 推送服务中,立即开通推送服务。

9. 推送服务 > 配置中,申请自分类权益。

10. 通过标准场景添加

11. 选择
即时聊天
,然后选择场景 1场景 2

12. 填写消息内容示例

13. 推送服务 > 配置中,查看自分类权益



14. 激活功能



15. 项目设置 > 常规中,添加公钥指纹

16. 
项目设置 > Server SDK 中,创建认证凭据



17. 项目设置 > 常规中,找到
包名
Client ID


配置 IM 控制台

2. 功能配置 > 离线通知配置中,选择 HarmonyOS添加证书

3. 填写包名(上节步骤 17 获取的),上传凭证(上节步骤 5 获取的 JSON 文件),填写分类(上节步骤 11 选择的)。

4. 设置
跳转动作
(点击通知栏的离线推送消息后,跳转到应用的哪个页面)。

如果设置了打开应用,则跳转到应用首页。
如果设置了打开应用内指定页面,则跳转到填写的页面。请先在项目模块的 module.json5 文件中进行设置,例如在 entry/src/main/module.json5 中添加:
{
module: {
abilities: [
{
skills: [
{
actions: [""],
uris: [
// scheme、host、port、path 请替换成自己的
{
scheme: "https",
host: "www.pushtest.com",
port: "8080",
path: "entryability/EntryAbility",
},
],
},
],
},
],
},
}

然后,在 IM 控制台按照格式scheme://host:port/path 填写,例如:https://www.pushtest.com:8080/entryability/EntryAbility

5. 完成添加证书后,IM 控制台会为您分配一个
证书 ID


配置 IM SDK

1. 在项目模块的 module.json5 文件中设置 Clinet ID(在上节步骤 17 获取的),例如在 entry/src/main/module.json5 中添加:
{
module: {
metadata: [
{
name: "client_id",
// value 请替换成自己的
value: "1111919025",
},
],
},
}
2. 调用 notificationManager.requestEnableNotification 请求通知授权。
import { Want, UIAbility } from "@kit.AbilityKit";
import { BusinessError } from "@kit.BasicServicesKit";
import notificationManager from "@ohos.notificationManager"; export default class EntryAbility extends UIAbility { async onCreate(want: Want) { try { if (!(await notificationManager.isNotificationEnabled())) { await notificationManager.requestEnableNotification(); } } catch (err) { const e = err as BusinessError; console.error("failed", e.code, e.message); } } }
3. IM 登录后,调用 pushService.getToken 获取 Push Token,然后调用 V2TIMOfflinePushManager.setOfflinePushConfig 上传 Push Token 和证书 ID(上节步骤 5 获取的)。
import { BusinessError } from "@kit.BasicServicesKit";
import { pushService } from '@kit.PushKit';
import { V2TIMManager } from "@tencentcloud/imsdk";

async function login() {
try {
await V2TIMManager.getInstance().login("useID", "userSig");
const token = await pushService.getToken();
await V2TIMManager.getOfflinePushManager().setOfflinePushConfig({
token: token,
businessID: 100,
});
} catch (err) {
const e = err as BusinessError;
console.error("failed to get push config", e.code, e.message);
}
}
4. 前后台状态同步。
当应用退到后台,请调用 V2TIMOfflinePushManager.doBackground,将状态同步给 IM 后台,这样收到新消息就会展示在通知栏。其中 unreadCount 参数可以通过 V2TIMConversationManager.getTotalUnreadMessageCountV2TIMConversationListener. onTotalUnreadMessageCountChanged 获取。
当应用回到前台,请调用 V2TIMOfflinePushManager.doForeground,将状态同步给 IM 后台,这样收到新消息就不会展示在通知栏。
import { Want, UIAbility } from "@kit.AbilityKit";
import { BusinessError } from "@kit.BasicServicesKit";
import { V2TIMManager } from "@tencentcloud/imsdk";
export default class EntryAbility extends UIAbility {
async onBackground() {
try {
await V2TIMManager.getOfflinePushManager().doBackground(unreadCount);
} catch (err) {
const e = err as BusinessError;
console.error("failed to do background", e.code, e.message);
}
}

async onForeground() {
try {
await V2TIMManager.getOfflinePushManager().doForeground();
} catch (err) {
const e = err as BusinessError;
console.error("failed to do foreground", e.code, e.message);
}
}
}
5. 发消息时设置离线推送参数。
调用 V2TIMMessageManager.sendMessage 发送消息时,可以通过 V2TIMOfflinePushInfo 设置离线推送参数。
import { V2TIMManager, V2TIMOfflinePushInfo } from "@tencentcloud/imsdk";
import { BusinessError } from "@kit.BasicServicesKit";

async function sendMessage() {
try {
const message = V2TIMManager.getMessageManager().createTextMessage("text");
const info: V2TIMOfflinePushInfo = {
title: "title",
desc: "desc",
ext: "ext",
};
await V2TIMManager.getMessageManager().sendMessage(message, {
receiver: "receiver",
offlinePushInfo: info,
});
} catch (err) {
const e = err as BusinessError;
console.error("failed to get push config", e.code, e.message);
}
}
6. 解析离线推送消息。
点击通知栏的离线推送消息后,跳转到应用的哪个页面,取决于上节步骤 4 的“点击后续动作”:
如果设置了“打开应用”,则跳转到应用首页。
如果设置了“打开应用内指定页面”,则跳转到填写的页面。
不管跳转到哪个页面,如果发送消息时设置了 V2TIMOfflinePushInfo.ext,则可以通过 Want.parameters 获取。
import { Want, UIAbility } from "@kit.AbilityKit";

export default class ImdemoAbility extends UIAbility { async onCreate(want: Want) {
const ext = want.parameters?.ext; }

async onNewWant(want: Want) { const ext = want.parameters?.ext; } }

常见问题

收不到离线推送怎么排查?

首先在 IM 控制台通过 接入测试 自测下是否可以正常推送。
离线推送依赖厂商能力,一些简单的字符可能会被厂商过滤不能透传推送。
如果离线推送消息出现推送不及时或者偶尔收不到情况,需要看下鸿蒙推送的限制:Push Kit 管理规范Push Kit 常见问题

交流与反馈

点此进入 IM 社群,享有专业工程师的支持,解决您的难题。