本文旨在介绍如何自主集成鸿蒙推送服务。
配置鸿蒙控制台
1. 访问 华为开发者联盟。
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 控制台
1. 打开即时通信 IM 控制台。
2. 在功能配置 > 离线通知配置中,选择 HarmonyOS,添加证书。


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.getTotalUnreadMessageCount 和 V2TIMConversationListener. 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. 发消息时设置离线推送参数。
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. 解析离线推送消息。
如果设置了“打开应用”,则跳转到应用首页。
如果设置了“打开应用内指定页面”,则跳转到填写的页面。
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 常见问题。
交流与反馈