Почему мой пакет игнорирует свой info.plist? - PullRequest
0 голосов
/ 26 августа 2011

Я пытаюсь связать набор ресурсов в пакет, и они получают к ним доступ из кода через NSBundle.

Пока что я могу получить доступ к ресурсам из комплекта, но не могу получить экземпляр NSBundle для получения метаданных из файла Info.plist комплекта.

Как ни странно, моя первая попытка сработала и правильно получила метаданные, но с тех пор я не смог воспроизвести это поведение, и пакет всегда возвращает нуль для bundleIdentifier или других элементов в infoDictionary.

Я сократил код до следующего контрольного примера:

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 игнорируются.

Плис выглядит следующим образом:

<?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 ]

1 голос
/ 26 августа 2011

Папка «Содержимое» отсутствует.

1 голос
/ 26 августа 2011

Кажется, ваш bundle объект ссылается на Bundle, но Bundle еще не загружен, поэтому вы получаете значение NULL при вызове bundleIdentifier. Из документации Apple по коду загрузки пакета

Чтобы загрузить исполняемый код пакета, используйте метод загрузки NSBundle. Этот метод возвращает YES, если загрузка прошла успешно или код уже был загружен, и NO в противном случае.

Вам нужно позвонить [bundle load] вот так:

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

Дополнительная информация о Загрузка пакета описана в документации Apple

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...