Где лучше всего позвонить updateApplicationContext с помощью Watch Connectivity?

Несколько хороших постов в блоге, подробно описывающих возможности подключения к часам ( http://www.kristinathai.com/watchos-2-tutorial-using-application-context-to-transfer-data-watch-connectivity-2/ и http://natashatherobot.com/watchconnectivity-application-context/) использует простые примеры приложений, которые отправляют данные на часы, когда вы нажимаете на пользовательский интерфейс на iPhone.

Мое приложение просто перечисляет данные из моего приложения для iPhone, поэтому мне не нужно отправлять данные сразу, я просто хотел отправить их, когда приложение загружается или входит в фоновый режим... для этого я сделал updateApplicationContext в didFinishLaunching а также didEnterBackground... однако мой делегат источника данных в моих контроллерах интерфейса часов очень хорошо срабатывает при срабатывании... в частности, взгляд загружается только на симуляторе, а не на устройстве. Есть ли лучшее время и место для продвижения информации?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    WatchSessionManager.sharedManager.startSession()      
    do {
         try WatchSessionManager.sharedManager.updateApplicationContext(["peopleDict" : peopleDict])                                        
    } catch {
        print(error)
    }
     return true
}

func applicationDidEnterBackground(application: UIApplication) {     
     do {
         try WatchSessionManager.sharedManager.updateApplicationContext(["peopleDict" : peopleDict])                                      
     } catch {
         print(error)
     }
}

ниже мой WatchSessionManager Я звонил activiateSession в моем extensionDelegate "s appliciationDidFinishLaunching

import WatchConnectivity

protocol DataSourceChangedDelegate {
    func dataSourceDidUpdate(dataSource: DataSource)
}


class WatchSessionManager: NSObject, WCSessionDelegate {

    static let sharedManager = WatchSessionManager()
    private override init() {
        super.init()
    }

    private var dataSourceChangedDelegates = [DataSourceChangedDelegate]()

    private let session: WCSession = WCSession.defaultSession()

    func startSession() {
        session.delegate = self
        session.activateSession()
    }

    func addDataSourceChangedDelegate<T where T: DataSourceChangedDelegate, T: Equatable>(delegate: T) {
        dataSourceChangedDelegates.append(delegate)
    }

    func removeDataSourceChangedDelegate<T where T: DataSourceChangedDelegate, T: Equatable>(delegate: T) {
        for (index, indexDelegate) in dataSourceChangedDelegates.enumerate() {
            if let indexDelegate = indexDelegate as? T where indexDelegate == delegate {
                dataSourceChangedDelegates.removeAtIndex(index)
                break
            }
        }
    }
}

// MARK: Application Context
// use when your app needs only the latest information
// if the data was not sent, it will be replaced
extension WatchSessionManager {

    // Receiver
    func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {

        dispatch_async(dispatch_get_main_queue()) { [weak self] in
            self?.dataSourceChangedDelegates.forEach { $0.dataSourceDidUpdate(DataSource(data: applicationContext))}
        }

    }
}

1 ответ

Решение

Как updateApplicationContext хранит только самый новый контекст приложения, вы можете обновлять его в любое время. Часы получат только самые новые данные. Там нет очереди со старым контекстом.

На стороне наблюдения самое безопасное место для активации сеанса и установки WCSessionDelegate находится в ExtensionDelegateinit метод:

class ExtensionDelegate: NSObject, WKExtensionDelegate {

    override init() {
        super.init()
        WatchSessionManager.sharedManager.startSession()
    }
    ...
}

Ваш Glance не обновляется, потому что когда Glance отображается, applicationDidFinishLaunching не вызывается (потому что приложение watch не запускается при запуске только Glance)

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