HOME > AppleWatch6
AppleWatchとiPhone連携をナターシャさんのデモを参考に調査
先日Swiftサラリーマンに関してTwitterでつぶやいてくださっていたスマートウォッチ開発者のまっちょさん に教えていただいたAppleWatchアプリ作成に関する海外のWatchKitのナターシャさんの記事(Architecting Your App for the Apple Watch)を教えていただきました、 動画やプレゼンもあり英語でしたがサンプルコードも付いていて分かりやすかったです!
AppleWatchとiPhone間でどうやってデータ交換するかの説明がとてもタメになりましたので、 この記事でも紹介させていただきます。
最初にデータ交換において以下3つの方法があります。それぞれ説明します
参考: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のWKAppBundleIdentifierとWKCompanionAppBundleIdentifierを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だけで記事のボリュームがでましたのでNSFileCoordinatorとKeychain Sharingは 別記事にしてアップします!このBundle Identifer調整方法が分かったので別サンプルも動くのではと思いつつ、、、、
↓こんな記事もありますよ!
![]() | デバッグ時とリリース時に処理を変更する#ifdef DEBUG のやり方DEBUG時だけ特定の動作をさせて、リリース時に排除したい、そんな時に利用する方法です。Swiftでは標準ではDEBUGとリリースの判断がつかないので、 コンパイル時に設定する必要があります |
![]() | SQLiteを使いたい。ラッパーを検証してみる。SQLiteを使いたい。Objective-Cの時はMagical RecordでCoreDataを利用して問題なく使えたのですが、 今回はSQLite+Swiftでトライしてみたいと思います。ざっと調査すると、SwiftでSQLiteを使うのは、FMDB, SwiftData, SQLite.swiftが あるみたいです。この三つのラッパーから好みのものを選んでみるのが目標です。 |
![]() | AppleWatchアプリの申請AppleWatchアプリの申請が4月1日から始まりましたので、少しトライしてみました。ハマった箇所を共有です。 アプリをArchiveしてValidateしてから2パターンの不具合、あとはアップロードには成功したのですが、Itunesに反映されなかった 現象を共有です |
Tweet
![]() |
|||
|