[iPhone] Watch Connectivity: sendMessage iOSのバックグランド処理 (Apple Watch)

Watch ConnectivityのInteractiveな使い方として
SendMessageを使ってForegroundでテストしてみました
sendMessage 即座にメッセージを送るには

ここではより実用的にiPhoneがバックグランドで処理できるようにしてみたいと思います。
Apple Watchアプリを起動させる時はiPhoneはポケットかバックの中でiPhoneアプリはbackgroundで受け取るという状況です。

sendmessage2_2
watch_message_back

アプリを起動してボタンをタップ、
watchからiPhoneの時間を取得してwatchのラベルに表示

watchOS 3.0
Swift 3.0
Xcode 8.0

 

sponsored link

Watch Connectivity

 
もう一度、SendMessageを確認してみます

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

処理の流れはこのようにします

watch(running) -> iPhone(wake up, background) -> watch

iPhoneはバックグラウンド、watchから起動時にiPhoneにメッセージを送り
iPhoneからデータを受け取ります

ViewController.swiftには今回何も記述しません

iPhone: AppDelegate.swift

LabelとButtonを貼って紐付けします

watch: InterfaceController.swift

 

補足:watchOS2

 
watchOS2ではこのようにしていました。参考まで

iPhone: AppDelegate.swift

Label を貼っておき結びます

watch: InterfaceController.swift

これはシュミレータでは問題なくできますが
実機では問題が残ります

watch側である程度時間が経たないとアップデートしないので
表示時刻が明らかに異なる事態が生じます
それでいい場合もありますが
アプリによっては困ります
まあ、バッテリー消費などからくる仕様なのでしょう

workaroundとしてtimerを仕込んで
このケースでは毎回アップデートできました
改善案:(今後のアップデートで変わるかもしれません)

willActivate()で初期化するようなことはすることは
推奨されていませんので、ちょっとどうかなとは思います
まんまコピーに置いては自己責任です

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

シェアする

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

フォローする