この記事はPONOS Advent Calendar 2020の18日目の記事です。
昨日は@nisei275さんの「RustとWebSocketでユーザの位置情報を双方通信する仕組みを実装してみる」でした。
#はじめに
本記事では、iCloud・iTunesのバックアップにおいてUnityのどのディレクトリが対象・非対象になるのか、
Unityでのデータを保存する上で注意点について紹介していきます。
#iCloud・iTunesのバックアップについて
https://support.apple.com/ja-jp/HT204136
iCloudバックアップはiCloudのオンラインストレージ上からバックアップ、
iTunesバックアップはPC上からバックアップ。
以前は、バックアップできる項目に差異があったようですが、現時点ではほとんど変わりません。
#Unityでのバックアップ対象・非対象ディレクトリ
iCloud・iTunesのバックアップでは、アプリ内ディレクトリの一部がバックアップ対象となります。
以下、Unityで主に使用されるディレクトリを該当するiOSアプリのディレクトリを列挙したものとなります。
Unity | iOSアプリ | バックアップ対象・非対象 |
---|---|---|
Application.persitantDataPath 永続性のあるデータを保存するためのパス |
Documents/ | 対象 |
Application.temporaryCachePath 一時的なデータを保存するためのパス |
Library/Caches/ | 非対象 |
PlayerPrefs 簡易的にデータの保存・読み込み機能 |
Library/Preferences/ (NSUserDefaults) |
対象 |
#データを保存する上での注意点
バックアップ対象のディレクトリに比較的容量が大きいファイルを含めない
2.23 Apps must follow the iOS Data Storage Guidelines or they will be rejected
AssetBundleや比較的容量が大きいファイルをバックアップ対象に含めてしまうと、
リジェクトされる可能性があります。
Apple側としてはバックアップ必要なものはバックアップディレクトリに含めて、
バックアップ不要なものはバックアップされないディレクトリもしくは、"do not back up"として、
バックアップされないように明示的に指定してほしいといった意図があるようです。
https://developer.apple.com/icloud/documentation/data-storage/index.html
そのためUnityではバックアップ対象から外す設定が提供されております。
#if UNITY_IOS
UnityEngine.iOS.Device.SetNoBackupFlag(Application.persitantDataPath);
#endif
端末一意のデータ、ユーザー認証情報をバックアップ対象に含めない
例えばですが、以下のケースが考えれます。
PlayerPrefsに端末を識別するIDやユーザー作成時に作られる情報を保存していた場合。
(PlayerPrefsはiCloud・iTunesのバックアップ対象となっています)
- Aの端末でバックアップを作成
- Bの端末でAの端末データのバックアップデータを用いて機種変更
- Bの端末にはAの端末データのPlayerPrefsが含められている状態
つまり、Aの端末(ユーザーA)= Bの端末(ユーザーA)といったユーザーの複製が行えてしまいます。
これにより1つのユーザーデータに対して複数端末からのアクセスができる状況が発生します。
アプリによっては、これを良しとするものもあるかと思います。
しかし意図しない挙動が発生したり、ユーザーデータの破損にも繋がる可能性もあるため、
予め想定した設計をする必要があります。
例えば、PlayerPrefsに保存している一部の情報をバックアップ対象とされないディレクトリに逃すことや、
サーバーを介してログインを行っているアプリであれば、
ログイン時にトークンを発行してそのトークンと一致している端末のみ
プレイ可能にするといった方法も考えられます。
#おわりに
- 各種プラットフォームでアプリを提供する場合は、プラットフォームごとのディレクトリの用途を予め確認する必要があります
- 保存する先のディレクトリがバックアップ対象・非対象かを確認し、目的に応じて使い分けることが重要
明日は@MilayYadokariさんの記事です。