最近公司老板又让我们去写推送,希望用户能够实时收到各种推送通知,比如新的消息、紧急通知,甚至是应用内通话的提醒。
这两天正好搞完了,所以写个博文记录一下中间的知识点,希望方便后来的同学可以直接用上。
模块简介
这次的主角是 pushCommon 模块,这个模块提供了非常方便的推送服务公共信息。
pushCommon 模块是鸿蒙系统中的推送服务模块之一,提供了丰富的功能,包括绑定账号类型、场景化消息数据、扩展通知消息、点击事件替换数据以及应用内通话消息等。简单来说,这个模块让你可以灵活地实现各种推送消息需求,从简单的通知到复杂的应用内交互都能轻松应对。它帮助开发者更高效地集成推送服务,提升用户体验。
️
开发环境要求
pushCommon 模块从鸿蒙 4.0.0 开始支持,开发者可以通过 import { pushCommon } from '@kit.PushKit'; 导入模块来使用它的功能。
需要注意的是,它只能在 Stage 模型下使用,并且需要具备
SystemCapability.Push.PushService 系统能力才能正常运行。只有满足这些条件,模块的所有功能才能被正常调用和使用。
绑定账号类型 (AppProfileType)
在鸿蒙推送服务中,绑定账号的类型非常重要,因为它决定了推送的消息可以绑定到哪个账号类型上。主要有两种类型:
- 华为账号 (PROFILE_TYPE_OS_DISTRIBUTED_ACCOUNT):用于绑定用户的华为账号,通过绑定华为账号,你可以让用户通过同一个账号在多个设备上接收推送消息,确保跨设备体验一致。
- 应用账号 (PROFILE_TYPE_APPLICATION_ACCOUNT):用于绑定应用内自定义的账号,这通常适用于那些有自己账号系统的应用。通过绑定应用账号,用户可以接收到属于他们的个性化消息,提升整体使用体验。
例如,如果你的应用涉及用户的个人账号系统,就需要使用应用账号类型,以便让用户接收到属于他们的个性化消息,这样能够显著提高用户对应用的依赖性和参与度。
场景化消息数据 (PushPayload)
应用可以通过 receiveMessage() 获取场景化消息数据,比如聊天消息、应用后台操作通知等。PushPayload 提供了多种场景下的推送消息支持,以下是一些常见的场景:
- IM 消息:假设你的应用是一款即时通讯工具,当用户收到新消息时,可以使用 PushPayload 获取推送数据。
{ "data": "extraData", "header": { "token": "MA**" }, "messageAction": 0, "notification": { "bigBody": "bigBodyXX", "bigTitle": "bigTitleXX", "body": "bodyXX", "image": "https://**/image**.png", "title": "titleXX" } }
上面代码里面的 notification 包含了完整的通知数据,比如标题、内容、图片等,这些信息将直接用于在设备上展示通知。开发者可以通过这些字段自定义推送内容,使其更符合用户需求。
- VoIP 通话:如果你需要应用内通话提醒(类似微信语音通话功能),可以通过 PushPayload 获取通话推送数据
{ "data": "extraData", "header": { "token": "MA**" } }
上面这种数据通常比较简单,只需提供通话的必要信息即可。这种设计也能保证消息处理的简洁和快速响应。
扩展通知消息数据 (RemoteNotificationInfo)
继承了 PushPayload,用于扩展通知功能。通过这个接口,你可以给用户推送更详细的信息,并且支持在 Stage 模型中执行各种场景化操作。举个例子,如果你需要向用户推送更丰富的通知数据(例如需要显示图像、大量文本等),这个扩展通知接口可以满足这些需求。
使用 RemoteNotificationInfo 可以进一步定制化通知内容,帮助用户更加直观地获取关键信息。这个接口非常适合需要推送重要信息的场景,比如活动促销、紧急提醒等。
扩展通知替换内容 (RemoteNotificationContent)
有时候,默认的通知内容不能满足需求,比如你想给特定用户展示个性化的标题和内容。这时可以使用 RemoteNotificationContent 替换通知内容,甚至可以在通知中叠加小图标,丰富展示效果,吸引用户注意。
- title:设置通知的标题。通过个性化标题,让用户对通知产生兴趣,增加打开率。
- text:设置通知的内容,可以传达详细的信息。
- overlayIcon:叠加图标(例如显示未读消息的小红点)。这个图标可以让用户一眼就看到应用的动态信息,提高点击的可能性。
当然啦,如果你有需要,还可以自定义角标数量 ( badgeNumber),甚至可以同时返回多个角标数量信息,来展示更多的通知详情。
️
点击事件替换数据 (RemoteWantAgent)
当用户点击通知时,我们希望他们能直接跳转到相关内容上,从而提升用户体验。RemoteWantAgent 允许我们自定义点击行为,可以替换要跳转的数据。例如,可以指定要打开的页面名称 ( abilityName ),也可以传递额外的参数 ( parameters),这让应用内的跳转变得更加灵活。
举个例子,如果用户点击一条活动促销通知,RemoteWantAgent 可以直接将他们带到活动详情页,提升操作的流畅性。这种灵活的跳转机制使得通知功能不仅仅是传达信息,更能引导用户深入互动。
应用内通话消息 (VoIPInfo)
如果你的应用有内置的 VoIP(网络电话)功能,那么 VoIPInfo 就是为此专门设计的。
它继承了 PushPayload,包含了通话相关的关键信息,比如唯一的通话标识符 ( callId )、通话类型 ( type ) 和数据 ( data )。
用户接到 VoIP 通话请求时,可以通过这些数据将通话信息推送给用户,从而实现类似微信、钉钉的语音/视频通话功能。这样用户可以快速响应,接听或拒绝通话,提高了应用内交流的效率。
✨ 一个小的代码示例:集成推送服务
为了帮助大家更好地理解,来整一个简单的代码示例,看看如何将推送服务集成到鸿蒙应用中。
首先呢,咱先导入模块:
import { pushCommon } from '@kit.PushKit';
然后,创建一个推送场景化消息的处理方法:
function handlePushMessage(message: pushCommon.PushPayload) { if (message.type === 'IM') { console.log(` 收到即时消息: ${message.data}`); } else if (message.type === 'VoIP') { console.log(` 收到通话请求: ${message.data}`); } else { console.log(` 收到其他类型的通知: ${message.type}`); } }
上面代码中呢,我们根据消息类型来区分处理逻辑,IM 处理即时消息,VoIP 处理通话请求,其他类型则统一处理。
通过这种方式,可以确保所有推送消息都能及时且正确地进行处理。
此外,我们还可以对消息的不同类型进行进一步处理,比如在收到消息后显示特定的 UI 提示,或者触发应用内的某些功能。这些定制化的处理逻辑可以极大提升用户的使用体验。
最后小总结
介个 pushCommon 模块为鸿蒙应用提供了强大的推送服务支持,无论是消息推送、应用内通话,还是复杂的点击事件处理,它都能轻松应对。
总之又完成了老板的一个需求,希望大家不踩坑~~~~