外部素材データの保存先について

40 views
Skip to first unread message

POOL BLACK

unread,
Nov 13, 2016, 2:08:57 PM11/13/16
to 日本コロナの会
はじめまして、一之瀬と申します。

Corona無料版にてiPhone版のアプリを開発・運用しております。

アプリ本体の容量をなるべく減らしたく、また、今後増えていくコンテンツをふまえ、画像や音源ファイル等の素材データを別途契約しているサーバよりネットワーク経由でダウンロードし保管しております。

具体的には、コンテンツ上で様々な「銃」があり、ユーザーがアンロックをすると関連ファイルをZIP形式にてダウンロード、CachesDirectoryに展開しております。
ひとつのZIPファイルは3~10MB程度ありますので、再インストール時やユーザーによる意思(コンテンツ毎の再ダウンロードボタンを押す)を除き、再度ダウンロードする事は想定しておりません。
以前はDocumentsDirectoryに保存しておりましたが、AppleよりiCloudのバックアップ対象となる為、CachesDirectoryに置く事と警告を受け、リジェクトをされた経緯がございます。
(iCloudのバックアップは必要ございません。また、ユーザーにより素材を見られてしまうのは避けたいです。)

最近になってようやく理解してきたのですが、CachesDirectoryは端末の容量等の関係でOSにより随時削除される事があるとの事で、そのせいか、あきらかに素材不足によるエラー報告がユーザー様より時折入ってきている状況です。

そこで、上記の素性のファイル群を置くべき場所で現在悩んでおります。

Appleのドキュメントを見る限り、

・Library
・Library/Cache
・Library/Application Support (※恐らくここに置くのが正解)
・Library/独自ディレクトリを作っても可

という記述がございますが、CoronaSDKにて上記ディレクトリにアクセスする術がない様に見受けられます。

現状のまま、CachesDirectoryに格納しファイルがあるか確認をしてなければ再ダウンロードというロジックを考えておりますが、OSにより削除されるタイミングがいまいち良く分からない事と、元がZIPファイルですので「ファイルの一部」の存在可否を判断するのが難しいことから、攻めあぐねている状況です。
ZIP内容のファイル数をカウントしておき、展開後のディレクトリで都度これを算出、異なるなら削除れていると判断し再ダウンロードするのが現時点では確実かなとも思っております。

質問としましては、

1.iOSによるキャッシュディレクトリの具体的な削除タイミング。(アプリ起動中にも削除され得るということは分かっております。)
2.CoronaSDKからのLibrary/Application Supportへのアクセス方法。
3.その他、このようなケースの場合の皆様の対応方法

をお聞きできれば幸いです。
ちなみにAndroidの場合は、system.CachesDirectory = system.DocumentsDirectoryということだと理解しておりますので、system.DocumentsDirectoryに保管しております。

何卒よろしくお願い致します。

naoya yamamoto

unread,
Nov 13, 2016, 9:02:13 PM11/13/16
to 日本コロナの会
山本です

DocumentsDirectoryに入れて、このsetSyncのフラグをfalse にしても、Appleにレジェクトされてしまいますか?


Robさんのコメントはこちら

以上です
--

2016年11月14日 4:08 POOL BLACK <blackpo...@gmail.com>:
--
--
このメールは次の Google グループの参加者に送られています: 日本コロナの会
このグループにメールで投稿: coro...@googlegroups.com
このグループから退会する: coronaja+unsubscribe@googlegroups.com
その他のオプションについては、次の URL からグループにアクセスしてくださ
い。 http://groups.google.co.jp/group/coronaja?hl=ja
--------------------------------------------------------------------------
http://twitter.com/JapanCoronaGrp

---
このメールは Google グループのグループ「日本コロナの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには coronaja+unsubscribe@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Toshihide Tanaka

unread,
Nov 13, 2016, 9:13:52 PM11/13/16
to coro...@googlegroups.com
田中と申します。


> 質問としましては、
>
> 1.iOSによるキャッシュディレクトリの具体的な削除タイミング。(アプリ起動中にも削除され得るということは分かっております。)
> 2.CoronaSDKからのLibrary/Application Supportへのアクセス方法。
> 3.その他、このようなケースの場合の皆様の対応方法
>
> をお聞きできれば幸いです。


1.iOSの仕様によればアプリ実行中はキャッシュは削除されないはずですが…
以下のドキュメント24ページに記述があります。
https://developer.apple.com/jp/documentation/FileSystemProgrammingGuide.pdf


2.仕様にないことは回答のしようがありません。
またそのような処理は実行すべきではないでしょう。


3.ご自分でもコメントされているようなロジックであっていると思います。

> ZIP内容のファイル数をカウントしておき、展開後のディレクトリで都度これを算出、

当社ではzipファイルの構造を記述したjsonファイルをサーバーに置いておき、
アプリの起動時・アクティベート時にjsonファイルに毎回アクセス、
キャッシュディレクトリの中身と照合しています。
ちょっと面倒ですが、コンテンツの増減や複雑化を前提に、
そのような設計をしています。


