2016-11-25 7 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:あなたはupdateApplicationContext()を使用する場合

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

、あなたはそれ以外の場合はMSGは配信されません、各呼び出しのパラメータを変更する必要があります。私はこれを信じて、電池を節約することです。

とにかく、sendMessage()またはsendMessageData()を使用してメッセージを送信しようとすると、同じ内容のメッセージが送信されるたびにメッセージが配信されます。そして、彼らはupdateApplicationContextよりも優先されるので、それはウィンウィンのだ:)

をここにドキュメントです:https://developer.apple.com/library/content/documentation/General/Conceptual/WatchKitProgrammingGuide/SharingData.html#//apple_ref/doc/uid/TP40014969-CH29-SW1

2

あなたがすばやくリンゴの時計アプリのドレインバッテリーにしたい場合は、@Jensの技術の上にされますよく、良い。代わりに、より良い目的の結果を得るためにあなたのプロジェクトに小さな変更を加える()のsendMessage()updateApplicationContextからシフトの



私は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値が更新されます.ASあなたはiPhoneのための値の繰り返しがあることを見ることができます

sliderValueが0〜7の値の場合、「実行中」のままです。& &「スリープ中」 8〜14です。

スライドの値が変わってもアプリケーションが正常に動作し、通常のシナリオではiPhoneに希望の結果が反映されます。それは失敗

Scenrio: - ⅰ) を0から3は、その後、 "実行" をスライダーの値を変更するにはiPhoneに反映されています。 Thantは大丈夫です。 ii)iPhoneアプリケーションを終了して、スライダの値を3から5に変更します。いいえ、iPhoneが開いているときに実際の問題を確認できます。 iii)値はiPhoneにトリガーされません。これによりupdateApplicationContext(の内部キャッシング機構に

enter image description here

)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

関連する問題