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

标签 swift lifecycle watchos-2 wcsession

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

在文档中它说:

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

起初以为我把我的代码用来初始化 session :

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

在 iOS 设备上的 viewDidLoad 和 watch 端的 willActivate 中。

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

每次打开其中一个应用程序时是否会导致“重新连接”?

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

最佳答案

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

放置此代码的最佳位置是在应用的 AppDelegate 中的 application:didFinishLaunchingWithOptions 和 watch 扩展的 中的 applicationDidFinishLaunching扩展委托(delegate)

你可以把所有的 session 处理放在一个单例类中,正如这个伟大的 tutorial 中所建议的那样通过 @NatashaTheRobot .

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

编辑

作为ccjensen在他的评论中指出,如果您将连接用于 ComplicationNotificationGlance 更新,您必须在 ExtensionDelegate 中激活 session 初始化方法。 applicationDidFinishLaunching 在这些情况下不会被调用。

关于swift - 何时调用 WCSession 对象上的 activateSession(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33168416/

相关文章:

swift - AVPlayerItemVideoOutput.copyPixelBuffer 因 EXC_BAD_ACCESS 失败

java - 如何在 Android 上使用响应式扩展下载带有进度更新的文件

android - 为什么在生命周期范围内 fragment 的上下文为空

Maven:install 和 install:install 有什么区别?

ios - sessionReachabilityDidChange 未在 watch 上调用

ios - 在 watchOS2 中使用 Parse SDK

swift - 从 firebase 数据库中删除

swift - 已经完成时取消请求

ios - NSDocumentDirectory 删除文件夹

ios - WatchKit 项目无法识别 presentAudioRecordingControllerWithOutputURL