お役に立てば幸いです。

POOL BLACK

unread,
Nov 14, 2016, 1:25:00 AM11/14/16
to coro...@googlegroups.com


山本様、田中様

ご回答ありがとうございます。

setSyncにつきましては適用しておりません。2年ほど前にリジェクトされましたので、再度setSyncを適用後、申請してもよいのですが、
出来ればユーザーから見える場所にファイルを置きたくはなかった為、CachesDirectoryにて運用しております。

>1.iOSの仕様によればアプリ実行中はキャッシュは削除されないはずですが…
>以下のドキュメント24ページに記述があります。

また、こちらのドキュメントにつきましては既に読んでおりましたが、ご指摘のページはOSX向けの説明かと思われます。
iOS向けは15ページに記述がございますが、明示的に起動中にキャッシュディレクトリを消さない旨は書いておりませんでした。

他の開発者様がテストされた結果をお書きになっているサイト(私が拝見したのでは2サイト程)では、

・テンポラリディレクトリ : 起動中には削除されない。
・キャッシュディレクトリ : ストレージ容量の切迫等により起動中でも削除される。

との記述を拝見しまして、此処でご質問に至った次第です。


2016年11月14日 11:13 Toshihide Tanaka <tta...@fmht.jp>:
--
--
このメールは次の Google グループの参加者に送られています: 日本コロナの会
このグループにメールで投稿: coro...@googlegroups.com
このグループから退会する: coronaja+unsubscribe@googlegroups.com
その他のオプションについては、次の URL からグループにアクセスしてくださ
い。 http://groups.google.co.jp/group/coronaja?hl=ja
--------------------------------------------------------------------------
http://twitter.com/JapanCoronaGrp

---
このメールは Google グループのグループ「日本コロナの会」の登録者に送られています。

Toshihide Tanaka

unread,
Nov 14, 2016, 1:43:31 AM11/14/16
to coro...@googlegroups.com
田中です。

資料ポインタのミス、申し訳ありません。

しかし、本家サイト

https://developer.apple.com/library/content/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

にて、以下の記述があります。

In iOS 5.0 and later, the system may delete the Caches directory on
rare occasions when the system is very low on disk space. This will
never occur while an app is running.

従って、アプリが実行中はシステムによって削除されることは無いと考えます。
そもそも、アプリが実行中に、キャッシュが(知らずに)削除され得るのであれば
キャッシュの意味はないと思いますが…

以上、よろしくお願い致します。

C.C.

unread,
Nov 14, 2016, 1:53:25 AM11/14/16
to coro...@googlegroups.com
CyberCatfish です、横槍ですみませんが何の話をしているのか意味が取れません。

例えば、iPhone で DocumentDirectory に置くと、iCloudに放り込まれてユーザに丸見えになる?
こんな話を聞いたことが無いのですが・・
逆に DocumentDIrectory だろうが CacheDirectory だろうが、XCode でデバイス接続したら丸ままダウンロード可能です。

あと、キャッシュディレクトリは消される可能性がある一時起きファイルです。
ファイルがオープンされている様な時は削除されないでしょうが、クローズで置いておいたらOS都合で削除されます。
細かく言うと /tmp などはアプリがアクティブなら消されませんが /chache はアプリがアクティブであろうが使ってなければ消されることがあります。
あくまでも一時置き用のディレクトリで、そんなところにダウンロードした静的コンテンツをおくべきではありません。

zip のダウンロードは Cache にして、展開は Document にするべきだと考えます。

