Help us understand the problem. What is going on with this article?

watchOS 2 の Watch Connectivity を使ってみた

More than 5 years have passed since last update.

※本記事は、 一般に公開されている情報を元に作成しています。

watchOS 2から Watch Connectivity が使えるようになりましたね。

Watch Connectivityとは

image

Watch Connectivity Framework Referenceより引用)

The Watch Connectivity framework (WatchConnectivity.framework) provides a two-way communications conduit between an iOS app and a WatchKit app on a paired Apple Watch. Apps use this framework to pass files and data back and forth. Live communication is possible when both apps are active; otherwise, you send data in the background so that it is available when the other app launches.

つまり、iPhone ↔ Apple Watch 間で、双方向にデータを送受信することが可能になります。

Watch Connectivityには、大きく分けて Background transfersInteractive messaging の二種類が存在します。

Background transfersの特徴

  • すぐにデータが転送されるわけではない
  • 転送のタイミングはOSがよしなに決めてくれる
  • データは転送する前にキューイングされる

Interactive messagingの特徴

  • データは即座に転送される
  • 双方向のデータ送受信が可能
  • Watch App、iOS Appが通信可能状態(reachable)である必要がある

Session

データを受け取る側は準備が必要です。

if (WCSession.isSupported()) {
     let session = WCSession.defaultSession()
     session.delegate = self 
     session.activateSession() 
}

最初に isSupported メソッドで、デバイスがWatch Connectivityに対応してるかを確認します。その後、WCSession オブジェクトを作ってデリゲートをセットし、セッションを開始します。

Background transfers

Background transfersには次の3つの転送方法が存在します。

1. Application Context

  • 転送するデータはキューイングされ、待ち状態になる
  • 新しいデータがキューに追加されると古いデータは上書きされる
  • 結果的に最新のデータのみが転送されることになる
  • 全てのデータを完全に送る必要がないときに便利
// 送信側
do {
    let applicationDict = ["hoge" : "huga"]
    try WCSession.defaultSession().updateApplicationContext(applicationDict)
} catch {
    // エラー処理
}
// 受信側
func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
    // 処理
}

2. User Info Transfer

  • Application Contextとは違い、データは上書きされない
  • すべてのデータを転送する必要がある時に便利
// 送信側
let transfer = WCSession.defaultSession().transferUserInfo(applicationDict)
// 受信側
func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject])
{
    // 処理
}

3. File Transfer

  • ファイルの転送が可能
// 送信側
let url = // ファイルのURL
let data = // ファイル情報
let fileTransfer = WCSession.defaultSession().transferFile(url,
metadata:data)

送信待ちのファイルは outstandingFileTransfers プロパティで確認できる。

// 受信側
func session(session: WCSession, didReceiveFile file: WCSessionFile)
{
    // 処理
}

Interactive messaging

  • リアルタイムのデータ送受信が可能
  • iPhoneとApple Watchがペアリングされている必要がある
  • iOS App/Watch Appがフォアグラウンドである必要がある

2015.8.4追記:「Watch Appはフォアグラウンドである必要があるが、iOS Appは起動/未起動どちらでもOK」という情報を @HIkaruSato さんより頂きました!ありがとうございます。(追記ここまで)

最初に、相手側のデバイスと通信可能であることを確認します。

if (WCSession.defaultSession().reachable) {

reachableであれば、通信を開始します。

// 送信側
WCSession.defaultSession().sendMessage(applicationDict,
       replyHandler: { ([String : AnyObject]) -> Void in
          // リプライ受け取り後の処理
       })
        errorHandler: { (NSError) -> Void in
          // エラー処理
});
// 受信側
func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)
{
    // 処理
}

サンプルコード

Objective-Cですが、簡単なサンプルコードを書きました。

https://github.com/koogawa/WatchConnectivitySample

どなたかSwift版を作ってくださいm(_ _)m

2015.7.6追記:InteractiveMessagingだけですが、サンプル作りました
https://github.com/koogawa/InteractiveMessagingSample

リンク

--

本記事は http://blog.koogawa.com/entry/2015/07/05/023459 でも公開しております。

koogawa
ドラムも叩けるプログラマです。iPhoneアプリ、Androidアプリ、mixiアプリを仕事/趣味で作ってます。主な作品 → http://bit.ly/koogawa
http://d.hatena.ne.jp/koogawa/
alu-inc
アルは、マンガファンがもっとマンガを楽しめるサービスを作るために立ち上げられた、テクノロジー企業です。
https://alu.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away