Ситуация:
Так как наши пользователи обновили iOS до 11 и/или WatchOS до 4, наше приложение iOS, похоже, не запускает никаких запланированных таймеров, когда приложение запускается нашим приложением WatchOS. Возможно, мы делаем что-то не так, когда начинаем наше основное приложение из приложения WatchOS.
Контекст и код:
Приложение WatchOS - это приложение-компаньон, которое позволяет пользователю запускать/останавливать наше iPhone-приложение в фоновом режиме, нажимая кнопку. Мы делаем это, используя:
func startMainApp() {
guard WCSession.default().isReachable == true else {
print("Watch is not reachable")
return
}
var data = [String : AnyObject]()
data[WatchActions.actionKey()] = NSNumber.init(value: WatchActions.startApp.rawValue as Int)
WCSession.default().sendMessage(data, replyHandler: { (result: [String : Any]) in
let resultNumber = result[WatchActions.resultKey()] as? NSNumber
let resultBool = resultNumber!.boolValue
if resultBool == true {
self.setModeActivated()
} else {
self.setModeActivationFailed()
}
}) { (error: Error) in
if (error as NSError).code != 7012 {
print("start app error: \(error.localizedDescription)")
self.setModeActivationFailed()
}
}
}
Затем в нашем основном приложении мы получаем сообщение и начинаем наш базовый контроллер:
func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {
if let actionNumber : NSNumber = message[WatchActions.actionKey()] as? NSNumber {
if let watchAction : WatchActions = WatchActions(rawValue: actionNumber.intValue) {
switch(watchAction) {
case .isAppActive:
let result = BaseController.sharedInstance.sleepAndWakeUpController.isAwake()
replyHandler([WatchActions.resultKey() : NSNumber.init(value: result as Bool)])
return
case .startApp:
AudioController.sharedInstance().playActivatedSound()
let isRunningOnForeground = ApplicationStateHelper.isActive()
if isRunningOnForeground == false {
BaseController.sharedInstance.start(inBackground: true)
}
let result = true
replyHandler([WatchActions.resultKey() : NSNumber.init(value: result as Bool)])
DDLogInfo("[APPLE WATCH] [didReceiveMessage] [.startApp]")
return
}
}
}
replyHandler([WatchActions.resultKey() : NSNumber.init(value: false as Bool)])
return
}
Кажется, что все работает по-прежнему, мы правильно получаем GPS-адреса, все наши процессы начинаются, однако Timer
объекты, которые запускаются, не срабатывают.
Это отлично работало до iOS 10, поэтому я подозреваю, что это имеет какое-то отношение к состояниям фона IOS 11, которые работают по-разному. Однако я не могу найти документацию об этом.
Дополнительная информация:
- На iOS 10, когда мы начали наше основное приложение таким образом, приложение стало видимым в многозадачном представлении на iPhone. Теперь на iOS 11 он не отображается в многозадачном представлении, однако он работает на фоне. Я успешно вижу локальные уведомления, которые я планирую на заднем плане, я могу отлаживать активный код и при нажатии на значок приложения приложение сразу же доступно.
- В нашем приложении WatchOS установлена цель развертывания 2.0
- Отладка через XCode с подключенным устройством, используя Debug → Attach to PID или Name → Введенное имя приложения. Затем запустите наше приложение из Apple Watch и отлаживайте.
- Воспроизводимость на iOS 11.0.3 с помощью WatchOS 4.0 на iPhone 6
Вопросы: Каков наилучший способ начать наше основное приложение из приложения часов? Что-то изменилось в iOS 11/WatchOS 4 относительно состояния фона? Могу ли я найти документацию об этом? Может ли это быть ошибкой iOS?