2015-05-21 2 views
0

Я делаю приложение, которое использует кодирование для хранить объекты на каталог документов,Проблема с кодирования объектов на IOS устройств

КСН Simulator, объекты становятся сохранены полностью, и если Я закрыл приложение и вернулся к нему, все данные были восстановлены без проблем.

Но сегодня я попробовал свое приложение на iPhone 5, объекты не сохраняются, когда я закрываю приложение и возвращаюсь к нему снова, все данные удаляются только на реальном устройстве, в чем проблема?

Я использую этот метод, чтобы получить путь к каталогу:

- (NSString *)pathForTask 
{ 
NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentDirectory = [documentDirectories firstObject]; 
return [documentDirectory stringByAppendingString:@"Tasks"]; 
} 

Архив:

NSString *path = [self pathForTask]; 
[NSKeyedArchiver archiveRootObject:self.privateTasks toFile:path]; 

Разархивировать:

NSString *path = [self pathForTask]; 
_privateTasks = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 
+0

Можете ли вы опубликовать код, который вы используете, чтобы получить каталог документов? – socaljoker

+0

@socaljoker - (NSString *) pathForTask { NSArray * documentDirectories = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, ДА); NSString * documentDirectory = [documentDirectories firstObject]; return [documentDirectory stringByAppendingString: @ "Tasks"]; } –

+0

На iOS пути чувствительны к регистру ... но если вы используете описанную выше процедуру для получения файла, тогда это должно быть хорошо. Вы загрузили контейнер с устройства, чтобы проверить, создается ли файл и что-нибудь в нем? – cbiggin

ответ

2

Следующая строка кода вызывает проблему:

return [documentDirectory stringByAppendingString:@"Tasks"]; 

Результаты в возвращенного пути нечто вроде:

.../DocumentsTasks 

Обратите внимание на отсутствие косой черты.

Изменение линии:

return [documentDirectory stringByAppendingPathComponent:@"Tasks"]; 

Это вернет правильный путь и ваш код будет работать на устройстве.

Он работает в симуляторе, потому что в конечном итоге вы создаете файл с именем DocumentTasks в некоторой папке на вашем компьютере. Но на реальном устройстве папка, которую этот файл пытается записать, доступна только для чтения из-за песочницы.

+0

вот что происходит, когда вы разрешаете xcode полный код для вас XD, спасибо, он сработал! –

0

Попробуйте получить каталог документов, используя следующий код вместо:

- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 

После получения каталога документов, вы можете получить путь к определенному файлу, выполнив:

NSURL *fileURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"[FILE NAME]"]; 

Я не уверен, почему ваш код не работает, но это код, я использую на мое приложение, и оно работает в симуляторе и физическом устройстве.

+0

Та же проблема, это ошибка на iOS 8.1? потому что iPhone 5s находится на iOS 8.1, а симулятор - на iOS 8.3. –

+0

Я сомневаюсь. Я использую этот код с iOS 6.x. – socaljoker

+0

Спасибо, сэр за помощь. –

0

Часто код, который работает на сим, но не на устройстве, вызван несоответствием верхнего или нижнего регистра имени файла.

Файловая система в Mac OS почти всегда в зависимости от случая. (Вы можете использовать дисковые тома, для которых файловая система чувствительна к регистру в Mac OS, но они по умолчанию не установлены.)

Симулятор работает на Mac OS. Это файловая система не чувствительна к регистру. Поэтому, если вы сохраните файл как «Задачи», а затем загрузите его как «задачи», он будет работать на сим, но не на реальном устройстве iOS. Убедитесь, что вы действительно тщательно проверяете несоответствующий случай в ваших файлах.

+0

Не думайте, что это связано с чувством чувствительности к случаю или нет, потому что я архивирую и unarchiving, как код в вопросе. –

+0

Думаю, что нет. (Обратите внимание, что код в комментариях почти невозможно прочитать. Лучше отредактировать исходный вопрос и добавить код в конце.) Предложение @ rmaddy использовать stringByAppendingPathComponent - еще одна вероятная причина, хотя я не знаю, почему она будет работать на sim, но не на устройстве iOS. –

+0

@ DuncanC Я объясняю в своем ответе, почему он работает в симу, а не на устройстве. – rmaddy

Смежные вопросы