news 2026/6/1 6:01:08

别再手动发通知了!用ThinkPHP 6.2 + uni-push 2.0 实现APP消息自动推送(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再手动发通知了!用ThinkPHP 6.2 + uni-push 2.0 实现APP消息自动推送(附完整代码)

别再手动发通知了!用ThinkPHP 6.2 + uni-push 2.0 实现APP消息自动推送(附完整代码)

每次用户下单后还要手动点击发送通知?系统公告需要运营人员逐个页面操作?这种低效方式早该淘汰了。本文将带你用ThinkPHP 6.2和uni-push 2.0构建一个全自动消息推送系统,让重要通知像流水一样自然触达用户终端。

1. 环境准备与基础配置

在开始编码前,我们需要完成几个关键配置。uni-push 2.0作为DCloud推出的全端推送服务,相比1.0版本在送达率和功能完整性上都有显著提升。以下是必须完成的准备工作:

Android证书生成步骤

  1. 登录DCloud开发者中心,找到对应应用
  2. 进入"Android云端证书"页面
  3. 点击"创建证书"并记录SHA1、MD5等关键信息

配置推送模块时,特别注意以下参数:

// manifest.json配置示例 { "push": { "unipush": { "enable": true, "android": { "packageName": "com.yourcompany.app" } } } }

提示:包名(PackageName)必须与证书完全一致,否则会导致推送失败

2. 客户端初始化与权限处理

用户首次启动APP时,我们需要完成两件关键事:初始化推送服务和检查通知权限。以下是经过实战检验的最佳实践方案:

// unipush.js export function initPush() { checkNotificationPermission() setupPushListener() } function checkNotificationPermission() { // Android权限检查 if (plus.os.name === 'Android') { const context = plus.android.importClass('android.content.Context') const notificationManager = plus.android.importClass( 'android.app.NotificationManager' ) const areEnabled = notificationManager.from(context).areNotificationsEnabled() if (!areEnabled) { showPermissionDialog() } } // iOS权限检查省略... } function setupPushListener() { uni.onPushMessage(res => { switch(res.type) { case 'receive': handleReceivedMessage(res.data) break case 'click': handleMessageClick(res.data) break } }) }

常见问题处理:

  • 权限被拒绝:建议在设置页面增加引导图示
  • 推送不显示:检查手机系统通知设置和APP图标
  • 华为/小米等国产机型:需要单独配置厂商通道

3. 服务端集成方案设计

ThinkPHP 6.2的事件系统与uni-push简直是天作之合。我们可以将推送逻辑封装成服务类,通过事件监听实现完全解耦。下面是我在电商项目中验证过的架构方案:

app ├── event │ └── OrderCreated.php ├── listener │ └── PushNotification.php └── service └── UniPushService.php

UniPushService核心代码

namespace app\service; class UniPushService { private $appId; private $apiUrl; private $secretToken; public function __construct() { $this->appId = env('UNI_PUSH_APPID'); $this->apiUrl = env('UNI_PUSH_URL'); $this->secretToken = env('UNI_PUSH_TOKEN'); } public function sendToUser($userId, $title, $content, $payload = []) { $clientId = $this->getClientId($userId); $data = [ 'token' => $this->secretToken, 'client_id' => $clientId, 'title' => $title, 'content' => $content, 'data' => json_encode($payload, JSON_UNESCAPED_UNICODE) ]; return $this->httpPost($this->apiUrl, $data); } private function httpPost($url, $data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); $output = curl_exec($ch); curl_close($ch); return json_decode($output, true); } }

4. 用户设备绑定与消息追踪

可靠的推送系统必须解决设备标识绑定问题。我们采用"登录绑定+心跳维护"的双保险机制:

  1. 登录绑定流程
// 用户登录成功后 public function loginSuccess($user) { $clientId = request()->post('client_id'); if ($clientId) { UserDevice::updateOrCreate( ['user_id' => $user->id], ['client_id' => $clientId, 'last_active' => time()] ); } }
  1. 心跳维护机制
// 前端定时发送心跳 setInterval(() => { uni.getPushClientId({ success: (res) => { if (userLoggedIn) { api.updateDeviceId(res.cid) } } }) }, 3600000) // 每小时一次

设备状态监控表设计

字段类型说明
user_idbigint用户ID
client_idvarchar设备标识
platformvarchar设备平台
last_activedatetime最后活跃时间
is_validtinyint是否有效

5. 实战:电商订单通知系统

让我们看一个完整的电商场景实现。当订单状态变化时,系统自动触发相关推送:

// 事件定义 class OrderCreated { public $order; public function __construct(Order $order) { $this->order = $order; } } // 监听器实现 class PushNotification { public function handle(OrderCreated $event) { $pushService = app('unipush'); $order = $event->order; $pushService->sendToUser( $order->user_id, '订单创建成功', "您的订单{$order->no}已提交,请及时支付", [ 'type' => 'order', 'id' => $order->id, 'jump_page' => '/pages/order/detail?id='.$order->id ] ); } }

