2014-06-11 58 views
0

我有一個OS X應用程序,我想在其中創建一些可交換的字符串和資源。 我創建了一個包skin.bundle,我可以很容易地從它加載資源,如果我把束引入主要的應用程序包(這樣它就總是會下的.app /目錄放到/資源),並使用此代碼從PlugIns文件夾中加載資源包

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

問題原來是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]; 

我也停止加載包 - 這是一個沒有主體類的資源包,所以它不能/不需要加載。