2015-08-16 3 views
3

У меня есть следующий сценарий: IOS приложение (периферийное) X OSX приложение (центральный)CoreBluetooth Государственного Сохранение и восстановление

  • я создаю экземпляр моего периферийное менеджер с CBPeripheralManagerOptionRestoreIdentifierKey.
  • В didFinishLaunchingWithOptions моей Peripheral, я отправить локальное уведомление после получения периферийного с UIApplicationLaunchOptionsBluetoothPeripheralsKey (ничего с ним не делать)
  • В willRestoreState моей Peripheral, я также вызвать уведомление (ничего кроме того, что не делать)

Если мое периферийное приложение все еще работает в фоновом режиме, прежде чем оно будет убито из-за нехватки памяти, я получаю сообщения от центрального процессора OSX.

После того, как приложение iOS будет убито, когда центральное устройство OSX отправит сообщение, оба уведомления, упомянутые выше, приходят на iOS, но сообщение, которое я действительно ожидал, не было.

Я не переустанавливал свой периферийный диспетчер в любой момент, где и как я должен это делать? У меня есть только один периферийный диспетчер для всего цикла моего приложения.

Любые предложения приветствуются.

UPDATE:

если сделать

let options: Dictionary = [CBPeripheralManagerOptionRestoreIdentifierKey: "myId"] 
peripheralManager = CBPeripheralManager(delegate: self, queue: nil, options: options) 

в willRestoreState, мои приложения просто теряют связь

ответ

1

справа, после того, как повторно viseted все темы по этому вопросу 100 раз я, наконец, понял, это именно то, как это должно быть реализовано:

in AppDelegate's didFinishLaunchingWithOptions:

if let options = launchOptions { 
    if let peripheralManagerIdentifiers: NSArray = options[UIApplicationLaunchOptionsBluetoothPeripheralsKey] as? NSArray { 

     //Loop through peripheralManagerIdentifiers reinstantiating each of your peripheralManagers 
     //CBPeripheralManager(delegate: corebluetooth, queue: nil, options: [CBPeripheralManagerOptionRestoreIdentifierKey: "identifierInArray"]) 

    } 
    else { 
     //There are no peripheralManagers to be reinstantiated, instantiate them as you normally would 
    } 
} 
else { 
    //There is nothing in launchOptions, instantiate them as you normally would 
} 

На данный момент, willRestoreState должен начать получать вызовы, однако в вашем массиве центральных центров не будет центров, если вы сможете управлять всеми центрами, подписанными на ваши характеристики. Поскольку все мои центральные группы всегда подписываются на все мои характеристики в одной единственной службе, у меня есть, я просто зацикливаю, хотя все подписываемыеЦентры в любой из характеристик повторно добавляют их в мой массив центров.

Пожалуйста, измените это в соответствии с вашими потребностями.

В willRestoreState:

var services = dict[CBPeripheralManagerRestoredStateServicesKey] as! [CBMutableService] 

if let service = services.first { 

    if let characteristic = service.characteristics?.first as? CBMutableCharacteristic { 

     for subscribedCentral in characteristic.subscribedCentrals! { 
      self.cbCentrals.append(subscribedCentral as! CBCentral) 
     } 

    } 

} 

После этого вы должны быть в порядке, чтобы вызывать любые методы, которые вы подготовили, чтобы поговорить с любым центральным, даже если вы имеете дело с несколькими из них одновременно.

Удачи вам!

+0

Вам нужно создать/запустить CBPeripheralManager (или CBCentralManager) из AppDelegate? В настоящее время я имею это в отдельном классе singleton, и он не работает для меня. –

+0

У меня также есть это в отдельном классе, но не в статической переменной в AppDelegate, но это переменная экземпляра, хранящаяся в AppDelegate, созданная при запуске приложения, каждый раз, когда мне нужно получить доступ к нему из другого класса, мне нужно получить ссылку на AppDelegate и доступ к моей переменной оттуда.Вероятно, это не лучшая реализация для одноэлементного, но он работает, я переделываю рефакторинг, чтобы в конечном итоге использовать статическую переменную в AppDelegate и получить доступ к ней через sharedInstance. В принципе, у меня есть аналогичная настройка для вашего ... –

+0

Вы можете продолжить сканирование устройства с помощью этого кода, когда приложение будет завершено? Я не могу заставить его работать до сих пор, он никогда не находит устройства, когда приложение прекращается. Работы находят, когда они активны или в фоновом режиме. Однако я не установил пользовательскую очередь (используя нуль) в центральном диспетчере. Интересно, вызывает ли это проблема, поскольку основная очередь (по умолчанию для nil) ушла в этот момент? –

 Смежные вопросы

  • Нет связанных вопросов^_^