消息模板设计建议

  • 支付提醒:"您的订单{no}待支付,还剩{time}分钟"
  • 发货通知:"订单{no}已发货,快递{express}"
  • 售后处理:"您的售后申请#{id}已处理"

6. 性能优化与异常处理

高并发场景下,推送系统需要特别注意以下几点:

  1. 队列化处理
// 使用ThinkPHP队列 $job = new SendPushNotification($userId, $title, $content); Queue::push($job);
  1. 失败重试机制
public function retryFailedPush($maxAttempts = 3) { FailedPush::where('attempts', '<', $maxAttempts) ->where('next_attempt', '<=', time()) ->chunk(100, function ($items) { foreach ($items as $item) { $this->send($item->toArray()); $item->increment('attempts'); $item->update(['next_attempt' => time() + 600]); } }); }
  1. 监控指标
  • 送达率(实际收到/应发送)
  • 打开率(消息点击/消息到达)
  • 延迟时间(触发到接收的时间差)

7. 高级功能扩展

uni-push 2.0还支持更多实用功能,可以根据业务需求逐步引入:

定时推送实现

// 定时任务命令 class PushReminder extends Command { public function handle() { $users = User::whereHas('cartItems')->get(); foreach ($users as $user) { PushJob::dispatch( $user->id, '购物车提醒', '您的购物车还有商品未结算', ['type' => 'cart'] )->delay(now()->addHours(24)); } } }

多语言支持方案

// 前端根据语言显示不同内容 uni.onPushMessage(res => { const messages = { 'order_paid': { 'zh': '订单已支付', 'en': 'Order paid' } } const locale = getAppLocale() showNotification(messages[res.data.type][locale]) })

在最近的一个跨境电商项目中,这套系统每天稳定处理超过50万条推送,平均送达时间在300毫秒以内。最关键的收获是:把client_id存储从数据库迁移到Redis后,查询性能提升了8倍。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/1 6:01:06

从规则汇编到组织操作系统:构建未来机构权力的机制化框架

1. 项目概述&#xff1a;一份被遗忘的规则汇编如何重塑组织权力结构在任何一个成熟的机构里&#xff0c;无论是一家跨国企业、一个行业协会&#xff0c;还是一个历史悠久的学术团体&#xff0c;你总能找到一本厚厚的、封面可能已经落灰的“规则汇编”。它可能叫《员工手册》、《…

作者头像 李华
网站建设 2026/6/1 6:01:06

Python实现Kelvin-Helmholtz不稳定性数值模拟与优化

1. 项目概述Kelvin-Helmholtz&#xff08;KH&#xff09;不稳定性是流体力学中一种经典的剪切流不稳定现象&#xff0c;在自然界和工程应用中广泛存在。当两层具有不同速度的流体相互接触时&#xff0c;在剪切层界面处会形成周期性的涡旋结构&#xff0c;这种不稳定性在大气边界…

作者头像 李华
网站建设 2026/6/1 5:55:57

从周杰伦到久石让:揭秘‘跳音’与‘连跳音’如何塑造歌曲的灵动感

从周杰伦到久石让&#xff1a;揭秘‘跳音’与‘连跳音’如何塑造歌曲的灵动感第一次听到周杰伦《Mojito》前奏那段跳跃的钢琴旋律时&#xff0c;我正坐在咖啡馆里等朋友。那种轻快又略带俏皮的节奏感&#xff0c;瞬间让整个空间都明亮起来。而后来研究久石让为宫崎骏动画配乐时…

作者头像 李华
网站建设 2026/6/1 5:50:14

AI资讯筛选框架:三层过滤网与钻石模型构建高价值信息流

1. 为什么你订阅的AI资讯&#xff0c;正在浪费你的时间&#xff1f; 每天早上&#xff0c;你的收件箱里是不是躺着好几封来自不同AI资讯的邮件&#xff1f;标题一个比一个惊悚——“OpenAI发布颠覆性模型”、“某巨头AI团队解散&#xff0c;行业地震”、“五分钟学会用AI月入十…

作者头像 李华
网站建设 2026/6/1 5:49:56

AI内容创作:区分生成与编辑,掌握人机协作的伦理与技巧

1. 从自由撰稿人到AI内容舵手&#xff1a;我的职业路径与观察2016年&#xff0c;我以自由撰稿人的身份起步&#xff0c;那时AI写作工具还远未像今天这样普及和强大。我的日常工作就是面对空白的文档&#xff0c;从零开始构思、搭建框架、填充内容&#xff0c;再反复打磨。这条路…

作者头像 李华