Swift転職なら=>【LevTech】
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

頭痛が減ったので共有です!

rebuild.fmを応援しています!

HOME > AppleWatch6

AppleWatchとiPhone連携をナターシャさんのデモを参考に調査

サンプル画像

先日Swiftサラリーマンに関してTwitterでつぶやいてくださっていたスマートウォッチ開発者のまっちょさん に教えていただいたAppleWatchアプリ作成に関する海外のWatchKitのナターシャさんの記事(Architecting Your App for the Apple Watch)を教えていただきました、 動画やプレゼンもあり英語でしたがサンプルコードも付いていて分かりやすかったです

AppleWatchとiPhone間でどうやってデータ交換するかの説明がとてもタメになりましたので、 この記事でも紹介させていただきます。

最初にデータ交換において以下3つの方法があります。それぞれ説明します

  • NSUserDefaultsを利用する(オーソドックスな共有)
  • NSFileCoordinatorを利用する(ファイルを共有)
  • Keychain Sharingを利用する(暗号化して共有)
  • 参考:Architecting Your App for the Apple Watch
    参考:Natasha The Robot

    NSUserDefaults

    よしナターシャさんのサンプルを動かすぞー!と思って実行しましたが、思うように動かない、、、、

    サンプル画像

    デモのサンプルなので動くはずなのに、と思いつつ調べてみますと

    サンプル画像

       

    赤文字でgroup.com.natashatherobot.userdefault、警告マークでAdd the 'App Groups' entitlement to your App IDと不吉な文字。 どうやらTarget -> Capability -> AppGroupの設定がナターシャさんのアプリの依存している様でした。

    というわけで、App GroupのIDを新たに自分で取得したプロジェクトで試してみると成功しました(参考サイト:[iOS 8] App Extension #3 – App Group で containing app とデータを共有する)。

    AppGroupの設定でハマったのですが、名称は正しくBundle Identifier と同じように逆ドメインに指定しないといけないようです。 つまりアプリのBundle Identifierがcom.swiftsalaryman.hogeAppだとすると、App GroupのIDは、group.com.swiftsalaryman.usedefaultの太字部分の ようにアプリとAppGroupで合わせておく必要があるようです。

    App ExtensionでTodayウェジット等とデータ連携する際と同じでNSUserDefaultのsuitNameに同じ名称を指定してアクセスします。

    サンプル画像

    サンプル画像

    こういった感じで赤文字にもならず警告マークも無い状態であればOKです。ちなみに上記サンプルのBundle Identifierはcom.okko.testAppleWatchです

    ここまでこの記事を書いてふと考え直しました、、、、もしかしてナターシャさんのBundle Identifierをcom.okkoに変えたら動くのでは? (※com.okkは私が利用しているBundle Identifierです)


    SharingWithUserDefaultsとSharingWithUserDefaults WatchKit ExtensionのGenaralに記載されているBundle Identiferを com.natashatherobotから私が利用しているcom.okkoに書き換えると、、、、、AppGroupsの赤文字と赤マークがなくなった!Bundle Identifier変えられるんでしたね、、、失念しておりました。

    でもこの状態でApple Watchを起動すると、、、SPErrorInvalidBundleNoGizmoBinaryMessageの怪しいエラー。これは Bundle Identifierを変えた場合に表示されるようでした

    この記事(Apple Watchkit simulator issue: SPErrorInvalidBundleNoGizmoBinaryMessage) を見て解決!どうやらSharingWithUserDefaults WatchKit ExtensionとSharingWithUserDefaults WatchKit Appにあるinfo.plistのWKAppBundleIdentifierWKCompanionAppBundleIdentifierを2箇所変更する必要があるようでした。(一箇所だけだと解決しないので注意)

    サンプル画像

    サンプル画像

    この上記のcom.natashatherobotを書き換えると、、、、動き出しました!

    サンプル画像

    NSUserdefaultでの保存部分だけ抜粋しました

    ▪︎↓ ソースコード(iPhone端末側)- ViewController.swift

    
    import UIKit
    
    class ViewController: UIViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            let defaults = NSUserDefaults(suiteName: "group.com.okko.demoAppExtensions")
            let key = "TESTKEY"
            defaults?.setObject("hogehoge", forKey: key)
            defaults?.synchronize()
        }
    }

    ▪↓︎ ソースコード(AppleWatch側)- InterfaceController.swift

    
    import WatchKit
    
    class InterfaceController: WKInterfaceController {
        
        override func awakeWithContext(context: AnyObject?) {
            super.awakeWithContext(context)
            let defaults = NSUserDefaults(suiteName:"group.com.okko.demoAppExtensions")
            defaults?.synchronize()
            println(defaults?.stringForKey("TESTKEY"))// hogehoge
        }
        
    }

    まとめ

    NSUserDefaultsだけで記事のボリュームがでましたのでNSFileCoordinatorKeychain Sharingは 別記事にしてアップします!このBundle Identifer調整方法が分かったので別サンプルも動くのではと思いつつ、、、、

    前の記事はこちらからです!

    次の記事はこちらからです!

    ↓こんな記事もありますよ!

    デバッグ時とリリース時に処理を変更する#ifdef DEBUG のやり方

    DEBUG時だけ特定の動作をさせて、リリース時に排除したい、そんな時に利用する方法です。Swiftでは標準ではDEBUGとリリースの判断がつかないので、 コンパイル時に設定する必要があります

    Rebuildfm(Poadcast)の技術話+オタ話が超絶に面白い、、、、、

    去年の暮れ頃から聞いているPodcastを紹介します。IT企業の友人から「RebuldFM」が面白いよ〜と、私が Swiftサラリーマンを始めたことでSwiftの話をしてたら「知ってる知ってる」との話になって、どこで聞いたの? 「Rebuldfm」ってPodcastがあるんだよ、と。

    willsetとdidsetでプロパティを監視。意味あるのか???

    クラスのプロパティにはWillsetとdidsetという監視用の関数があると聞いたのですが、用途は分かるにしても メリットとしてはどういうものなのかなと、うーん、と考えていました。調べていると海外のサイトでは同じように疑問にもつ質問があがっていました。 getとsetで同じことができるのでは?との私と同じスタンスです。解決されていましたので、順に説明していきます。
    このエントリーをはてなブックマークに追加
    右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!