Macos 从插件文件夹加载资源包

Macos 从插件文件夹加载资源包,macos,cocoa,Macos,Cocoa,我有一个OSX应用程序,我想让一些字符串和资源可以交换。 我已经创建了一个bundleskin.bundle,如果我将该bundle放入主应用程序bundle(以便将其放在.app/Contents/resources下)并使用此代码,我可以轻松地从中加载资源 NSString *path = [[NSBundle mainBundle] pathForResource:@"skin" ofType:@"bundle"]; if (path != nil) { self.skinBundl

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

NSString *path = [[NSBundle mainBundle] pathForResource:@"skin" ofType:@"bundle"];
if (path != nil) {
   self.skinBundle = [NSBundle bundleWithPath:path];
   [self.skinBundle load];
}
讨论使用模块化应用程序的插件(.app/Contents/PlugIns,我相信?)文件夹,所以我尝试通过稍微更改上面的内容来做到这一点

NSString *plugins = [[NSBundle mainBundle] builtInPlugInsPath];
NSString *path = [[NSBundle mainBundle] pathForResource:@"skin" ofType:@"bundle" inDirectory:plugins];
但是现在
path
为零。我还尝试了
[[NSBundle mainBundle]pathForResource:@“bundle”inDirectory:@“PlugIns”类型的“皮肤”]
,结果相同

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


我可以接受第一种方法,但我当然很好奇。仔细想想,最好在应用程序支持文件夹中查找skin.bundle,这样它就可以轻松地经受住升级。

问题是,NSBundle只能看到自身内部的资源,因此请求
[NSBundle mainBundle]
只允许从内容/资源加载。当你知道的时候,这是显而易见的

这适用于从全局应用程序支持目录加载(请注意,在这个特殊情况下,我从软件套件的共享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];