JoliNotif 是 PHP 轻量级跨平台桌面通知方案,支持 macOS(AppleScript)、Linux(libnotify)、Windows(PowerShell),安装即用,不依赖浏览器或推送服务。

用 JoliNotif 实现桌面端跨平台通知(Windows/macOS/Linux)
如果你只需要在开发机或内部管理后台弹个本地提示,比如“订单已入库”“日志扫描完成”,JoliNotif 是目前 PHP 生态里最轻量、最省心的选择——它不依赖浏览器、不碰证书、也不需要设备 token。
它背后是自动识别系统环境后调用原生能力:AppleScript(macOS)、libnotify(Linux)、PowerShell(Windows),连 terminal-notifier 都备了 fallback 路径。
- 安装只需:
composer require jolicode/jolinotif,PHP 7.2+ 即可运行 - 不支持 iOS/Android 手机推送,别把它当极光或 FCM 用——这是常见误用起点
- 图标路径必须是绝对路径,相对路径在 PowerShell 下大概率静默失败
- macOS 上若提示「无法验证开发者」,需在「系统设置 → 隐私与安全性」手动允许
向 iOS/Android App 推送:必须走 APNs + FCM 双通道
PHP 本身不能直连苹果或谷歌的推送网关,必须通过它们的官方协议中转。iOS 走 APNs(要用 .p8 文件和 deviceToken),Android 主流走 FCM(用 server key 和 registration token)。两者协议、认证、错误码全不同,没法“统一接口”糊弄过去。
- APNs 要求 HTTPS + HTTP/2 + JWT 签名,PHP 用
ext-curl必须开启CURLOPT_HTTPHEADER设置apns-topic,漏设就返回400 Bad Request - FCM 的
server key在 Firebase 控制台「项目设置 → 云消息传递」里,不是 Web API key,拿错会返回401 Unauthorized - 别试图用同一个 token 同时发给 APNs 和 FCM——iOS 设备收不到 FCM 消息,Android 设备也解析不了 APNs payload
- 真实项目里,通常把 deviceToken 存进数据库并打上
platform: ios/android标签,推送前先查再分发
Web 页面推送:用 Push API + PHP 做后端中转
浏览器的 Push API 不接受 PHP 直推,必须由前端先调用 serviceWorker.register() 获取 pushSubscription,再把其中的 endpoint、keys.p256dh、keys.auth 传给 PHP 后端存起来。之后 PHP 才能用这些信息加密并 POST 到对应 endpoint。
- 加密必须用
web-push-php这类库(基于libsodium),手写 AES-GCM 几乎必出错 - Chrome 和 Firefox 的 endpoint 域名不同(
fcm.googleapis.comvsupdates.push.services.mozilla.com),但 PHP 发送逻辑一致 - 用户没点“允许通知”,
pushSubscription就是null,后端收到空值要忽略,否则后续加密会崩 - Web 推送无法穿透浏览器关闭状态——它本质是 service worker 消息,不是系统级通知
想“一套代码打三端”?得靠抽象层,不是靠偷懒
没有银弹。所谓“统一推送”,实际是 PHP 写一个调度器,根据目标设备类型路由到不同通道:iOS 走 APNs 客户端,Android 走 FCM 客户端,Web 走 web-push-php,桌面走 JoliNotif。四者共用的只有业务数据组装逻辑。
- 别在控制器里 if-else 判 platform——抽成
PushDispatcher类,每个通道实现send($payload, $target)接口 - APNs 和 FCM 都有重试机制,但失败原因天差地别:
410 Gone(token 失效)要删库,429 Too Many Requests得加退避,混在一起处理等于埋雷 - Web 推送的加密密钥有效期约 1 年,但用户可能换设备、清缓存,
pushSubscription会变,必须设计更新接口,不能只存一次
真正麻烦的从来不是发出去,而是怎么确认对方收到了、为什么没收到、下次该不该重发——这些逻辑一旦耦合进推送调用本身,后面改起来就只剩硬扛。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











