Когда вызывать activSession() для объекта WCSession

Интересно, в какой момент можно было бы вызвать activSession() для объекта WCSession на часах и на устройстве iOS.

В документации сказано:

Всегда назначайте делегата и активируйте сеанс перед вызовом любых методов, связанных с сеансом. Сеанс должен быть настроен и активирован перед отправкой сообщений или получением информации о состоянии соединения.

Сначала подумал, что я положил свой код для инициализации сеанса:

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

во viewDidLoad на устройстве iOS и в willActivate на стороне часов.

Это работает... но я не думаю, что это хорошее решение. Я еще не слишком знаком с жизненным циклом приложения, но, насколько я понимаю, они вызываются каждый раз, когда приложение открывается.

Это приводит к "переподключению" каждый раз, когда открывается одно из приложений?

Где было бы хорошее место для размещения этого кода?

1 ответ

Решение

Когда вы положите WCSession код в viewDidLoad а также willActivate он вызывается не только при открытии приложения, но и каждый раз, когда отображается контроллер представления, содержащий код. Так что это не идеальное место.

Лучшее место, чтобы поместить этот код в application:didFinishLaunchingWithOptions в вашем приложении AppDelegate И в applicationDidFinishLaunching в ваших расширениях часов ExtensionDelegate

Вы можете поместить всю обработку сессий в одноэлементный класс, как предложено в этом замечательном учебнике @NatashaTheRobot.

Таким образом, сеанс создается только один раз за время, в течение которого приложение хранится в памяти.

РЕДАКТИРОВАТЬ

Как указал ccjensen в своем комментарии, если вы используете соединение для обновления Complication, Notification или Glance, вы должны активировать сеанс в ExtensionDelegate. init метод. applicationDidFinishLaunching не будет вызван в этих случаях.

Другие вопросы по тегам