Фоновая задача выполняется только тогда, когда iPhone подключен к системе (любая ОС: Windows, Mac или Ubuntu), но не иначе - PullRequest
0 голосов
/ 27 апреля 2018

Приложение находится в фоновом режиме, и оно получает обратный вызов при отключении от устройства BLE, после чего приложение должно некоторое время ждать (1 минуту), а затем выполнить какой-то фрагмент кода. Приложение работает должным образом даже в фоновом режиме и просто подключено к системе (Mac, Windows или Ubuntu), но не иначе. Такое поведение наблюдается только на iOS 11.3, а не на 10.3.

Когда приложение находится в фоновом режиме и получает обратный вызов, когда устройство BLE отключено, приложение регистрируется для фоновой задачи с таймером 1 минута, после чего должен быть выполнен определенный вызов API.

Ниже были мои наблюдения:

  1. Если устройство подключено к системе, все фоновые задачи и API звонки сделаны изящно.
  2. Если устройство не подключено к системе, тогда фоновая задача и вызовы API не выполняются в iOS 11.3, но отлично работают на 10.3 (если таймер больше 10 секунд, то нормально работает на 10.3, но не на 11.3)
  3. Когда я выполняю беспроводную отладку, соединение с iPhone автоматически теряется через несколько секунд (> 10). (Такое поведение наблюдается в 11.3)
  4. Когда таймер меньше или равен 10 секундам, приложение отлично работает на всех версиях и даже не подключено ни к одной системе.

Это код в AppDelegate для запуска таймера в фоновом режиме:

func startTimerWith(timeInterval: TimeInterval) {
    registerBackgroundTask()
    timer = Timer.scheduledTimer(withTimeInterval: timeInterval, repeats: false, block: { (timer) in
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "Time"), object: nil)
        self.endBackgroundTask()
    })
}

func registerBackgroundTask() {
    backgroundTask = UIApplication.shared.beginBackgroundTask(expirationHandler: {
        self.endBackgroundTask()
    })
}

func endBackgroundTask() {
    print("Background task ended.")
    UIApplication.shared.endBackgroundTask(backgroundTask)
    backgroundTask = UIBackgroundTaskInvalid
    timer?.invalidate()
    timer = nil
}

При отключении от устройства BLE я запускаю таймер, регистрируясь в фоновом режиме:

func disconnected(_ peripheral: CBPeripheral, with error: Error?) {
    print("DISCONNECTED!!!")
    AppDelegate.sharedApp().startTimerWith(timeInterval: TimeInterval(TIME))
    BLEDeviceHandler.sharedInstance.handleBLEDevice(connectedPeripheral!)
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...