Edited at

watchOS 2 の Watch Connectivity を使ってみた

More than 3 years have passed since last update.

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

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


Watch Connectivityとは

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 でも公開しております。