iPhone シミュレーター上のアプリにデータをセットする #iOS #iphone #Xcode

技術話

XcodeにはiPhoneのシミュレーターが用意されていて、いろいろな機種で確認、デバッグできるようになっていますが、いくつか制約があってできないこともあります。

例えば、カメラはシミュレーターが対応してないので、撮影した後の画像ファイルの表示や処理もシミュレーター単体では動作確認できません。撮影自体は諦めるとしても、写真表示など撮影後の動作はなんとかシミュレータでも確認できたら便利です。

それ以外にも、いろいろな機種で動作を比較するときに全部同じ状態にするのは面倒ですし、いつも同じ状態から始められるようにするのも大変です。

しかし、シミュレーターが使う内部データは、特定のディレクトリに置かれているので、そのディレクトリを操作すれば、簡単にシミュレー内部のデータを変更したり、保存したりすることができます。

なお、使用しているXcodeは9.2です。Xcodeのバージョンが違うと、以下の説明のディレクトリが変わる可能性があります。

実機上のアプリのデータをシミュレーターにコピーする

それでは、一つの例として、実機のデータをシミュレーターにコピーして、実機とシミュレーターを

同じ状態にしてみます。

実機上のアプリのデータを取り出す

まず、実機のデータを取り出します。実機の内部フォルダーを表示したり、ダウンロードするツールもいくつかありますが、今回はXcodeだけで行います。

まず、実機をMacに接続して、Xcodeで”Window”→”Devices and Simulators”を開きます。

次に、接続しているデバイスを選び、データをダウンロードしたいアプリを選んで、一番下メニューから”Download Container…”を選びます。

 

これで、コンテナファイル(*.xcappdata)がダウンロードされます。ダウンロードされたファイルを右クリックし、”Show Package Contents”を選ぶと中身を見ることができます。

 

この中にアプリのデータがアーカイブされています。

シミュレーターのディレクトリを開く

まず、最初にシミュレーターにもアプリをインストールして、一度は起動しておきます。

 

シミュレーターのデータは、”~/Library/Developer/CoreSimulator/Devices/”にあります。

ディレクトリ名はシミュレーターのIDで表されていますので、以下の方法で使っているシミュレーターのIDを調べます。

使いたいシミュレーターのIDは、先ほどと同じくXcodeの”Window”→”Devices and Simulators”を開き、Simulatorsのタブを開いて確認できます。

使いたいシミュレーターのディレクトリを開くと以下のようになっています。

シミュレーター上のアプリケーションのデータのディレクトリを開く

アプリケーションのディレクトリは、”data”→”Containers”→”Data”→”Application”です。ここを開くと以下のようにアプリケーションのID(らしきもの)が並んでいます。

残念なことに、アプリケーション名とこのID(らしきもの)との対応はどこを見れば良いかは分かりません。ただ、一度でもアプリケーションを起動すると、”(アプリケーションID)/Library/Caches/Snapshots/”の下にBundle Identifierでキャッシュファイルが作られるので、それを手がかりに探します。

例えば、com.firstfournotes.sampleというBundle Identifierのアプリを探すのであれば、ターミナルを開いて以下のようにします。。

% cd ~/Library/Developer/CoreSimulator/Devices/<シミュレータID>/data/Containers/Data/Application
% find . -name com.firstfournotes.sample -print
./97FF6F14-ED72-4769-AFCF-409662152503/Library/Caches/Snapshots/com.firstfournotes.sample

これで目的のアプリのIDが分かりました。このディレクトリを開くと以下のようになっています。

Documentsの下にアプリが使うファイル、Library/Preferencesの下にUserDefaultsのファイルを置くと、シミュレーター上のアプリでデータが使えるようになります。

実機のデータをシミュレーターのアプリにコピーする

最初にダウンロードしたコンテナファイルの中の”Documents”の中のファイルと”Library/Preferences”の中の<bundle identifier>.plistをシミュレーターのアプリの同じディレクトリにコピーします。上が実機上のアプリのコンテナファイルで、下がシミュレーター上のアプリのディレクトリです。

この状態で実行すると以下のようになります。左がiPhone6sの実機、左がiPhoneSEのシミュレーターの画面です。

これでカメラの使えないシミュレーターでも、写真を取った後の検証ができます。

まとめ

シミュレーターであれば、簡単にアプリのデータをコピーすることができますので、同じ方法で違うシミュレーターのアプリにコピーすれば、どのシミュレーターでも同じデータでアプリを動かすことができます。また、アプリのデータを一旦バックアップしておけば、いつでも同じ状態に戻すこともできます。