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調整方法が分かったので別サンプルも動くのではと思いつつ、、、、

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

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

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

    大阪都構想の橋下さんの鼻に誠意をもって顔認識処理で画鋲を刺す

    先日大阪都構想でニュースがざわついておりましたが、 そこで自分が思っていたこと、なぜ鼻ピンしたのかを顔認識サンプルと誠意を込めて書き記してまいります。(※選挙ポスターに画鋲を刺す事や、そもそも「他人様」の画像を変更することがタブーな事を理解しつつの投稿です。問題がないかの問い合わせメールを送る予定です。画像はWikipediaからの引用です)

    CLLocationManagerで現在位置を取得

    あっさりしたシンプルなサンプルがなかったので省略型です。

    UITextViewやらで縦書きができないか検証

    「文字の縦書き」をやってみたいのですが、どうもUITextView等には設定が無いとのことです。 調べていると、本当にない?のかな。少し調査して作れそうなもんであればつくってみれたら、、、との気持ちで進めてみます。
    このエントリーをはてなブックマークに追加
    右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!