何时调用 WCSession 对象上的 activateSession()

When to call activateSession() on WCSession object

我想知道什么时候会在手表和 iOS 设备上的 WCSession 对象上调用 activateSession()。

文档中说:

在调用任何与会话相关的方法之前,始终分配一个委托并激活您的会话。在发送消息或获取有关连接状态的信息之前,必须配置和激活会话。

起初以为我把我的代码用于初始化会话:

 if (WCSession.isSupported()) {
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }

viewDidLoad 在 iOS 设备上和在 willActivate 在手表端。

有效... 但我认为这不是一个好的解决方案。 我还不太熟悉应用程序生命周期,但据我了解,每次打开应用程序时都会调用它们。

每次打开其中一个应用程序时是否会导致 "reconnect"?

在哪里放置该代码比较合适?

当您将 WCSession 代码放入 viewDidLoadwillActivate 时,它不仅会在应用程序打开时被调用,而且每次显示包含代码的视图控制器时都会被调用。所以那不是一个理想的地方。

放置此代码的最佳位置是您应用 AppDelegate 中的 application:didFinishLaunchingWithOptions 和手表扩展 ExtensionDelegate

中的 applicationDidFinishLaunching

您可以将所有会话处理放入一个单例中 class,如这个很棒的 tutorial by @NatashaTheRobot 中所建议的。

这样,会话只会在应用程序保存在内存中时创建一次。

编辑

正如 ccjensen 在他的评论中指出的那样,如果您将连接用于 ComplicationNotificationGlance 更新您必须在 ExtensionDelegate 的 init 方法中激活会话。 applicationDidFinishLaunching 在这些情况下不会被调用。