Ios 从Apple Watch应用程序可以知道主机应用程序是否在前台吗?

Ios 从Apple Watch应用程序可以知道主机应用程序是否在前台吗?,ios,watchkit,apple-watch,Ios,Watchkit,Apple Watch,我知道,通过Watch应用程序,我们可以使用openParentApplication(userInfo:reply)唤醒主机应用程序,但是在调用openParentApplication之前,有没有办法知道主机应用程序当前是否正在运行 谢谢 您可以跟踪NSExtensionContext,但您不知道手表应用启动时主机应用正在运行的状态 您可以在NSUserDefaults中放置一个标志,并让主机应用程序在ApplicationLegate的applicationWilllEnterForegr

我知道,通过Watch应用程序,我们可以使用
openParentApplication(userInfo:reply)
唤醒主机应用程序,但是在调用
openParentApplication
之前,有没有办法知道主机应用程序当前是否正在运行


谢谢

您可以跟踪
NSExtensionContext
,但您不知道手表应用启动时主机应用正在运行的状态

您可以在
NSUserDefaults
中放置一个标志,并让主机应用程序在ApplicationLegate的
applicationWilllEnterForeground
ApplicationIdentinterBackground
等中更改该标志。然后共享中所述的默认值

如果使用
NSUserDefaults
这似乎是一种奇怪的方式,那么您需要对Darwin通知做些什么。它建立在达尔文的基础之上,对很多人都很有用


简短回答:选择一种在主机应用程序和手表之间进行通信的方法,该方法不依赖于
openParentApplication
&回复,然后将主机应用程序中继状态信息发送到手表应用程序。

openParentApplication将不会使您的iPhone应用程序进入活动状态。因此,一种简单的方法是调用openParentApplication。在该方法中,只需将以下bool放入随reply()返回的NSDictionary中即可返回:


您可以在手表控制器中调用
openParentApplication:reply:
方法向该应用程序发送请求并接收响应

当您调用
openParentApplication:reply:
方法时,iOS会在后台启动或唤醒包含iOS的应用程序,并调用其应用程序委托的
应用程序:handleWatchKitExtensionRequest:reply:
方法。应用程序委托使用提供的字典执行请求,然后向WatchKit扩展返回回复。你可以阅读更多细节

AppDelegate中的

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply {
    let state = UIApplication.applicationState
    let replyDict = ["appState" : state]
    reply(replyDict)
}
在WatchController中

WKInterfaceController.openParentApplication(dictionary) {
        (replyDict, error) -> Void in
    //You will get the replyDict here, which contains application state.
}

希望这有帮助。

酷,谢谢!我有一个问题,openParentApplication方法中的“error”变量来自哪里?它没有被handleWatchKitExtensionRequest的块传递,所以我想知道它是如何在那里传递的。“error”是一个NSError对象,指示是否发生了问题,或者如果没有错误,则为nil。我认为当watchkit无法打开父应用程序时,它会收到N错误。我找不到太多细节。
WKInterfaceController.openParentApplication(dictionary) {
        (replyDict, error) -> Void in
    //You will get the replyDict here, which contains application state.
}