You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在无谷歌服务的商米(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

火山引擎 最新活动