App 挂后台一会后再打开设备状态展示不对解决方式

App开发相关产品技术讨论,包括OEM App、App SDK等话题


Post Reply
aotuo
Posts: 1

问题描述

使用 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 为例

  1. 添加 MQTT 通道监听

    Code: Select all

    #import <ThingSmartMQTTChannelKit/ThingSmartMQTTChannelKit.h>
    @implementation XXXX
    - (void)addMqttListener {
        // 添加 MQTT 通道监听事件,注意若用户退出登录后 delegate 会被清理,需要重新添加
        [[ThingSmartMQTTChannel sharedInstance] addDelegate:self];
    }
    @end
    
  2. 实现 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
    

这样一来,也一并解决了手机断网过程中,设备上报消息的丢失


Tags:
Post Reply