アプリケーション間のデータ共有について
PICK UP POST

アプリケーション間のデータ共有について

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のドキュメントで良い図を見つけられなかったのですが、以下の図で説明すると…

図:

image

【引用】:

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

  • このエントリーをはてなブックマークに追加
にっきー
にっきー niki

最近、仕事に復帰し、子育てと仕事の両立に奮闘しているママエンジニアです。趣味はダイビングで、海に潜って魚や珊瑚の写真を撮るのが好きです。