アプリがiOS8で動作しなくてリジェクト【続き】
Apple にて審査中で、iOS8で動作しないためにリジェクトされたAdobe AIRで開発したiPhone アプリ。
アプリがiOS8で動作しなくてリジェクト - GADGET FACTORY 雑記帳
の続編です。
調査したところ、やはり、SQLがらみでした。
というか、データの保存先の設定に問題がありました。
これまで、SQLの保存先を指定する際に、
iOS7までは、以下のような設定で動作していました。
var fileDir:File = new File(File.applicationDirectory.nativePath+"/\.\./Documents");
iOS8では、上記では動作せず、以下のように書き換えることで、無事に動作しました。
var fileDir:File = new File(File.documentsDirectory.nativePath);
この書き方なら、iOS6/7/8での動作を確認できています。
なぜこの書き方をしていたのか
このアプリは、かなり以前に作成したアプリだったこともあり、AIR が iOS4.3以降に対応していたぐらいの時期に制作したものでした。
その当時は、後者の書き方をしても、動作しなかったため、前者のように、
applicationDirectory のパスを調べ、その1つ上の階層+Documentsという書き方をしていたと記憶しています。
iOS7 までは、前者の書き方で問題なく動作しておりました。
しかし、間もなくリリースされる iOS8 では、前者の書き方では通用せず、documentsDirectory を指定する必要があります。
現在リリースされている、AIR SDK 15 では、対応 iOS のバージョンが 6.0〜となっておりますので、後者の書き方だけで問題ないと思われます。
なぜ動作しなくなったのか
さて、なぜ前者の書き方で動作しなくなったのかについて、いろいろと調査してみました。
すると、アプリのデータの保存領域というか、パスの内容が、iOSから変化が加わっているようなのです。
iOS6〜iOS8で、以下のディレクトリを調査してみました。
- File.applicationDirectory
- File.documentsDirectory
- File.applicationStorageDirectory
- File.userDirectory
出力結果に表示する各名前は以下の通りです。
「GUID番号」は、数字と英語とハイフンで構成された、アプリ固有の識別IDで、パブリッシュする都度変化します。
「アプリファイル名」は、パブリッシュ時のアプリ名で、「****.app」 の名前で表示されます。
「アプリケーションID」は、provisioningファイル生成の際につけるIDで「com.hogehoge.appli」のような形のものです。
iOS6の場合
- File.applicationDirectory.nativePath
/var/mobile/Applications/<GUID番号>/<アプリファイル名>
- File.documentsDirectory.nativePath
/var/mobile/Applications/<GUID番号>/Documents
- File.applicationStorageDirectory.nativePath
/var/mobile/Applications/<GUID番号>/Library/Application Support/<アプリケーションID>/Local Store
File.userDirectory.nativePath
/var/mobile/Applications/<GUID番号>
動作しているので、特に気になるところはありませんでした。
iOS7の場合
- File.applicationDirectory.nativePath
/var/mobile/Applications/<GUID番号>/<アプリファイル名>
- File.documentsDirectory.nativePath
/var/mobile/Applications/<GUID番号>/Documents
- File.applicationStorageDirectory.nativePath
/var/mobile/Applications/<GUID番号>/Library/Application Support/<アプリケーションID>/Local Store
- File.userDirectory.nativePath
/var/mobile/Applications/<GUID番号>
iOS6と同じ結果なので、当然問題はありませんでした。
iOS8の場合
さて、いよいよ問題の iOS8 です。
- File.applicationDirectory.nativePath
/private/var/mobile/Containers/Bundle/Application/<GUID番号 A>/<アプリファイル名>
- File.documentsDirectory.nativePath
/var/mobile/Containers/Data/Application/<GUID番号 B>/Documents
- File.applicationStorageDirectory.nativePath
/var/mobile/Containers/Data/Application/<GUID番号 B>/Library/Application Support/アプリケーションID>/Local Store
- File.userDirectory.nativePath
/var/mobile/Containers/Data/Application/<GUID番号 B>
全ての値が、iOS7までと大きく変わっています。
すなわち、iOS7 までの保存先フォルダと、iOS8の保存先フォルダに、大きな変更が加わったと思われます。
iOS7までの場合、
/var/mobile/Applications/<GUID番号>/
までの部分は、4つのフォルダとも共通となっております。
しかし、iOS8では、
- File.applicationDirectory.nativePath
とその他の今回調査した3つのフォルダ
- File.documentsDirectory.nativePath
- File.applicationStorageDirectory.nativePath
- File.userDirectory.nativePath
で、ディレクトリ構造が異なっているようです。
さらには、アプリ固有の識別ID(GUID番号)までが異なっています。
従来のフォルダ指定では、
File.applicationDirectory.nativePath+"/\.\./Documents"
と指定しておりました。
すなわち、上記の例でいうと、指定しているフォルダは
/private/var/mobile/Containers/Bundle/Application/<GUID番号 A>/Documents
を意味します。
しかし、iOS8で実際のドキュメント用のフォルダがあるのは
/var/mobile/Containers/Data/Application/<GUID番号 B>/Documents
と、全く違うフォルダになってしまいます。
とりあえず、原因が分かって無事に対応ができたので、ほっとしておりますが、今後データの整合性の部分で、他にもいろいろと問題が出てきそうで、不安な感じです。
新しい OS がリリースされる度に、ちゃんと動作するのか、ドキドキしてしまいますね。