Как я могу продолжать получать сообщения/данные от Apple Watch после закрытия дополнительного контроллера просмотра

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

Я использую sendMessage и соответствующую ему функцию приемника для передачи количества ударов между устройствами. Каждый контроллер представления содержит функцию получения сообщения.

Рассматриваемый код выглядит следующим образом:

import UIKit // or WatchKit on Apple watch
import WatchConnectivity

class ViewController: UIViewController, WCSessionDelegate {

var session: WCSession!
let userData = NSUserDefaults.standardUserDefaults()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    ScrollHoles.contentSize = CGSize(width: 360,height: 1090)
    if (WCSession.isSupported()){
        self.session = WCSession.defaultSession()
        self.session.delegate = self
        self.session.activateSession()
        userData.synchronize()
    }
}

Функция отправки сообщения...

// Save Data From Strokes To standatdUserDefaults.
@IBAction func SaveButton(sender: AnyObject) {
    let hole1Score = Strokes1.text;
    userData.setObject(hole1Score, forKey: "hole1Strokes")
    userData.synchronize()
    session.sendMessage(["score1A": hole1Score!], replyHandler: nil, errorHandler: nil) // score1A becomes score1B on Apple watch
}

и функция получения сообщения...

// Recieve Data from Apple Watch And Save It To standardUserDefaults (e.g. # of strokes).
func session(session: WCSession, didReceiveMessage message: [String : AnyObject]) {
    let hole1Msg = message["score1B"] as? String // score1B becomes score1A on apple watch
    let hole2Msg = message["score2B"] as? String

    if (hole1Msg != nil){
        userData.setObject(hole1Msg, forKey: "hole1Strokes")
    }
    if (hole2Msg != nil){
        userData.setObject(hole2Msg, forKey: "hole2Strokes")
    }

Константы и оператор if продолжаются для всех 18 отверстий.

Я использую следующее, чтобы отклонить контроллеры вторичного представления.

@IBAction func backButton(sender: AnyObject) {
    self.dismissViewControllerAnimated(true, completion: {});
}

person Johnathan Rubinsky    schedule 14.04.2016    source источник
comment
Добро пожаловать в Stack Overflow! Лучший способ получить ответ, почему что-то работает не так, как вы ожидаете, — опубликовать минимально воспроизводимый пример. . В том виде, как этот вопрос стоит сейчас, нам придется задать вам вопросы, прежде чем мы сможем дать вам хороший ответ. См. раздел Как спросить, чтобы узнать больше о написании хорошего вопроса!   -  person    schedule 15.04.2016


Ответы (1)


Как объясняется в этом ответе, WCSession одновременно поддерживает только одного делегата.

Поскольку вы настраиваете сеанс в контроллерах представления, делегат сеанса изменяется при загрузке другого контроллера представления. Хотя вы можете отклонить вторичный контроллер, он по-прежнему является делегатом сеанса.

Вот почему ваш корневой контроллер представления больше не получает сообщения, так как он больше не является делегатом сеанса.

Рекомендуемый инженерами Apple подход:

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

Как правило, лучше настроить Watch Connectivity как можно раньше (при запуске, а не в конкретном контроллере представления).

Учебное пособие за пределами сайта:

У Робота Наташи есть отличное руководство, в котором рассматривается использование диспетчера сеансов Watch Connectivity и источник данных в мельчайших подробностях.

person Community    schedule 14.04.2016
comment
Хорошо, спасибо за помощь. Думаю, мне просто придется ненадолго отступить, так как мне трудно понять, как реализовать инструкции этого руководства для моей цели. Я все еще очень начинающий, и программирую только как хобби. Я делал только самые простые вещи в Visual Basic .Net и C#. В обоих случаях я мог просто выполнять код, когда форма получает фокус. Немного поиграв в Xcode, я обнаружил, что переопределение функции viewDidAppear и запуск WCSession там работает. Я буду использовать эту работу, пока не смогу сделать это правильно. - person Johnathan Rubinsky; 15.04.2016