Watchkit и WCSession

По своему небольшому опыту я заметил, что при создании двух или более интерфейсных контроллеров (IC) для приложения WatchKit AppleWatch начинает загружать следующий интерфейс до того, как пользователь перейдет к нему. Это может быть полезно для производительности системы, но тогда меня что-то смущает. Как я понял, у каждой IC должна быть своя собственная WCSession для связи с сопряженным iPhone, но я начинаю думать, что это неправда, потому что при отладке я увидел, что если, например, первая IC использует sendMessage для отправки запроса, ответ будет получено didReceiveMessage второго IC, а не первого IC. Я еще не пробовал, но, возможно, мне следует создать WCSession только в первом IC, а также, если я нахожусь на другом IC, приложение запускает его в didReceiveMessage первого. Если это правильно, как я могу что-то сделать во втором IC, когда приходит сообщение? В WatchKit я не думаю, что смогу использовать Observers. Может кто-нибудь разъяснить мне это, пожалуйста?

Проведя еще несколько поисков в Интернете, я нашел это: http://www.sneakycrab.com/blog/2015/5/26/wkinterfacecontroller-lifecycle-in-watchos-101 Это подтверждение предварительной загрузки IC, которая остается такой же и в WatchOS 2. .


person Nicola    schedule 27.10.2015    source источник


Ответы (3)


Вы используете WCSession.defaultSession, что нормально, как рекомендует Apple, но это означает, что session указывает на один и тот же объект в обоих WKInterfaceControllers, поэтому session.delegate = self по дизайну устанавливает делегат сеанса в зависимости от того, какой WKInterfaceController был загружен (не отображен) последним. Как вы обнаружили, контроллеры WKInterfaceController часто загружаются до того, как они конкретно потребуются, что Apple явно документы.

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

person Duncan Babbage    schedule 30.03.2016

Используя глобальные общедоступные переменные, теперь я могу запустить правильный сеанс.

----- myVariables.swift -----
public var showPage1: Bool = false

----- myMainIC.swift -----
override func willActivate() {
    super.willActivate()
    showPage1 = false
}

----- mySecondIC.swift -----
var session: WCSession?
override func WillActivate() {
    super.willActivate()
    // this way I can manage the pre-load
    if (showPage1 == false) {
        showPage1 = true
        return
    }
    // now I can create the session
    if WCSession.isSupported() {
        session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
}

Из-за предварительной загрузки системы, описанной в приведенной выше статье, я должен «научить» mySecondIC не создавать сеанс при первой активации страницы, потому что она невидима.

person Nicola    schedule 29.10.2015

Отправлять данные с помощью transferCurrentComplicationUserInfo и получать данные в watchkit с помощью - (void)session:(WCSession *)session didReceiveUserInfo:(NSDictionary *)userInfo

метод.

person Krupa Prajapati    schedule 21.11.2015