WatchOS 3 - 如何判断父应用程序是否在前台?

WatchOS 3 - How does one tell if the parent app is in the foreground?

我想制作一个远程控制类型的 watchkit 应用程序,我可以通过手表在我的父应用程序的屏幕上触发某些事情。当手表应用程序启动时,我显示一个标签,说明它正在与应用程序连接。

我创建了一个 WCSession 并向该应用程序发送消息以查看该应用程序是否在前台。事实证明,即使应用程序在后台,它仍然会发回响应。因此,我的手表应用认为该应用已准备就绪。

我试过查询 [UIApplication sharedApplication].applicationState 但这总是以 nil 返回,并且在调试期间出现警告,指出 UIApplication 只能在主线程上调用。

我还读到一个类似于 openparentapplication 的函数是这样做的方法,但我相信从 WatchOS 2 或 3 开始,它已被弃用。

我如何才能告诉手表应用程序在前台,这样我就知道可以安全地将我的命令发送到应用程序以更新其中的元素 UI?

据我所知,没有默认方法。

但是,一种可行的方法是从 - (void)applicationDidBecomeActive:(UIApplication *)application;- (void)applicationWillResignActive:(UIApplication *)application; 向 Watch 应用程序发送一条消息,以向手表应用程序发出信号是否可以 "remote control" iOS 应用与否。

因此,在您的 WatchKit 应用中,您应该声明一个布尔变量来存储您的 iOS 应用(类似于 isPhoneAppActive)和来自 iOS 的状态应用程序使用 WatchConnectivity 框架使用此变量的新值发送消息。从 applicationWillResignActive 发送一个 false 值,而从 applicationDidBecomeActive 发送 true。如果 isPhoneAppActive == true.

,则仅从 Watch 应用程序调用您的 "remote control" 函数

当然,您可以使用相同的方法,稍作改动。例如,如果您的 phone 应用程序具有许多其他功能,因此它可能经常在不使用 Watch 应用程序的情况下进入和退出后台模式,将应用程序状态存储在 iOS 应用程序,并在需要时,通过使用 WatchConnectivity 框架发送消息并在 iOS 发送回应用程序状态的回复中检查手表应用程序的此存储状态。