↑クリックして拡大
↑クリックして拡大
↑クリックして拡大
↑クリックして拡大

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

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

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

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

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


    2021-05-14 14:21:41

    WatchOSのwatchconnectivityのFiletransferの落とし穴。と、避け方。

    AppleWatch 実機だと成功するんだけど、シュミレーターだと失敗するという、、、 昔作成してた時は成功してたのになーと思って調べると、どうやら昔は成功してたみたい。watchOS6以降は...

    2021-05-06 14:04:37

    LINEのアニメーションスタンプ制作の落とし穴、、、失敗談

    ゴールデンウィークにLINEスタンプを作成してみました。 作り切って申請も通したんですが、意図したアニメーションと違う、、、、 LINEクリエーターの画面だと、アニメーションのプレビュー...

    2021-05-01 18:05:35

    久しぶりのAdmobをobjective-cに実装。コンパイルエラーだらけ。バーミッション不具合でエミュレータにインスコできない。

    忘れないようにメモ エミュレータにアプリをインストールする際にパーミッション系のエラーがでた時、また、iphone実機にインストールする際にも権限系のエラーが出る場合。 ターゲット→ex...
    このエントリーをはてなブックマークに追加
    右側のFacebookのLikeをクリック頂けると記事更新の際に通知されますので宜しければご利用下さい!