HarmonyOS应用开发实战:猫猫大作战-PushKit 的接收与处理
前言PushKit是 HarmonyOS 的远程推送服务支持服务端向用户设备发送推送消息。对于游戏应用远程推送可用于活动通知“周末双倍积分”、好友邀请“你的好友超过了你的得分”、以及流失召回“猫咪们想念你回来合并”。本文以「猫猫大作战」的推送集成为锚点讲解 PushKit 的完整使用流程包括推送权限申请、接收推送、消息解析、点击跳转、以及推送策略最佳实践。提示本系列不讲 ArkTS 基础语法与环境搭建。本篇是阶段五第 153 篇。一、PushKit 基础概念1.1 推送架构┌──────────┐ ┌─────────────┐ ┌──────────┐ │ 服务端 │────►│ 华为推送服务 │────►│ 用户设备 │ │ (AGC) │ │ (PushKit) │ │ (App) │ └──────────┘ └─────────────┘ └──────────┘ │ │ │ 发送推送请求 │ on(receive) 回调 │ JSON 格式 │ 弹通知栏消息 └──────────────────────────────────────┘1.2 推送数据类型// 推送消息的 JSON 结构示例interfacePushMessage{type:activity|reminder|invite|notice;title:string;body:string;data?:Recordstring,string;// 自定义数据action?:string;// 点击后的跳转路由}提示HarmonyOS 推送消息体最大 4KB结构化数据放在data字段展示文本放在title/body。二、推送权限与配置2.1 module.json5 权限声明// entry/src/main/module.json5 { module: { requestPermissions: [ { name: ohos.permission.PUSH, reason: $string:push_permission_reason, } ], // ... } }2.2 运行时权限申请import{abilityAccessCtrl}fromkit.AbilityKit;asyncfunctionrequestPushPermission(context:common.UIAbilityContext):Promiseboolean{constatManagerabilityAccessCtrl.createAtManager();try{constresultawaitatManager.requestPermissionsFromUser(context,[ohos.permission.PUSH]);returnresult.authResults[0]0;// 0 表示授权}catch(err){console.error(推送权限申请失败:${err.message});returnfalse;}}三、接收推送消息3.1 注册推送监听import{pushService}fromkit.PushKit;import{hilog}fromkit.PerformanceAnalysisKit;import{BusinessError}fromkit.BasicServicesKit;EntryComponentstruct GameApp{privateTAGPushKit;privateDOMAIN0xFF00;aboutToAppear(){this.initPush();}initPush(){// 注册推送接收回调pushService.on(receive,(data:string){hilog.info(this.DOMAIN,this.TAG,收到推送消息:${data});this.handlePushMessage(data);});// 注册推送点击回调pushService.on(click,(data:string){hilog.info(this.DOMAIN,this.TAG,推送被点击:${data});this.handlePushClick(data);});}handlePushMessage(data:string){try{constmsg:PushMessageJSON.parse(data);switch(msg.type){caseactivity:this.showActivityBanner(msg.title,msg.body);break;casereminder:// 系统已弹通知栏应用无需额外处理break;caseinvite:this.showInviteBadge();break;default:console.info(未知推送类型:${msg.type});}}catch(err){console.error(推送数据解析失败:${(errasBusinessError).message});}}handlePushClick(data:string){try{constmsg:PushMessageJSON.parse(data);if(msg.actiongame){// 跳转到游戏页面this.routerToGame();}elseif(msg.actionactivity){// 跳转到活动详情this.routerToActivity(msg.data?.activityId??);}}catch(err){console.error(推送点击处理失败);}}}3.2 推送回调详解回调事件触发时机data 内容典型处理on(receive)设备收到推送完整的 JSON 字符串更新 UI 角标、处理自定义数据on(click)用户点击通知栏推送消息的 JSON路由跳转、打开指定页面on(token)推送 Token 更新新 Token 字符串上报给服务端四、游戏中的推送应用4.1 活动通知推送// 处理活动推送在游戏内显示活动横幅showActivityBanner(title:string,body:string){// 只在非游戏进行时弹横幅if(this.gameState!GameState.PLAYING){promptAction.showToast({message:${title}:${body},duration:3000,});}}4.2 好友邀请推送handleInvitePush(data:string){constmsgJSON.parse(data);constinvitermsg.data?.inviter??好友;// 显示邀请红点this.hasInviteBadgetrue;// 弹窗提示promptAction.showDialog({title:${inviter}邀请你,message:你的好友${inviter}在猫猫大作战中获得了${msg.data?.score}分快来挑战吧,buttons:[{text:稍后,color:#95A5A6},{text:去挑战,color:#2ECC71},],}).then((result){if(result.index1){this.startGame();}});}五、推送 Token 管理5.1 获取和上报 TokenasyncfunctionsetupPush(context:common.UIAbilityContext):Promisevoid{// 获取推送 TokenconsttokenawaitpushService.getToken();hilog.info(0xFF00,PushKit,推送 Token:${token});// 将 Token 上报到自己的服务端awaitreportTokenToServer(token);}asyncfunctionreportTokenToServer(token:string):Promisevoid{constresponseawaitfetch(https://api.example.com/push/register,{method:POST,body:JSON.stringify({token,platform:harmonyos}),});if(!response.ok){console.error(Token 上报失败);}}5.2 Token 刷新监听// 监听 Token 刷新切换账号、重新安装等场景pushService.on(token,(newToken:string){hilog.info(0xFF00,PushKit,Token 已刷新:${newToken});reportTokenToServer(newToken);});六、服务端推送6.1 通过 AGC 发送推送# 使用 AGC REST API 发送推送curl-XPOST https://push-api.cloud.huawei.com/v1/{appId}/messages:send\-HAuthorization: Bearer {accessToken}\-HContent-Type: application/json\-d{ message: { token: [user_device_token], notification: { title: 周末双倍积分, body: 本周末所有合并得分翻倍 }, data: JSON.stringify({ type: activity, action: game }) } }6.2 推送策略建议推送类型频率最佳时间内容建议活动通知每周 1-2 次周五 18:00-20:00限时活动、双倍积分召回提醒每 3-7 天用户活跃时段“猫咪想念你”好友邀请不定时好友在线时“好友超过了你”版本更新每次更新发布后 24h新功能预告提示推送频率过高会导致用户关闭通知权限。建议每月不超过 8 条推送且推送内容要提供实际价值福利、好友互动。七、推送调试7.1 真机调试asyncfunctiondebugPush(context:common.UIAbilityContext){// 检查推送权限constatManagerabilityAccessCtrl.createAtManager();constresultawaitatManager.checkAccessToken({token:atManager.getApplicationTokenSync(),permission:ohos.permission.PUSH});console.info(推送权限:${result0?已授权:未授权});// 获取 Tokentry{consttokenawaitpushService.getToken();console.info(当前 Token:${token});}catch(err){console.error(获取 Token 失败:${err.message});}}7.2 常见问题问题可能原因解决方法收不到推送未申请权限 / Token 未上报检查权限声明和设备 Token推送无点击回调未注册 click 事件添加on(click, handler)Token 为空网络问题 / 服务异常重试获取或重启应用推送 JSON 解析失败data 格式异常服务端确保 data 为 JSON 字符串八、节电与合规8.1 推送接收的电源策略// PushKit 接收推送不额外消耗电量// 系统级长连接应用无需保活// 但在 on(receive) 中做耗时操作会额外耗电// ✅ 推荐收到推送后只做轻量操作pushService.on(receive,(data:string){this.pendingPushdata;// 仅缓存});// 避免在回调中做网络请求或数据库写入8.2 隐私合规// 在隐私政策中声明推送服务constprivacyPolicy我们使用 PushKit 向您发送游戏活动通知和好友邀请。 您可以随时在系统设置中关闭推送通知权限。;// 首次启动时弹窗获取同意asyncfunctionshowPrivacyDialog(context:common.UIAbilityContext){consthasAgreedAppStorage.getboolean(privacyAgreed);if(!hasAgreed){constresultawaitpromptAction.showDialog({title:隐私政策,message:privacyPolicy,buttons:[{text:不同意,color:#E74C3C},{text:同意,color:#2ECC71},],});AppStorage.setOrCreate(privacyAgreed,result.index1);}}九、完整接入示例EntryComponentstruct PushDemo{StatehasPermission:booleanfalse;StatelastPush:string;aboutToAppear(){this.initPushService();}asyncinitPushService(){constctxgetContext()ascommon.UIAbilityContext;// 1. 请求权限this.hasPermissionawaitrequestPushPermission(ctx);if(!this.hasPermission)return;// 2. 注册监听this.registerPushListeners();// 3. 获取并上报 TokenawaitsetupPush(ctx);}registerPushListeners(){pushService.on(receive,(data:string){this.lastPushdata;// 更新 UI 角标});pushService.on(click,(data:string){// 路由跳转});pushService.on(token,(token:string){reportTokenToServer(token);});}aboutToDisappear(){// 取消注册推送监听pushService.off(receive);pushService.off(click);pushService.off(token);}}十、PushKit vs 其他通知方式维度PushKit本地通知WebSocket触发方服务端应用自身服务端在线要求设备联网即可无需联网需保持连接实时性秒级延迟精确定时毫秒级保活要求无需无需需保活电量消耗低系统长连接低高持续连接适用场景活动通知、召回每日提醒、闹钟实时对战、聊天总结PushKit 是 HarmonyOS 的远程推送服务通过on(receive)接收推送消息、on(click)处理点击跳转、on(token)管理设备 Token。核心要点权限在 module.json5 和运行时双重申请、 推送数据 JSON.parse 解析、 点击回调路由跳转、 Token 上报服务端、 推送频率适度防骚扰。下一篇将深入 ShareKit——分享战绩到社交平台。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源PushKit 官方文档PushKit API 参考AGC 推送服务推送权限申请通知栏与推送最佳实践WantAgent 跳转开源鸿蒙跨平台社区HarmonyOS 开发者官方文档第 152 篇addSlot 通知渠道第 154 篇ShareKit 分享

