アプリケーション間のデータ共有について
iOSでアプリケーション間でデータ共有する方法について調べてみました。
共有方法には以下のいくつかの方法があります。
1.AppGroupでUserDefaultの共有(iOS8以降)
2.AppGroupによるKeychain共有(iOS8以降)
3.キーチェーンアクセスグループによるKeychain共有
今回は1を調査、検証してみました。(2と3はまた別の機会に…)
1.UserDefault共有のための条件
AppGroupを利用してUserDefaultのデータを共有するには、同じDeveloperが開発したアプリである必要があります。異なった開発元からリリースされているアプリの間での情報共有はできなくなっています。
2.AppGroupで共有される領域について
AppGroup共有されるデータの格納領域は、各アプリのサンドボックスとは別になっており、shared containerと呼ばれる独立したストレージ領域が割り当てられ、格納されます。
Appleのドキュメントで良い図を見つけられなかったのですが、以下の図で説明すると…
図:
【引用】:
https://developer.apple.com/library/archive/documentation/General/Conceptual/ExtensibilityPG/ExtensionScenarios.html
上記の図を見るとわかるのですが、アプリのプロセス(App process)と、アプリを拡張した機能のプロセス(Extention process)がデータ共有のための独立したストレージ(Optional shared container)を参照しているのがわかります。
※共有データの参照は、グレーの点線部分
2.準備と実装
では早速、AppGroupでUserDefaultのデータを共有する準備と実装に入ります。
今回は、検証用に同じAppGroupに所属するアプリAとBを作成します。
1)準備
大まかな準備は以下の通りです。
1.iOS Dev CenterでAppGroupを作成します
2.アプリAとBのApp IDを追加し、作成したAppGroupを選択します
3.XcodeからアプリAとBのAppGroupの設定をONにします
(ONにすると紐づくAppGroupが表示され、「プロジェクト名.entitlements」のファイルが自動生成されます。)
2)実装
以下の通り、アプリAとアプリBにUserDefaulsへのデータ保存と読み込みを実装します。
UserDefaultsへの保存
private let kSuiteName = ”group.lanches.AppGroupTestApp” private let kKey = ”data_key” // 途中省略 // private func saveDataToUserDefauls() { guard let userDefaults = UserDefaults(suiteName: kSuiteName), let input = inputTextField.text, !input.isEmpty else { return } userDefaults.set(input, forKey: kKey) userDefaults.synchronize() }
UserDefaultsへの読み込み
private func showDataFromUserDefauls() { if let userDefaults = UserDefaults(suiteName: kSuiteName), let data = userDefaults.string(forKey: kKey) { label.text = data } else { label.text = ”保存されているデータはありません” } }
3.アプリケーションの検証結果
実装したアプリで、同じAppGroupに所属するアプリAとアプリBがどのような動きをするか検証してみました。
【検証1】両アプリでUserDefaulsへの保存と読み込み
①Aをインストール
②Aでデータ「data123」を保存
③Bをインストール
④Bでデータを読み込む→「data123」が返却される
⑤Bでデータを「data123」から「data456」に上書き
⑥Bでデータを読み込む→「data456」が返却される
⑦Aでデータを読み込む→「data456」が返ってくる
結果:
AとB、どちらでデータを変更しても変更後のデータが読み込めている。
【検証2】アプリのアンインストールによる挙動
①Aをインストール
②Aでデータ「data123」を保存
③Bをインストール
④Bでデータを読み込む→「data123」が返却される
⑤Aをアンインストール
⑥Bでデータを読み込む→「data123」が返却される
⑦Bをアンインストール(※ここで同じAppGroupに所属しているアプリが全て削除されている)
⑧Aを再インストール
⑨Aでデータを読み込む→ 保存されたデータは消えている
結果:
データを書き込んだアプリがアンインストールされても、同じAppGroupに所属しているアプリが端末に残っていれば、書き込んだデータを読み込める。
ただし、UserDefaultsの性質上、同じAppGroupに所属しているアプリが全て削除された時点で、データは消える。
おわりに
今回はAppGroupを利用したUserDefaultのデータ共有を紹介しましたが、AppGroupではファイル共有もできます。
今後もiOSの技術について調査、検証した内容は積極的に発信していきたいと思います。
TAG
最近、仕事に復帰し、子育てと仕事の両立に奮闘しているママエンジニアです。趣味はダイビングで、海に潜って魚や珊瑚の写真を撮るのが好きです。
TAG
- Android
- AWS
- Bitrise
- CodePipeline
- Firebase
- HTML
- iOS
- IoT
- JavaScript
- KPI
- Linux
- Mac
- Memcached
- MGRe
- MGReのゆるガチエンジニアブログ
- MySQL
- PHP
- PICK UP
- PR
- Python
- Ruby
- Ruby on Rails
- SEO
- Swift
- TIPS
- UI/UX
- VirtualBox
- Wantedly
- Windows
- アクセス解析
- イベントレポート
- エンジニアブログ
- ガジェット
- カスタマーサクセス
- サーバ技術
- サービス
- セキュリティ
- セミナー・展示会
- テクノロジー
- デザイン
- プレスリリース
- マーケティング施策
- マネジメント
- ラボ
- リーンスタートアップ
- 企画
- 会社紹介
- 会社紹介資料
- 勉強会
- 実績紹介
- 拡張性
- 採用
- 日常
- 書籍紹介
- 歓迎会
- 社内イベント
- 社員インタビュー
- 社長ブログ
- 視察
- 開発環境