从PlugIns文件夹加载资源包

时间:2014-06-11 07:29:33

标签: macos cocoa

我有一个OS X应用程序,我想在其中使一些字符串和资源可以交换。 我创建了一个包skin.bundle,如果我将包放入主应用程序包(以便它放在.app / Contents / Resources下)并使用此代码,我可以轻松地从中加载资源。 / p>

NSString *path = [[NSBundle mainBundle] pathForResource:@"skin" ofType:@"bundle"];
if (path != nil) {
   self.skinBundle = [NSBundle bundleWithPath:path];
   [self.skinBundle load];
}

Cocoa bundle documentation使用PlugIns(.app / Contents / PlugIns我相信?)文件夹进行模块化应用程序的谈话,所以我尝试通过稍微改变上面的内容来做到这一点。

NSString *plugins = [[NSBundle mainBundle] builtInPlugInsPath];
NSString *path = [[NSBundle mainBundle] pathForResource:@"skin" ofType:@"bundle" inDirectory:plugins];

但现在path是零。我也试过[[NSBundle mainBundle] pathForResource:@"skin" ofType:@"bundle" inDirectory:@"PlugIns"],结果相同。

捆绑包包含有效的Info.plist文件(用于代码签名)。

我可以忍受第一种方法但当然我已经好奇了。想想看,在Application Support文件夹中查找skin.bundle可能会更好,这样它很容易在升级后继续存在。

1 个答案:

答案 0 :(得分:1)

问题原来是NSBundle只能查看自身内部的资源,因此只需要[NSBundle mainBundle]就可以从内容/资源加载。当你知道它时很明显。

这适用于从全局Application Support目录加载(请注意,在这种特殊情况下,我从我们的软件套件的共享AppSupport目录加载,因此kApplicationSupportDirectory是一个硬编码常量)

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSLocalDomainMask, YES);
NSString *appSupDir = [paths firstObject];
appSupDir = [applicationSupportDirectory stringByAppendingPathComponent:kApplicationSupportDirectory];
NSString *path = [appSupDir stringByAppendingPathComponent:@"skin.bundle" ];
id skinBundle = [NSBundle bundleWithPath:path];

我也停止加载捆绑包 - 它是一个没有主要类的资源包,所以它不能/不需要加载。