为什么我的包忽略了它的info.plist?

时间:2011-08-26 12:26:59

标签: objective-c cocoa nsbundle macos

我正在尝试将一组资源捆绑到一个包中,并通过NSBundle从代码中访问它们。

到目前为止,我可以很好地从bundle中访问资源,但是我无法获取NSBundle实例从bundle的Info.plist文件中获取任何元数据。

奇怪的是,我的第一次尝试工作正确,并正确获得了元数据,但从那以后我无法复制此行为,并且bundle始终为bundleIdentifier或infoDictionary中的其他项返回null。

我已将代码缩减为以下测试用例:

NSString *pathToTestBundle = [[NSBundle mainBundle] pathForResource:@"test" 
                                                    ofType:@"testBundle"];
NSLog(@"path to Test Bundle: %@", pathToTestBundle);

NSBundle *testBundle = [NSBundle bundleWithPath: pathToTestBundle];
NSLog(@"testBundle: %@", testBundle);

NSString *identifier = [testBundle bundleIdentifier];
NSLog(@"testBundle identifier: %@", identifier);

NSURL *testResourceURL = [testBundle URLForResource:@"vanGroup" 
                                       withExtension:@"png"];
NSLog(@"testBundle test resource: %@", testResourceURL);

NSImage *testImage = [[NSImage alloc] initByReferencingURL:testResourceURL]; 
[imageView setImage:testImage];

NSLog(@"%@", [testBundle infoDictionary]);

这给出了:(为行长度编辑)

path to Test Bundle: /.../BundleTester.app/Contents/Resources/test.testBundle
testBundle: NSBundle </../BundleTester.app/Contents/Resources/test.testBundle> 
      (not yet loaded)
testBundle identifier: (null)
testBundle test resource: file://.../BundleTester.app/Contents/Resources/test.testBundle/Resources/vanGroup.png
BundleTester[45083:707] {
    NSBundleInitialPath = "/Users/diggory/Library/Developer/Xcode/DerivedData/BundleTester-hcbsnhudsdfzlyggjbvlkdbrtxrw/Build/Products/Debug/BundleTester.app/Contents/Resources/test.testBundle";
    NSBundleResolvedPath = "/Users/diggory/Library/Developer/Xcode/DerivedData/BundleTester-hcbsnhudsdfzlyggjbvlkdbrtxrw/Build/Products/Debug/BundleTester.app/Contents/Resources/test.testBundle";
}

在我的Xcode项目中,测试包被添加为文件夹引用,并具有以下结构:

test.testBundle
    Info.plist
    Resources
        vanGroup.png

正确加载了图像资源,但忽略了plist中的值。

plist如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>CFBundleIdentifier</key>
    <string>com.monkeyfood.testbundle</string>
    <key>badger</key>
    <string>Bodger</string>
</dict>
</plist>

我错过了什么吗?我做错了什么?
非常感谢。

2 个答案:

答案 0 :(得分:1)

看来你的bundle对象指的是Bundle但Bundle尚未加载,这就是你调用bundleIdentifier时得到null的原因。来自Apple关于捆绑加载代码的文档

  

要加载包的可执行代码,请使用NSBundle的加载方法。如果加载成功或者代码已经加载,则此方法返回YES,否则返回NO。

您需要像这样致电[bundle load]

NSBundle *testBundle = [NSBundle bundleWithPath: pathToTestBundle];
[testBundle load];   // Load the bundle...

有关Bundle Loading的更多信息,请参阅Apple的文档

答案 1 :(得分:1)

缺少“内容”文件夹。