在无谷歌服务的商米(Sunmi)设备上接收推送通知 - Flutter
在无谷歌服务的商米(Sunmi)设备上接收推送通知 - Flutter
我之前帮几个做Sunmi设备应用的开发者解决过类似问题,结合Sunmi设备的特性和Flutter的适配情况,给你整理几个最靠谱的方案,按优先级推荐:
一、优先用Sunmi官方推送服务(最适配自家设备)
Sunmi针对旗下设备推出了专属的推送SDK,专门做了兼容性优化,稳定性是最有保障的。不过目前没有官方的Flutter插件,需要通过Flutter的MethodChannel桥接原生代码来集成:
- 第一步:安卓端集成Sunmi Push SDK,去Sunmi开发者平台下载对应版本的SDK,按照官方文档配置安卓项目(比如添加依赖、配置Manifest权限、在Application类里初始化SDK)
- 第二步:在Flutter层通过MethodChannel调用原生的注册接口,获取设备的推送Token,用来给指定设备发推送
- 第三步:原生层监听推送消息的接收事件,收到后通过MethodChannel把消息内容回调给Flutter,再在Flutter里处理通知栏展示、点击跳转等逻辑
小提醒:别忘了在Sunmi开发者后台完成应用的实名认证和配置,推送消息需要从你的服务端发送到Sunmi推送服务器,再下发到设备
二、国内第三方推送服务(无需GMS,集成成本低)
如果不想折腾原生桥接的话,国内的第三方推送服务在无GMS的安卓设备上支持得非常好,推荐这两个成熟的选项:
1. 个推(Getui)
有官方维护的Flutter插件flutter_getui,集成步骤很清晰:
- 在pubspec.yaml里添加依赖:
flutter_getui: ^最新版本号 - 安卓端配置:在AndroidManifest.xml中添加个推要求的权限、服务组件,把在个推后台申请的AppID、AppKey配置进去
- Flutter端初始化:在main函数里调用
GeTuiSdk.startSdk(appId, appKey, appSecret)完成初始化 - 监听消息:注册消息接收和点击的回调,直接在Flutter里处理通知展示和业务逻辑
个推的通道在安卓设备上不需要依赖GMS,稳定性经过大量线下设备验证,很多做收银、零售设备的团队都在用。
2. 极光推送(JPush)
同样有官方Flutter插件jpush_flutter,适配无GMS设备:
- 依赖添加:
jpush_flutter: ^最新版本号 - 安卓项目配置:把极光后台获取的AppKey配置到AndroidManifest中,开启必要的后台权限
- 初始化和消息监听逻辑和个推类似,极光的后台管理界面很友好,支持批量推送、标签分组推送等功能,适合有精细化推送需求的场景
三、自建长连接方案(完全可控,适合特殊需求)
如果你的团队有能力维护自己的服务端,自建长连接是个完全可控的方案,适合对推送内容有严格安全要求的场景:
1. WebSocket方案
Flutter里可以用web_socket_channel插件快速实现长连接:
- 添加依赖:
web_socket_channel: ^最新版本号 - 简单连接示例:
import 'package:web_socket_channel/io.dart'; final channel = IOWebSocketChannel.connect('wss://你的服务端地址'); // 监听推送消息 channel.stream.listen((message) { // 收到消息后,调用Flutter的通知插件展示通知栏 _showNotification(message); }); // 记得处理重连逻辑,比如网络断开后自动重试连接
2. MQTT协议方案
MQTT是物联网场景常用的轻量级协议,天生适合设备端的推送场景,可靠性更高:
- 用
mqtt_client插件实现:
import 'package:mqtt_client/mqtt_client.dart'; final client = MqttServerClient.withPort('你的MQTT Broker地址', '设备唯一标识ID', 1883); // 连接Broker await client.connect(); // 订阅推送主题 client.subscribe('你的推送主题', MqttQos.atLeastOnce); // 监听消息 client.updates.listen((List<MqttReceivedMessage<MqttMessage>> messages) { final payload = messages[0].payload as MqttPublishMessage; final content = utf8.decode(payload.payload.message); // 处理并展示通知 _handlePushMessage(content); });
MQTT的QoS机制能保证消息不丢失,适合对推送可靠性要求极高的场景,比如订单通知、告警消息等。
最后要注意的细节
不管你选哪种方案,一定要引导用户在Sunmi设备上开启自启动权限和后台弹出权限,因为Sunmi的定制安卓系统有严格的后台限制,否则推送服务可能会被系统杀死,导致收不到消息。测试的时候一定要用真实的Sunmi设备,模拟器模拟不了真实的推送场景哦。
备注:内容来源于stack exchange,提问作者Naji Ezzeldien




