Я разрабатываю аппаратное устройство Bluetooth 4.0 BLE. Он работает очень просто. Он рекламирует единый UUID службы и дополнительную специальную полезную нагрузку, которая содержит 0xFF (конкретные данные производителя). Он не публикует данные профиля GATT, кроме служебного UUID в рекламе.Мое периферийное устройство Bluetooth иногда не распознается моим фоном. Proximo by Kensington works
Основная идея заключается в том, что при приближении пользователя к устройству сообщение должно отображаться на iphone. Я не пытаюсь создать другой протокол iBeacon, но это приложение будет иметь конкретную цель :)
Приложение работает безупречно, когда на переднем плане, а также иногда работает, когда приложение находится в фоновом режиме, особенно через несколько минут после того, как я поместил телефон в спать. Я включил фоновый режим «bluetooth-central» в UIBackgroundModes.
Очень часто приложение никогда не замечает, что аппаратное обеспечение bluetooth близко, а приложение находится в фоновом режиме, и это основная проблема, с которой мне нужна помощь. В течение нескольких месяцев я думал, что это именно то, как работает iOS.
Теперь я купил Kensington Proximo Bluetooth Tracker Fob, и после некоторого тестирования я обнаружил, что это устройство действительно может разбудить 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);
}
Спасибо за ответ. Я знаю, что он не обнаружит устройство, если он его видел раньше. Но это не совсем правильно. Если я изменю некоторые данные о конкретных производителях, он узнает его снова. Иногда это работает хорошо, но иногда не так, поэтому мне нужно знать, как это сделать, как это делает Proximo от Kensington. –
Я бы предположил, что программное обеспечение Proximo пытается подключиться к (известному) устройству. Я не пробовал этого, но я буду, потому что сталкиваюсь с подобным вызовом. –