2016-11-25 53 views
1

我已經在模擬器和設備上測試過,不知何故手錶連接在使用一次後停止工作手錶連接功能的第一次,但沒有之後

我從傳遞數據手錶 - > 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") 
    } 
} 

隨着在觀看滑塊值更新,iPhone價值觀得到更新。如你可以看到有iPhone的重複值,即

當sliderValue的值爲0到7時,值保持「Running」& &「Sleeping」for 8 to 14。

如果我在不同的幻燈片值和所需的結果反映在正常情況下的iPhone中,應用程序工作正常。

Scenrio其中失敗: - i)所述滑塊值的變化從0到3,然後 「運行」 反映在iPhone。 Thant很好。 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應用程序不會收到任何更改?它僅在從「運行」>「睡眠」中進行更改,反之亦然。那不是OP要求的。他已經實現了這一點:) –

+0

是的,你有正確的OP有實現將數據從手錶傳輸到iPhone,但他面臨的問題是當數據被一次又一次觸發時,將數據保存在iPhone端: ) – Shrawan

相關問題