.appバンドルのすぐ外側のフォルダにリソースをロードするアプリケーションのmacOSバイナリをパッケージ化しました。ディレクトリ構造がC++ macOSアプリケーションでの.appバンドルの場所へのchdir
Foo/
Foo.app/
Contents/
...
resources/
のように見える私は親ディレクトリFoo/
にアプリケーションの作業ディレクトリを変更したい、これは私がこれまでに出ているものです。
#if defined(APPLE)
#include "CoreFoundation/CoreFoundation.h"
#include <unistd.h>
#include <libgen.h>
#endif
int main() {
#if defined(APPLE)
// macOS workaround for setting the working directory to the location of the .app
{
CFBundleRef bundle = CFBundleGetMainBundle();
CFURLRef bundleURL = CFBundleCopyBundleURL(bundle);
char path[PATH_MAX];
Boolean success = CFURLGetFileSystemRepresentation(bundleURL, TRUE, (UInt8 *)path, PATH_MAX);
assert(success);
CFRelease(bundleURL);
chdir(dirname(path));
}
#endif
...
}
これは、(私がテストしているすべてである)のMacOS 10.7と10.10上で動作するように見えますが、10.12に、ユーザーがリソースがロードされていないので、私は上記のハックもはや作品と思われることを報告しています正しく
実行されている.appバンドルのディレクトリに変更するより良い方法はありますか?
Uggghhhh ...情報をありがとう!私はディスクイメージメソッドを試してみます。署名されたディスクイメージでは、上記のように 'Foo'ディレクトリ構造を持つことは可能ですか? – Vortico
ディスクイメージは、ルートフォルダがFooフォルダと本質的に似ているボリュームとしてマウントされます。これには、アプリとその近隣のリソースの両方が含まれます。ユーザーは、両方をローカルファイルシステムに一緒にコピーする必要があります。これは保証することが難しいです。ディスクイメージに明示的なFooフォルダが含まれるようにすると、ユーザーがそのイメージをユニットとしてコピーするように促すことができますが、実際にユーザーが実際にそれを行う保証はありません。 –
もう一つの選択肢は、ディスクイメージまたはzipアーカイブではなくインストーラパッケージを出荷することです。それはアプリケーションとそのリソースを、Fooフォルダに/ Applicationsの下に一緒にインストールします。最後に、これらのリソースをアプリバンドルに移動して、この問題全体を回避することを検討しましたか?アプリの外にあるリソースが最初はなぜですか? –