2016-11-25 8 views
1

Я тестировал на симуляторе и устройстве, как-то Watch Connectivity перестает работать после того, как он используется один раз.Watch Connectivity работает в первый раз, но не после этого

Я передаю данные от Часы -> iPhone, и он работает только один раз, а затем останавливается после этого.

Любые идеи?

iPhone ViewController:

var session: WCSession? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    if WCSession.isSupported() { 
     session = WCSession.default() 
     session?.delegate = self 
     session?.activate() 
    } 
} 

func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { 
    // Received Application Context from Watch 
    let type = applicationContext["watchType"] 
    print("Type iPhone: \(type)") 

    DispatchQueue.main.async { 
     self.type.text = "Type: \(type)" 
    } 

} 

Часы InterfaceController:

let session = WCSession.default() 

override func awake(withContext context: Any?) { 
    super.awake(withContext: context) 

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

@IBAction func startPressed() { 
    saveEverything() 
} 

func saveEverything() { 
    let watchContextType = ["watchType" : "Boxing/Running"] 

    do { 
     print("Type Watch: \(watchContextType)") 
     try session.updateApplicationContext(watchContextType) 
    } catch { 
     print("Didn't work") 
    } 
} 

ответ

1

При использовании updateApplicationContext(), вам необходимо изменить параметры для каждого вызова, в противном случае тзд не будет доставлено. Я верю в это, чтобы сохранить батарею.

В любом случае попробуйте отправить сообщение с помощью sendMessage() или sendMessageData(), после чего сообщения будут доставлены каждый раз, даже если они имеют одинаковое содержимое. И они более высокий приоритет, чем updateApplicationContext так это беспроигрышный :)

Вот документация: https://developer.apple.com/library/content/documentation/General/Conceptual/WatchKitProgrammingGuide/SharingData.html#//apple_ref/doc/uid/TP40014969-CH29-SW1

2

Если вы хотите разрядку аккумулятора вашего яблочных часов приложения быстро затем над техникой @Jens является Ну и хорошо.


Вместо перехода от updateApplicationContext() к SendMessage() лучше сделать небольшие изменения в вашем проекте, чтобы получить желаемый результат.


Я объясню сценарий вопрос, а затем раствор вместе с Demo приложения: -

enter image description here

@IBAction func sliderChange(_ value: Float) 

{ 
    let str:String? 
    switch value { 
    case 0...7 : 
      str = "Running" 
    case 8...14 : 
      str = "Sleeping" 
    default: 
     str = "normal" 
    } 
    updateContext(value: str!) 
} 

func updateContext(value:String) { 
    let dictionary = [ "watchType" : value ] 
    do { 
     print("update application context is called do statemet") 
     try session?.updateApplicationContext(dictionary) 
    } 
    catch{ 
     print("this is the catch statement") 
    } 
} 

С обновлением слайдера значений в Watch, значения iPhone обновляется .Как вы можете увидеть, что есть повторение значений для iPhone, т.е.

При слайдере от 0 до 7 значений остаются «Запуск» & & «Спящий» для От 8 до 14.

Приложение работает нормально, если меняет значения слайда и желаемый результат отражается на iPhone в обычном сценарии.

Scenrio, где он не: - я) Изменение значения ползунка от 0 до 3, затем "Запуск" находит свое отражение в iPhone. Прекрасно. ii) Теперь закройте приложение iPhone, а затем измените значения ползунка от 3 до 5, мы не увидим настоящую проблему, когда iPhone будет открыт. iii) Значения не активируются для iPhone.

enter image description here

Благодаря внутреннему механизму кэширования updateApplicationContext() ограничения для запуска дублирующих значений iPhone.

Магазин последнее обновление состояния в didReceiveApplicationContext() и состояние отображения в соответствии с сохраненным значением.

override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     checkStatus() 
     updateSavedState() 
    } 
    func checkStatus() { 
     print("check status") 
     if WCSession.isSupported() { 
      session = WCSession.default() 
      session?.delegate = self 
      session?.activate() 
     } 
    } 

    func session(_ session: WCSession, didReceiveApplicationContext applicationContext: [String : Any]) { 
     let type = applicationContext["watchType"]! 
     DispatchQueue.main.async { 
      self.updateLabel.text = " Type: \(type)" 
      UserDefaults.standard.set(type, forKey: "savedState") //setObject 
     } 
    } 

    func updateSavedState() { 
     self.updateLabel.text = UserDefaults.standard.string(forKey: "savedState") 
    } 

Теперь все работает отлично. Demo App.

+0

Но, в вашем приложении, вы просто отправляете изменения в строке в приложение для iPhone. Обратите внимание, что когда состояние «Запуск», скажем, ползунок равен 1, и при нажатии «+» приложение iPhone не получает никаких изменений? Он получает изменения только при переходе из режима Running> Sleeping или наоборот. И это не то, о чем попросил ОП. Он уже реализовал это :) –

+0

Да, вы правы, что OP реализуют для переноса данных с часов на iPhone, но проблема, с которой он столкнулся, состояла в том, чтобы сохранить данные на стороне iPhone, когда снова и снова запускаются одни и те же данные:) – Shrawan