Ios 8: Изменения пути пучка

У меня есть приложение iOS, в котором хранится абсолютный путь к файлам в базе данных и в сгенерированных html-документах. Я недавно обновил свой iPhone до iOS 8, и теперь, когда я запускаю приложение, кажется, что приложение установлено в другой каталог, каждый раз компилируется. Например, при первом сборке/запуске [[NSBundle mainBundle] bundlePath] возвращает что-то другое в следующем построении/запуске. Что происходит? Это новая функция Apple?

Обновление: Создан отчет об ошибке

Пример кода:

Если я запустил следующую строку над несколькими строками/запусками, каждый раз получаю другой результат.

#define kOLD_PATH @"oldPath"
NSString* newPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
NSString* oldPath = [[NSUserDefaults standardUserDefaults] objectForKey:kOLD_PATH];

NSLog(@"New Path: %@", newPath);
NSLog(@"Old Path: %@", oldPath);
NSLog(@"Result: %@", [oldPath isEqualToString:newPath] ? @"Same" : @"Changed");

[[NSUserDefaults standardUserDefaults] setObject:newPath forKey:kOLD_PATH];
[[NSUserDefaults standardUserDefaults] synchronize];

Результат выглядит следующим образом: несколько экземпляров

New Path: /var/mobile/Containers/Data/Application/4FFCE2CB-580D-409A-90CB-EF2B8A1FB653/Library
Old Path: /var/mobile/Containers/Data/Application/B038B2DA-F85D-4E18-A5F1-8635834EC454/Library
Result: Changed

Полное раскрытие: В моем приложении пользователь импортирует веб-страницу (ePub) с ресурсами. Ресурсы хранятся на веб-странице. Веб-страница также обращается к ресурсам, входящим в комплект приложения. Чтобы достичь этого, когда я загружаю веб-страницу, базовый url устанавливается в каталог, в котором находится веб-страница, и ресурсы пакета доступны через абсолютные пути к файлам. Теперь, когда пути файлов изменяются при каждом обновлении, это прерывается. Я попытался создать символические ссылки на ресурсы пакета, но также не удалось выполнить последующие обновления.

Ответ 1

Обратитесь к технической записке 2406 от Apple

Разрывное изменение

Начиная с iOS 8, в папках "Документы" и "Библиотека" нет более длинные братья и сестры вашего приложения.

Не храните полный путь /URL в своих документах. Сохраните имя файла и всегда создавайте полный путь /URL с рекомендуемым подходом.

Получить URL-адрес DocumentDirectory

// Returns the URL to the application Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

Затем вы получите путь из URL-адреса и добавьте имя файла для генерации полного пути.

Ответ 2

В iOS 8 изменилось расположение файловой системы контейнеров приложений. Приложения и их содержимое больше не сохраняются в одном корневом каталоге.

Из примечаний к выпуску iOS 8:

Макет файловой системы контейнеров приложений изменен на диске. Скорее чем полагаться на жестко закодированную структуру каталогов, используйте NSSearchPathForDirectoriesInDomains или URLForDirectory:inDomain:appropriateForURL:create:error: метод NSFileManager класс. См. Доступ к файлам и каталогам в Файл Руководство по системному программированию.

Это не ошибка. Убедитесь, что вы используете рекомендуемые API (из приведенной выше цитаты), и у вас не будет проблем.

Итак, если вы пытаетесь получить доступ к связанным ресурсам, добавленным в проект, вы должны использовать:

[[NSBundle mainBundle] pathForResource:@"resourceName" ofType:@"extension"];

Но если вы хотите использовать что-то, что вы положили в каталог документов, вы должны использовать:

[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:@"resourceName.extension"];

Ответ 3

Не знаю, решила ли вы свою проблему, но эта ссылка возможна.

https://developer.apple.com/library/prerelease/ios/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/AccessingFilesandDirectories/AccessingFilesandDirectories.html#//apple_ref/doc/uid/TP40010672-CH3-SW10

Поиск файлов с помощью закладок

Несколько строк до этого раздела на странице - это текст:

"Важно: Несмотря на то, что они безопасны во время работы вашего приложения, ссылки на ссылки на файлы небезопасны для хранения и повторного использования между запусками вашего приложения, поскольку идентификатор файлов может измениться, если система перезагружена. Если вы хотите сохранить местоположение файла постоянно между запусками вашего приложения, создайте закладку, как описано в разделе" Поиск файлов с помощью закладок".

До свидания.

Ответ 4

Я думаю, что другой путь для каждой сборки и запуска - это предполагаемый способ вещей, происходящих в iOS-симуляторе. Это не проблема.

/вар/мобильный/Контейнеры/Data/Application/4FFCE2CB-580D-409A-90CB-EF2B8A1FB653/Библиотека /Вар/мобильный/Контейнеры/Data/Application/B038B2DA-F85D-4E18-A5F1-8635834EC454/Библиотека

Я нашел, даже если вы используете рекомендуемый способ

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

Результаты одинаковы. Различные пути для каждой сборки и запуска.