Watchkit и WCSession

В моя малък опит забелязах, че създавайки два или повече интерфейсни контролера (IC) за приложение WatchKit, AppleWatch започва да зарежда следващия интерфейс, преди потребителят да плъзне към него. Това може да е полезно за производителността на системата, но тогава нещо ме обърква. Доколкото разбрах, всеки IC трябва да има своя собствена WCSession, за да комуникира със сдвоения iPhone, но започвам да си мисля, че това не е вярно, защото при отстраняване на грешки видях, че ако например първият IC използва sendMessage за изпращане на заявка, отговорът е получено от didReceiveMessage на втория IC, а не от първия IC. Все още не съм го пробвал, но може би трябва да създам WCSession само в първия IC, а също и ако съм на друг IC, приложението го задейства в didReceiveMessage на първия. Ако това е правилно, как мога да направя нещо във втората IC, когато пристигне съобщение? В WatchKit не мисля, че мога да използвам наблюдатели. Може ли някой да ми разясни това, моля?

Извършвайки още малко търсене в интернет, намерих това: 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 е бил зареден (не е показан) най-скоро. Както открихте, WKInterfaceControllers често се зареждат, преди да са изрично необходими – нещо, което 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