以前リジェクトされたという話ですが、それは多分、でかい動的な一時ファイルをドキュメントに置くんじゃ無いって言われたんだと思います。
Appleは無下にリジェクトされたからダメじゃなくて、こちらが何をしたくて相手が何をダメだと言っているのか、理解が必要です。
もし理解できないのなら、何度でもメールでも電話でも確認した方が良いです。
実際、レビューしている人によっても基準が少し違いますし、勉強になる指摘も結構多いです。
まぁ僕なんか、同じアプリをバージョンアップ毎にリジェクトされて毎度同じ説明をして通すこともありましたが (^_^;;

実は Corona SDK は不自由なんで他に行こう行こうと思いつつ、Corona で作成してるアプリが年々増えて困ってます(笑

POOL BLACK

unread,
Nov 14, 2016, 2:33:26 AM11/14/16
to coro...@googlegroups.com
皆さま

一之瀬です。ご返信ありがとうございます。

ですが、Appleのドキュメント、
より14~15ページ目、

"
Documents : ユーザが生成したデータを保存するために使います。ファイル共有の機能により、ユーザはこのディレクトリ以下にアクセスできます。した がって、ユーザに見せても構わないファイルのみ置いてください。 このディレクトリの内容はiTunesによってバックアップされます。 
Library : ユーザに見せたくないファイルはLibraryサブディレクトリ以下に置い てください。ユーザデータのファイル保存用に使ってはなりません。 
"

という記述がございまして、ではこちらは何を指している事になるのでしょうか??

前回、アップルからのリジェクト説明では、再ダウンロード可能なファイルはDocumentsDIrectoryに置くな、不要なDocumentsDIrectoryにおくと
iCloudのバックアップ対象になりユーザーのストレージ容量を圧迫します。ということでした。
ですので、setSyncにてバックアップ対象から外すことにより、この限りではないと思っておりますが、
上記アップルドキュメント内の「ユーザーに見せても構わない」関連の記述により、出来うる限り隠ぺいしたい事からCachesDirectoryを選択していた次第です。

本来「ユーザーには見られない」、Library以下に何かしらのディレクトリを独自に作れればいいのですが、
CoronaではLibrary/Cachesにしかアクセス出来ないので、選択肢がDocumentsDirectoryかCachesDirectoryしかないのです。
しかしながら、iOSのCachesDirectoryの削除の挙動に確信が持てず、どこに何を置けばベストなのかのご教示を頂ければと思いまして、
ご質問させて頂いた次第です。


2016年11月14日 15:53 C.C. <cyberc...@gmail.com>:

C.C.

unread,
Nov 14, 2016, 3:13:21 AM11/14/16
to coro...@googlegroups.com
CyberCatfish です。

一ノ瀬さん、話がよくわからないのですが、元々のダウンロードファイルは随時消えて良いのですか?
iCloudにバックアップされないということは、OSのバージョンアップの度にデータが消えるという事ですが、良いのでしょうか?
消えてほしく無いなら、iCloudを圧迫しようがなにしようが消えない場所に置くしかありませんよね。
多分、レビュー者には一時ファイルに見えたんじゃないかなと思うんですけど・・

上記の話と、見えないところに置きたいという話は別にした方が良いかも。
Caches は、OSバージョンアップなど復元時に消されるし、またOSやアプリ都合で削除される事が有ると明記されてます。
Caches を使うなら、消えてしまった時の事を考えてプログラムするしかないと思います。
Library に別のディレクトリが欲しいという場合は、ローカルなユーザフォーラムじゃなくて、本家のフォーラムに意思表明を書いた方が良いと思われます。

坂本 俊之

unread,
Nov 14, 2016, 3:27:45 AM11/14/16
to 日本コロナの会
こんにちは。坂本といいます。

何度かメールが返ってきたので再投稿します。重複してしまったら申し訳ありません。

このメーリングリストにしては珍しく議論が進んでいますね。


議論になっているディレクトリの使い方については、おそらく参照されている資料より、
https://developer.apple.com/icloud/documentation/data-storage/index.html
こちらの方が解りやすいかと。

結論から言うと、この場合は再ダウンロードを考えていないというのでCyberCatfishさんが正しいのですが、上記資料には
「downloadable content, such as that used by magazine, newspaper, and map
applications.」
は<Application_Home>/Library/Caches に保存しろ、とあり、
都度再ダウンロードするべきコンテンツと見なされるならば、Cachesの方に入れないといけないかもしれません。


一時ファイルの削除される/されないについては、
<Application_Home>/Library/Caches と
<Application_Home>/tmp
を混同されていませんか?


それでは。

2016年11月14日月曜日 4時08分57秒 UTC+9 POOL BLACK:

POOL BLACK

unread,
Nov 14, 2016, 3:30:52 AM11/14/16
to coro...@googlegroups.com
CyberCatfish 様

ご返信ありがとうございます。
一之瀬です。

一度ダウンロードした素材ファイルは随時消えてはまずいです。

iOSのアップグレード・アプリのアップデートも何度もしておりますが、
いまだCachesの中身が消された事がありませんでしたので、当方、Cacheディレクトリがアプリの
アンインストールと共に削除されるものと勘違いをしておりまして今に至っております。

ですので皆様はこのようなケース場合はどうされているのか、もしかして別のディレクトリがあるのか?
と思いご質問させて頂いた次第です。

ご教示頂いた内容からCachesはアテにならなそうですので、
DocumentsDirectory内でiCloud非対象として運用させて頂こうかと思います。

Coronaは長らく使用させて頂いておりますが、日本だと最近あまり元気がないようですね。。

後ほど本家の方で起動時のバナー解除の課金をさせて頂きつつ、
Library/以下のディレクトリの対応をリクエストしてみようと思います。

ご回答頂きました皆さま、お忙しい中どうもありがとうございました。


2016年11月14日 17:13 C.C. <cyberc...@gmail.com>:

--
--
このメールは次の Google グループの参加者に送られています: 日本コロナの会
このグループにメールで投稿: coro...@googlegroups.com
このグループから退会する: coronaja+unsubscribe@googlegroups.com
その他のオプションについては、次の URL からグループにアクセスしてくださ
い。 http://groups.google.co.jp/group/coronaja?hl=ja
--------------------------------------------------------------------------
http://twitter.com/JapanCoronaGrp

---
このメールは Google グループのグループ「日本コロナの会」に登録しているユーザーに送られています。
Reply all
Reply to author
Forward
0 new messages