OS X上插件中Resources文件夹的路径

时间:2010-12-14 15:18:55

标签: xcode macos bundle

我正在为OS X编写FileMaker Pro插件,我需要能够访问/Applications/FileMaker Pro 11/Extensions/blah.fmplugin/Contents/Resources目录中的文件。 (但这可能是/apps/FileMaker Pro 11 Advanced/Extensions/xyz.fmplugin/Contents/Resources或其他内容,具体取决于用户安装FMP的位置以及是否重命名插件等。)因为我无法控制用户安装FMP的位置,或者他们是否正在运行FMP或FMPA或他们是否已重命名我的插件(尽管这不如FMP与FMPA情况相比),我知道插件包的路径。

我找到了这样的答案:Relative Paths Not Working in Xcode C++但是它为我提供了FileMaker.app中的Resources文件夹的路径,而不是我的插件。

即。我得到/Applications/FileMaker Pro 11/FileMaker Pro.app/Contents/Resources而不是我的插件中的Resources文件夹的路径。

我是否需要在Xcode中配置以使上述解决方案正常工作?或者还有其他方法可以走上这条路吗? CFBundleGetMainBundle()调用使它看起来像是要返回应用程序本身的包而不是插件。

我找到了一些基于Bundle Programming Guide和CFBundleGetBundleWithIdentifier(由mipadi提到)的可能性,但我还没有弄清楚我需要什么功能以及先决条件是什么。

2 个答案:

答案 0 :(得分:3)

这似乎是这样做的。 CFBundleGetBundleWithIdentifier也应该有效,但我决定使用NSBundle而不是CF *。我将它放在一个.mm文件中,并将其包含在项目中。然后我可以调用get_resources_path()函数并将路径作为字符串。

#include <Foundation/Foundation.h>

#include <string>

std::string *get_resources_path()
{
    NSBundle *bundle;

    bundle = [NSBundle bundleWithIdentifier: @"com.example.fmplugin"];
    if (bundle == NULL) {
        // error handling
    }

    NSString *respath = [bundle resourcePath];
    if (respath == NULL) {
        // error handling
    }

    const char *path = [respath UTF8String];
    if (path == NULL) {
        // error handling
    }

    return new std::string(path);
}

答案 1 :(得分:2)

如果您知道捆绑包的路径,则可以使用CFBundleCreate;或者您可以通过CFBundleGetBundleWithIdentifier使用捆绑标识符获取捆绑包。