Мой периферийный Bluetooth иногда не распознается моим iphone в фоновом режиме. Proximo by Kensington работает

Я занимаюсь разработкой устройства Bluetooth 4.0 BLE. Это работает очень просто. Он объявляет один UUID службы и дополнительную специальную полезную нагрузку, которые содержат 0xFF (Данные, специфичные для производителя). Он не публикует никакие данные профиля GATT, кроме UUID службы в объявлении.

Основная идея заключается в том, что когда пользователь приближается к устройству, на iphone должно отображаться сообщение. Я не пытаюсь создать другой протокол iBeacon, но у этого приложения будет определенная цель:)

Приложение работает безупречно, когда оно на переднем плане, и иногда оно работает, когда приложение находится в фоновом режиме, особенно через несколько минут после того, как я перевел телефон в спящий режим. Я включил "bluetooth-центральный" фоновый режим в UIBackgroundModes.

Очень часто приложение никогда не замечает, что аппаратное обеспечение Bluetooth находится рядом, а приложение находится в фоновом режиме, и это главная проблема, с которой мне нужна помощь. В течение нескольких месяцев я думал, что именно так работает iOS.

Теперь я купил брелок Kensington Proximo Bluetooth Tracker, и после некоторого тестирования я обнаружил, что это устройство действительно может разбудить iPhone. Я пытаюсь понять, как.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSDictionary *options = @{ CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier", CBCentralManagerScanOptionAllowDuplicatesKey:[NSNumber numberWithBool:NO]};
    self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options];
    return YES;
}

- (void)centralManager:(CBCentralManager *)central willRestoreState:(NSDictionary *)dict {
    NSLog(@"Restored, %@", dict);
}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
    NSDictionary *options = @{ CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier", CBCentralManagerScanOptionAllowDuplicatesKey:[NSNumber numberWithBool:NO]};

    if (self.manager.state == CBCentralManagerStatePoweredOn) {
        //Note, the actual UUID has been replaced below:
        [self.manager scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"12345678-1234-1234-1234-123456789012"]] options:options];
    }
}

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
    UILocalNotification* localNotification = [[UILocalNotification alloc] init];
    localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
    localNotification.alertBody = @"It is close!";
    localNotification.soundName = UILocalNotificationDefaultSoundName;
    localNotification.applicationIconBadgeNumber = 1;
    localNotification.timeZone = [NSTimeZone defaultTimeZone];
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    NSLog(@"%@", advertisementData);
}

1 ответ

Решение

Проверьте https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html

Вкратце: в фоновом режиме ваше приложение не будет обнаруживать устройство при сканировании, если оно уже видело это устройство. Вы можете подключиться к известному устройству, пытаясь подключиться к нему. Я думаю, что Kensington Tracker делает это.

Другие вопросы по тегам