読者です 読者をやめる 読者になる 読者になる

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

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

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

Apple Watch iOS watchOSプログラミング入門 iOS Swift WatchOS Watch Connectivity

はじめに

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