[iPhone] Watch Connectivity: sendMessage 即座にメッセージを送るには (Apple Watch)

watchOS2からはwatch側のアプリはwatch側で実行されるようになりiPhoneとAppleWatch間のデータ転送方法も変わりました。またWatchOS3で修正がいくつか入りました。

改めて双方向データ転送を試してみます
 

sendmessage1
sendmessage2

iPhoneのボタンタップでWatch側のLabelに「parent:OK 1」
タップ回数がOKの後に表示される

また、Watch側からボタンでiPhoneにメッセージを送り「watch:OK 1」と表示されます。
この例はあくまでiPhoneとApple Watchのそれぞれのアプリを起動した状態での動作になります。
 

watchOS 3.0
Swift 3.0
Xcode 8.0

 

sponsored link

WCSession

 
WCSessionには転送をOSに任せる方法と
即座に実行する方法があります

  1. updateApplicationContext
    • 辞書型の簡単な情報転送
    • 受け手側は同期、アップデートとして使用する
    • データは揮発性volatileで上書きされる
    • データ送信はバックグラウンドでなされる
    • 「reachable」でなくてもcallできる
  2. transferUserInfo
    • デクショナリー型の情報をバックグラウンドで転送
    • 受け取りプロセスが走っている必要がない
    • データはキューイングされる
    • complication には transferCurrentComplicationUserInfo: を使う
    • 送信はバックグラウンドでなされる
  3. transferFile:userInfo:
    • ファイルをバックグラウンドで転送する
    • 受け手がファイルを保存する場合は新しく保存する場所を設定する
    • ファイルがsession:didReceiveFile:内で転送されない場合メソッド終了で削除
  4. sendMessage(_:replyHandler:errorHandler:)
    sendMessageData(_:replyHandler:errorHandler:)

    • 転送は即座に実行される
    • コールバックがいらない場合はreplyHandlerにnilを設定
    • 受け手側は「reachable」である必要がある
    • iPhone側はこのメソッドでバックグラウンドでwake upする
    • watch側はインストール時とrunningの時のみ「reachable」
    • データは即座に転送され受け手側でキューイングされる

今回は、即座にメッセージを転送
データの転送ができる
sendMessage
sendMessageData
があり、このメッセージ転送を実装してみます
最初にinit()で WCSession をactivateする必要があります

iPhone 側

ViewController.swift

 
Apple Watch 側
InterfaceController.swift

 
上の方法は、iPhoneとwatchがforegroundの場合を想定していて現実的ではないかもしれません
 
iPhoneがサスペンドでwatch側からiPhoneからのデータを取り出すケースを考えると
iPhoneはバックグラウンド処理が必要になります
 
Reference:
– WCSession
 

watchOS 2.0 のケース

 
参考のためwatchOS 2.0のコードも残しておきます。
 

iPhone 側
ViewController.swift

Apple Watch 側
InterfaceController.swift

 

ページのトップへ戻る
 
sponsored link

シェアする

  • このエントリーをはてなブックマークに追加

フォローする