相关新闻

为什么90%的AI路径系统在雨天/晚高峰崩盘?资深LBS架构师首度公开时空约束建模的6个隐性变量

为什么90%的AI路径系统在雨天/晚高峰崩盘?资深LBS架构师首度公开时空约束建模的6个隐性变量

更多请点击: https://codechina.net 第一章:AI 配送路线优化 在城市物流日益复杂的背景下,AI 驱动的配送路线优化正成为提升时效性与降低碳排放的关键技术。传统基于规则或简单启发式算法的路径规划难以应对实时交通变化、动态订单涌入及多约…

2026/10/5 18:36:33 阅读更多 →
HarmonyOS应用开发实战:猫猫大作战-定时更新与动态卡片

HarmonyOS应用开发实战:猫猫大作战-定时更新与动态卡片

前言 HarmonyOS 的 Form Kit 支持定时更新卡片内容,让用户在不打开应用的情况下看到最新信息。在「猫猫大作战」中,我们将高分记录和每日签到状态展示在桌面卡片上,通过定时更新保持信息新鲜。 一、定时更新配置 // form_config.json — 卡…

2026/10/7 15:32:05 阅读更多 →
基于Python与OpenSCAD的盲文3D打印自动化工具链实践

基于Python与OpenSCAD的盲文3D打印自动化工具链实践

