Flutter应用Pusher实时数据接收异常:模拟器正常,真机无数据
Flutter Pusher实时数据接收问题:模拟器正常,实体机无数据
针对你遇到的模拟器能正常接收Pusher实时数据,但实体机无法接收的问题,整理以下排查和解决步骤:
1. 排查网络环境差异
模拟器通常使用WiFi网络,而实体机可能使用移动数据。部分运营商会限制WebSocket连接(Pusher默认采用WebSocket),可以先切换实体机到WiFi环境测试是否能正常接收数据。如果必须使用移动数据,可在Pusher初始化时开启HTTP轮询 fallback:
await pusher.init( apiKey: 'xxxxxxxxxx', cluster: 'xxxxxxx', onEvent: (myEvent) { setState(() { data = myEvent.data; }); }, options: PusherOptions( encrypted: true, useTLS: true, activityTimeout: 120000, // 开启HTTP轮询 fallback ), );
2. 补充Android权限
仅添加INTERNET权限可能不足以维持稳定连接,在AndroidManifest.xml中补充必要权限:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
ACCESS_NETWORK_STATE:让应用检测当前网络状态,避免断网时无效重连WAKE_LOCK:防止应用在后台时被系统休眠,维持Pusher连接
3. 增强日志定位问题
在代码中添加连接状态和错误日志,明确实体机上的问题环节:
Future<void> _initPusher() async { PusherChannelsFlutter pusher = PusherChannelsFlutter.getInstance(); try { await pusher.init( apiKey: 'xxxxxxxxxx', cluster: 'xxxxxxx', onEvent: (myEvent) { print("[PUSHER] 收到事件: ${myEvent.eventName},数据: ${myEvent.data}"); setState(() { data = myEvent.data; }); }, onConnectionStateChange: (state) { print("[PUSHER] 连接状态变化: ${state.currentState} -> ${state.previousState}"); }, onError: (error) { print("[PUSHER] 错误: ${error.message},代码: ${error.code}"); }); await pusher.subscribe(channelName: 'my_channel'); await pusher.connect(); } catch (e) { if (kDebugMode) { print("[PUSHER] 初始化错误: $e"); } } }
运行实体机后查看Logcat日志,确认是连接失败、订阅失败还是未收到事件。
4. 检查系统限制
- 省电策略:部分安卓厂商的省电模式会强制关闭后台应用的网络连接,将你的应用加入系统省电白名单
- 代理设置:实体机若开启了代理,可能拦截Pusher的WebSocket请求,尝试关闭代理测试
- 系统版本:确认实体机安卓版本是否满足Pusher SDK最低要求(通常Android 6.0以上无问题,低版本需额外配置)
内容的提问来源于stack exchange,提问作者user15723984
相关产品推荐
相关产品推荐

