GADGET FACTORY 雑記帳

iPhone アプリ / Flash コンテンツ /Adobe AIR などを開発していて気づいたことや備忘録、TIPS、HACKなど

アプリが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での動作を確認できています。


なぜこの書き方をしていたのか

このアプリは、かなり以前に作成したアプリだったこともあり、AIRiOS4.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 がリリースされる度に、ちゃんと動作するのか、ドキドキしてしまいますね。