Я работаю над приложением, которое использует 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?