Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Apple Watch,watchOSプログラミング入門 #007】Apple WatchとiPhoneでデータ連携する。Watch Connectivity Frameworkを使うのだ

はじめに

watchOS2以前、Apple WatchとiPhoneの間でデータ連携する場合、
AppGroupの仕組みを使って、Apple WatchからiPhone
保存されているデータにアクセスしていた。

watchOS2からはAppGroupの仕組みは使えない。
設定してみたが本当に使えなかった。
watchOS2になって、AppGroupの仕組みが使えなくなったと知らず、ハマりました。

watchOS2からはデータ連携用のWatch Connectivityというframeworkを使って、 Apple WatchとiPhoneの間でデータ連携する。

データ連携の方法はいくつか方法があるようですが、
ここではbackground transferという方法を使います。

下記の手順を実行する前にこちらからサンプルプロジェクトを
ダウンロードしてください。

SampleWatchConnectivity_start.zip - Google ドライブ

1. iPhoneでWatch Connectivityのセットアップ

①WatchConnectivity Frameworkを追加

AppDelegate.swiftを開き、import文を追加します

import WatchConnectivity
②WCSessionDelegateを採用

class宣言の部分にWCSessionDelegateの採用を追加

class AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate {
}
③WatchConnecitivityのセッション有効化

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Boolメソッド内にWatchConnecitivityのセッションを有効にする処理を追加

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        // WatchConnecitivityのセッションを有効化
        if WCSession.isSupported(){
            let session = WCSession.defaultSession()
            session.delegate = self
            session.activateSession()
        }
        
        return true
    }

2. Apple WatchでWatch Connectivityのセットアップ

①WatchConnectivity Frameworkを追加

ExtensionDelegate.swiftを開き、、import文を追加します

import WatchConnectivity
②WCSessionDelegateを採用

class宣言の部分にWCSessionDelegateの採用を追加

class ExtensionDelegate: NSObject, WKExtensionDelegate,  WCSessionDelegate{
}
③WatchConnecitivityのセッション有効化

func applicationDidFinishLaunching()メソッド内にWatchConnecitivityのセッションを有効にする処理を追加

func applicationDidFinishLaunching() {
    // Perform any final initialization of your application.
    // WatchConnecitivityのセッションを有効化
    if WCSession.isSupported(){
        let session = WCSession.defaultSession()
        session.delegate = self
        session.activateSession()
    }
}

3. iPhoneからデータ送信

ViewController.swiftを開き、pressButtonメソッドにデータ送信の処理を追記します。

@IBAction func pressButton(sender: UIButton) {
    // ボタンを押すとApple Watchに画像URLのリストを送る
    if WCSession.isSupported(){
        let dictionary = ["images":images]
        do{
            try WCSession.defaultSession().updateApplicationContext(dictionary)
        }catch{
            print("\(error)")
        }
    }
}

4. Apple Watchでデータ受信

ExtensionDelegate.swiftを開き、データ受信のデリゲートメソッドを実装します。

func session(session: WCSession, didReceiveApplicationContext applicationContext: [String : AnyObject]) {
    // iPhoneから送られてきたデータを受信し、ユーザーデフォルトに保存
    guard let images = applicationContext["images"] as? [String] else{
        return
    }
    
    let userDefaults = NSUserDefaults.standardUserDefaults()
    userDefaults.setObject(images, forKey: "images")
    userDefaults.synchronize()
}

5. 受信したデータを表示

InterfaceController.swiftを開き、willActivateメソッド
データを取得、表示する処理を書きます。

override func willActivate() {
    // This method is called when watch view controller is about to be visible to user
    super.willActivate()
    
    // 画像を取得、表示
    let userDefaults = NSUserDefaults.standardUserDefaults()
    guard let images = userDefaults.objectForKey("images") as? [String] else{
        return
    }
    
    let image = images[Int(arc4random_uniform(UInt32(images.count)))]
    if let url = NSURL(string: image){
        NSURLSession.sharedSession().dataTaskWithURL(url){
            [unowned self]
            data, _, _ in
            self.webImage.setImageData(data)
        }.resume()
    }
}

6. ATSの無効化

ATSが有効だとhttp経由で画像を取得できないので無効にします。

Watch Extensionのターゲットのinfo.plistファイルを開き、 ATSを無効にします。

f:id:fjswkun:20151125221951p:plain

7. 実行

iPhoneアプリを起動

ボタンを押すとApple Watchにデータ送信されます。

f:id:fjswkun:20151125222002p:plain

Apple Watchアプリを起動

画像が表示されます。

f:id:fjswkun:20151125222044p:plain

おわりに

うまく実行できなかった方はこちらから完成版サンプルを
ダウンロードして確認してみてください。

SampleWatchConnectivity_final.zip - Google ドライブ

参考情報

サイト

swift-studying.com

swift-studying.com

swift-studying.com

swift.swift-studying.com

Swift

iOSアプリ開発未経験の人向け
iOSアプリ開発をはじめたとき最初に買った書籍

Swiftではじめる iPhoneアプリ開発の教科書 【Swift 2&Xcode 7対応】【特典PDF付き】 (教科書シリーズ)


②中級の日本語書籍はない。英語だけど読むとかなりのレベルアップが期待できます

iOS 8 Swift Programming Cookbook: Solutions & Examples for iOS Apps


③機能を作るだけじゃない。質のいいものを作りたい人は読まないといけない。

詳解 Swift