Сбой сеанса AWS MQTT в фоновом режиме - PullRequest
0 голосов
/ 05 марта 2019

Я работаю над приложением, которое использует BLE для подключения к внешнему устройству, оно получает от него информацию, а затем использует AWS SDK (IoT и MQTT) для отправки данных на облачный сервер.

Я сталкиваюсь с тем, что если приложение переходит в фоновый режим, то примерно через 10 минут происходит сбой приложения из-за последней строки в следующем коде из AWSMQTTSession.m:

- (void)timerHandler:(NSTimer*)theTimer {
idleTimer++;

//Send a pingreq if idleTimer is > keepAliveInterval. The idleTimer is increment per iteration of the timer, i.e., every second
if (idleTimer >= keepAliveInterval) {
    if ([encoder status] == AWSMQTTEncoderStatusReady) {
        AWSDDLogVerbose(@"<<%@>> sending PINGREQ", [NSThread currentThread]);
        [encoder encodeMessage:[AWSMQTTMessage pingreqMessage]];
        idleTimer = 0;
    }
}

ticks++;
NSEnumerator *e = [[[self.timerRing objectAtIndex:(ticks % 60)] allObjects] objectEnumerator];

Ошибка:

App crashed from exception: Optional("*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[222]")
Call Stack: 0   CoreFoundation                      0x00000001a3dd7f10 <redacted> + 252
            1   libobjc.A.dylib                     0x00000001a2fa5a40 objc_exception_throw + 56
            2   CoreFoundation                      0x00000001a3d4d85c _CFArgv + 0
            3   CoreFoundation                      0x00000001a3cc6a44 <redacted> + 284
            4   CoreFoundation                      0x00000001a3cc01a8 <redacted> + 52
            5   CoreFoundation                      0x00000001a3ccb314 <redacted> + 252
            6   AWSIoT                              0x0000000101d9b3dc -[AWSMQTTSession timerHandler:] + 812
            7   Foundation                          0x00000001a48885fc __NSFireTimer + 84
            8   CoreFoundation                      0x00000001a3d66bf0 <redacted> + 28
            9   CoreFoundation                      0x00000001a3d66920 <redacted> + 864
            10  CoreFoundation                      0x00000001a3d66154 <redacted> + 248
            11  CoreFoundation                      0x00000001a3d61030 <redacted> + 1880
            12  CoreFoundation                      0x00000001a3d605b8 CFRunLoopRunSpecific + 436
            13  Foundation                          0x00000001a47546a4 <redacted> + 300
            14  AWSIoT                              0x0000000101d916cc -[AWSIoTMQTTClient openStreams:] + 1000
            15  Foundation                          0x00000001a48873b0 <redacted> + 1040
            16  libsystem_pthread.dylib             0x00000001a39f12fc <redacted> + 128
            17  libsystem_pthread.dylib             0x00000001a39f125c _pthread_start + 48
            18  libsystem_pthread.dylib             0x00000001a39f4d08 thread_start + 4

Наше устройство передает данные насоса независимо от состояния приложения, и у нас есть базовые права на использование BLE.Я предполагаю, что iOS завершает работу сокета, но это, похоже, жесткое завершение работы, и AWSMQTTSession никогда не сообщает приложению, что соединение недоступно.сеанс немедленно переподключается, и я сталкиваюсь с той же проблемой.

Есть ли у кого-нибудь советы по отладке этого (если это что-то, что мы неправильно пытаемся отправить), или как мы можем закрыть соединениеа затем откройте его на пару минут, когда мы получим новые данные из нашего соединения BLE?

...