1. 项目概述:从文字到触觉的桥梁 最近在做一个挺有意思的小项目,起因是想给一位视障朋友送一份特别的生日礼物——一本刻有祝福语的立体盲文书。市面上虽然有现成的盲文书籍,但个性化定制几乎找不到,而且价格不菲。于是&#xff0…

2026/10/13 1:15:16 阅读更多 →

最新新闻

对话式地图助手落地实践:语言模型到地图动作的适配层设计

对话式地图助手落地实践:语言模型到地图动作的适配层设计

从聊天机器人一脚踩进地图场景的那段时间,我被一个问题折磨了很久:语言模型再能聊,跟地图引擎之间始终隔着一道墙。用户在对话框里说"帮我找滨河公园附近评分高的粤菜馆,然后规划一条地铁过去的路线",前端却…

2026/10/14 10:09:42 阅读更多 →
Agent-Skills架构实战:如何设计可复用、可组合的智能体技能模块

Agent-Skills架构实战:如何设计可复用、可组合的智能体技能模块

1. 从“agent-skills”这个标题说起:它到底在解决什么问题 第一次看到“agent-skills”这个标题,我脑子里蹦出来的不是某个具体框架,而是一类很实际的需求: 怎么让一个智能体(agent)真正具备可复用、可组合…

2026/10/14 10:09:42 阅读更多 →
SwiftUI 与 Agent 结合:声明式 UI 驱动智能体技能开发实战

SwiftUI 与 Agent 结合:声明式 UI 驱动智能体技能开发实战

1. 这个标题到底在说什么第一次看到 "SwiftUI-Agent-Skill" 这个组合词,我脑子里蹦出来的第一反应是:这大概率不是一个单纯的 UI 框架教程,也不是一个纯粹的 AI Agent 科普,而是把这两条线拧在一起的东西。拆开看就很清…

2026/10/14 10:09:42 阅读更多 →
虚拟试穿技术原理与电商AI应用边界解析

虚拟试穿技术原理与电商AI应用边界解析

我无法按照该标题生成符合要求的博文内容,原因如下:标题“ChatGPT 全球上线虚拟试穿与商品收藏功能”存在事实性错误:ChatGPT 是由 OpenAI 开发的语言模型,不具备、也从未发布过“虚拟试穿”或“商品收藏”等电商类功能。该描述混…

2026/10/14 10:09:42 阅读更多 →
知识工作插件化:从采集到输出,打造个人半自动工作流

知识工作插件化:从采集到输出,打造个人半自动工作流

如果你和我一样,每天有一半时间泡在文档、网页、笔记和聊天记录里,那你大概也遇到过这种状态:明明收集了一堆资料,真到要写东西的时候,却感觉脑子里什么都没留下。这就是我搭 knowledge-work-plugins 这套插件集的初衷…

2026/10/14 10:09:42 阅读更多 →
Node.js+Vue全栈开发出租车智能调度系统实践

Node.js+Vue全栈开发出租车智能调度系统实践

1. 项目背景与核心需求出租车业务管理系统是传统运输行业数字化转型的典型场景。随着网约车平台的兴起,传统出租车公司面临着运营效率低下、调度方式落后、数据统计困难等痛点。这个基于Node.jsVue的全栈项目,正是为了解决以下核心问题:实时调…

2026/10/14 10:08:38 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →