Drowsy Dog's Diary

any note, any thought

2013年3月6日
by kazoo
1 Comment

iOSシミュレータ上アプリの実ファイルパスとバンドルリソースの上書き

ちょっとやらかしたのでメモ。。

iOSシミュレータで扱うアプリケーションの実際のファイルパスは、

/Users/xxx/Library/Application Support/iPhone Simulator/6.1/Applications/XXXXXX-XXXX-XXXX-XXXX-XXXXXXX/hogehoge.app/

のようになり、バンドルリソースもこの下にあります。(OS X Lion, XCode 4.6, Simulator 6.1)
iOSバージョンが変われば当該のディレクトリも変わるけど、iPhone/iPad それぞれのシミュレータでは共用らしい。

で、このディレクトリ、シミュレータ上でアプリをアンインストールしたり、メニューから「コンテンツと設定をリセット」したときは消えるのだけど、アプリを上書きでシミュレータをスタートさせるときには同じディレクトリに上書きとなるので、たとえばバンドルリソースファイルが削除されていても、シミュレータ上には古いリソースが残っていたりします。フォルダリファレンスとして登録されたバンドルリソースのディレクトリ内容を手動で変更したときにありがち。

また、たとえば XCode プロジェクトのフォルダをまるっとコピーして、別の開発リソースとして作業をしていても、プロジェクト名(BundleID)が同じものは、シミュレータ上のバンドルリソースも同じディレクトリになります(シミュレータ上同じアプリなんだから当たり前ですが)。

以上は実機でも同じです。上書きのときに古いバンドルリソースは OR を取る形で残っている。

なので、XCode プロジェクトを成果物としてリリースする場合、固めたリリース物を再度解凍して別ディレクトリで最終テスト。。なんてやってるつもりが、XCode 上には存在しないリソースが実は手元のデバイスやシミュレータには残っていて、「おい動かねーぞ」「あほかこっちでは動くわ」なんてやり取りをするハメになったりします。というかなった。反省した。

最終テストはクリーンな環境でやりましょう。。という、ごく当たり前のお話でした。

 

あと、シミュレータアプリのディレクトリをうっかり手動で削除したりすると、

error: failed to attach to process ID 0

というエラーで上書きできなくなったりします。このときにも、素直にシミュレータ上のアプリを長押ししてアンインストールしましょう。

2012年10月30日
by kazoo
0 comments

iOS6でglReadPixels( )が空っぽになる

OpenGL ES view のフレームバッファのキャプチャについて。

こんな感じでしていました。

が、iOS6 ではこの glReadPixels() の返りが真っ暗になっていました。

Apple オフィシャルの Q&A を読むと、
http://developer.apple.com/library/ios/#qa/qa1704/_index.html

By default, the contents of a renderbuffer are invalidated after you present them to the display. Therefore, to get defined results when reading your OpenGL ES content, you must do one of the following:

1) Call glReadPixels before calling EAGLContext/-presentRenderbuffer:, or

2) Set the CAEAGLLayer’s retained backing property to true to retain the contents of the layer. However, this can have adverse performance implications so you are cautioned to use this setting only when necessary.

The above restrictions do not apply for offscreen, non-displayable framebuffers.

要は、表示してしまっている EAGLContext は、renderbuffer にあるピクセルデータがすでに正常なデータではないので、

1) 表示の前に読むか
2) retained back buffer を CAEAGLLayer に設定しろ

ということらしいです。
試しに、EAGLLayer を作るときに、

と、drawableProperties に kEAGLDrawablePropertyRetainedBacking を設定してやれば正常にキャプチャできました。

ただし、この方法は性能に影響が出るので、必要なときにだけ設定するようにしましょう。
また、表示していないフレームバッファについては、この設定は必要ないとのことです。