iOS 9 Ошибка записи .plist

Ошибки моего приложения после обновления до iOS 9. Не удается записать файл .plist в проект.

-(BOOL)writeDictionaryToPlist:(NSDictionary*)plistDict {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"History" ofType:@"plist"];

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
    [dict setValuesForKeysWithDictionary:plistDict];

    NSDictionary *saveDict = [NSDictionary dictionaryWithDictionary:dict];
    BOOL result = [saveDict writeToFile:path atomically:YES];

    return result;
}

result is NO.

Но iOS 7 и iOS 8 работают нормально.

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


person Jameskit    schedule 30.09.2015    source источник
comment
Этот код не будет работать под любой версией iOS, по крайней мере, на реальном устройстве. Пакет приложения доступен только для чтения.   -  person rmaddy    schedule 30.09.2015
comment
Кстати, использование dict бессмысленно. Просто вызовите writeToFile: на plistDict (если у вас есть правильный путь).   -  person rmaddy    schedule 30.09.2015


Ответы (1)


Используйте DictionWithContentsOfFile: для записи в словарь из plist

NSString *path = [[NSBundle mainBundle] pathForResource:@"History" ofType:@"plist"];
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:path];
BOOL result = [dict writeToFile:path atomically:YES];

ПРИМЕЧАНИЕ, поскольку plist — это ресурс приложения, вы не можете записывать в этот файл, поэтому создайте файл plist в каталоге документов и записывайте в этот файл.

NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
path = [path stringByAppendingString:@"/History.plist"];
BOOL result = [dict writeToFile:path atomically:YES];

Получить данные из plist

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:path];

ОБНОВЛЕНИЕ Добавьте NSAppTransportSecurity в качестве словаря, и первым дочерним элементом должно быть логическое значение с именем NSAllowsArbitraryLoads, для которого задано значение YES.

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
person Mahanthesh Kumbar    schedule 30.09.2015
comment
Не используйте stringByAppendingString: для построения пути. Используйте stringByAppendingPathComponent:. - person rmaddy; 30.09.2015
comment
Привет, Махантеш Кумбар. Спасибо за поддержку. Я следую этому ответу и получаю сообщение об ошибке BSMachError: (os/kern) недопустимая возможность (20) _BSMachError: (os/kern) недопустимое имя (15) Как это исправить? - person Jameskit; 01.10.2015
comment
проверьте обновленный ответ, добавьте NSAppTransportSecurity в файл plist - person Mahanthesh Kumbar; 01.10.2015