Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

watchOS 2 の Watch Connectivity を使ってみた

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

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)である必要がある



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

最初に 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,

送信待ちのファイルは 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) {


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



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




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

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
Sign upLogin
Help us understand the problem. What are the problem?