Situation:
自从用户将他们的iOS升级到11和/或WatchOS升级到4以来,我们的iOS应用似乎在WatchOS应用启动时不会触发任何计划定时器。也许我们在从WatchOS应用程序启动我们的主应用程序时做错了什么。 Context & code:
我们的WatchOS应用程序是一个伴侣应用程序,允许用户通过按下按钮在后台启动/停止我们的iPhone应用程序。我们通过使用以下方式实现此目的:
自从用户将他们的iOS升级到11和/或WatchOS升级到4以来,我们的iOS应用似乎在WatchOS应用启动时不会触发任何计划定时器。也许我们在从WatchOS应用程序启动我们的主应用程序时做错了什么。 Context & code:
我们的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 or Name-->输入应用程序名称。然后从Apple Watch启动我们的应用程序并进行调试。
- iOS 11.0.3上的WatchOS 4.0上可复制的iPhone 6
问题:从手表应用程序启动我们的主要应用程序的最佳方法是什么?iOS 11/WatchOS 4的后台状态是否有所改变?我能找到相关文档吗?这可能是iOS的一个错误吗?