Редактирование внешнего списка свойств (.plist) - PullRequest
0 голосов
/ 12 июля 2011

Вот мой код:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application

}

- (IBAction)unlockIt:(id)sender {

    if ([[appField stringValue] length] < 1) {
        [status setTextColor:[NSColor redColor]];
        [status setStringValue:@"error with name"];
    }
    else {
        [status setStringValue:@""];
        [status setTextColor:[NSColor greenColor]];

        NSString *path = [NSString stringWithFormat:@"/Applications/%@.app/Contents", [appField stringValue]];

        NSBundle *bundle = [NSBundle bundleWithPath:path]; 

        NSString *infoPlist = [bundle pathForResource:@"Info" ofType:@"plist"];

        NSString *randomIdentifier = [NSString stringWithFormat:@"com.derp.%i", arc4random()];

        [infoPlist setValue:randomIdentifier forKey:@"Bundle identifier"];

        [status setStringValue:@"attempt successful"];
    }
}

Я получаю эту ошибку:

[setValue: forUndefinedKey:]: этот класс не совместим со значением ключа для идентификатора набора ключей.

Как я могу это исправить?

1 Ответ

1 голос
/ 12 июля 2011

Ключ не является «идентификатором пакета» - это дружественное представление ключа.

Фактический ключ - «CFBundleIdentifier», и для него есть константа CFStringRef, которую можно преобразовать в NSString:

(NSString *)kCFBundleIdentifierKey
<Ч />

Редактировать: Больше проблем с вашим кодом:

NSString *infoPlist = [bundle pathForResource:@"Info" ofType:@"plist"];
[infoPlist setValue:randomIdentifier forKey:@"Bundle identifier"];

infoPlist - это строка, содержащая этот путь к файлу Info.plist внутри пакета приложения. Это не сам список. Вам нужно прочитать Info.plist в словарь, изменить его содержимое, а затем написать его снова. Например:

NSString *infoPlistPath = [bundle pathForResource:@"Info" ofType:@"plist"];
NSMutableDictionary *infoPlist = [NSDictionary dictionaryWithContentsOfFile:infoPlistPath];
[infoPlist setObject:randomIdentifier forKey:(NSString *)kCFBundleIdentifierKey];
[infoPlist writeToFile:infoPlistPath atomically:YES];
...