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

Dav*_*ker 4 lifecycle swift watchos-2 wcsession

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

在文档中它说:

始终在调用任何与会话相关的方法之前分配代理并激活会话.必须先配置并激活会话,然后才能发送消息或获取有关连接状态的信息.

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

 if (WCSession.isSupported()) {
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
Run Code Online (Sandbox Code Playgroud)

在iOS设备上的viewDidLoad和手表端的willActivate中.

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

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

放置该代码的好地方在哪里?

joe*_*ern 10

当您输入WCSession代码时viewDidLoad,willActivate不仅在打开应用程序时调用它,而且每次显示包含代码的视图控制器时.所以这不是一个理想的地方.

放置此代码的最佳位置是在application:didFinishLaunchingWithOptions您的应用程序AppDelegateapplicationDidFinishLaunching手表扩展程序中ExtensionDelegate

您可以将所有会话处理放入单例类中,如@NatashaTheRobot在本教程中所建议的那样.

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

编辑

正如ccjensen在他的评论中指出的,如果您使用连接进行复杂,通知Glance更新,则必须在ExtensionDelegate的init方法中激活会话.applicationDidFinishLaunching在这些情况下不会被调用.

  • 实际上,ExtensionDelegate的applicationDidFinishLaunching仅在启动WatchKit应用程序时调用.在为复杂,通知或一瞥更新启动扩展时,不会调用它.ExtensionDelegate的init方法是一个更好的地方,因为它将在所有其他情况下被调用. (5认同)