问题描述
使用 SDK 开发的 App,将 App 退到后台(不杀死 App)一段时间,此时保持 App 不打开的情况去操作设备(如:开/关),之后再打开 App 进入设备面板,发现状态不正确,iOS 比较容易出现。
问题原因
本质是 App 在后台被系统挂起时,通常我们接收设备上报的通道(MQTT 通道)会被关闭,导致数据无法实时不同步。由于 iOS 的后台管理机制比安卓更严格,通常在挂后台 30s / 锁屏 20s 左右会被系统挂起,而安卓通常会做保活机制,其通道的存活时间会更长一些。
以 iOS 日志为例,这里展示了进入后台被挂起后,MQTT 通讯通道被关闭的日志
Code: Select all
// App 被放置后台
14:15:29 [INFO] <ThingSmartMQTTChannelKit> enter background.(nT: 8)
// 一段事件后,App 被系统挂起
14:15:55 [INFO] <ThingSmartMQTTChannelKit> background task expiration.(T:8 E:0)
// MQTT 通道被关闭
14:15:55 [INFO] <ThingSmartMQTTChannelKit> connect state : iOS_*****_****** connection closed (2) (null)
如何解决
监听 MQTT 通道连接状态变化事件,当通道重连后,调用拉取家庭设备列表信息接口进行刷新,同时自行通知所有与设备相关的页面刷新。
代码样例
以 iOS 为例
添加 MQTT 通道监听
Code: Select all
#import <ThingSmartMQTTChannelKit/ThingSmartMQTTChannelKit.h> @implementation XXXX - (void)addMqttListener { // 添加 MQTT 通道监听事件,注意若用户退出登录后 delegate 会被清理,需要重新添加 [[ThingSmartMQTTChannel sharedInstance] addDelegate:self]; } @end
实现 MQTT 通道状态变化回调方法
Code: Select all
@interface XXXX () <ThingSmartMQTTChannelDelegate> @end @implementation XXXX - (void)mqttChannel:(ThingSmartMQTTChannel *)mqttChannel connectState:(ThingSmartMqttConnectState)connectState error:(NSError *)error { if (connectState == ThingSmartMqttConnectStateConnected) { // mqtt 已连接状态 // 通常在这里去刷新当前家庭下设备列表 / 刷新单个设备 } } @end
这样一来,也一并解决了手机断网过程中,设备上报消息的丢失