PhoneGap и iOS 8: не удалось загрузить локальные файлы ТОЛЬКО после обновления моего приложения
Я разрабатываю PhoneGap
application
где пользователь может перемещаться по некоторым страницам, обслуживаемым сервером. Когда пользователь переходит на эти страницы, приложение загружает все файлы (HTML
, CSS
, JS
и т. д.) и хранить их в iPad
, Таким образом, если пользователь пытается получить доступ к этим страницам offline
, локальные файлы обслуживаются.
Это приложение работало нормально в iOS
7. Вчера я решил обновить свой iPad
в iOS
8, и сначала мне показалось, что это сработало: я могу загружать файлы, выходить в автономный режим и по-прежнему перемещаться по страницам, используя локальные файлы. Единственная ошибка, которую я получаю в Console
является:
[Error] Deprecated attempt to access property 'userAgent' on a non-Navigator object.
Проблема возникает, когда я обновляю свое приложение или использую "phonegap local run ios" с установленным приложением. Всякий раз, когда я делаю это, приложение не может загрузить локальные файлы:
Failed to load resource: The requested URL was not found on this server.
file:///var/mobile/Containers/Data/Application/7A3590E8-C78A-4F45-B5B9-51FD0BAFE524/Library/files/pages/7/7a56ab3cfa56fbd1b9c4becbf5dca4a2.jpg
Файлы есть, я могу прочитать их, используя File
плагин, но WebView не может их загрузить. Я ссылаюсь на них так:
<img src="file://localhost/var/mobile/Containers/Data/Application/7A3590E8-C78A-4F45-B5B9-51FD0BAFE524/Library/files/pages/7/7a56ab3cfa56fbd1b9c4becbf5dca4a2.jpg" >
Я пытался использовать оба Library
а также Compatibility
как iosPersistentFileLocation
, но результат тот же. Я отмечаю все загруженные файлы как "не выполнять резервное копирование", чтобы они не были включены в iCloud
:
fileEntry.setMetadata(function(){}, function(){}, {"com.apple.MobileBackup": 1});
Сначала я подумал, что это вызвано известной ошибкой загрузки локальных файлов в iOS
8, но мое приложение загружает их, оно просто перестает работать после обновления приложения.
я имею PhoneGap
и все plugins
обновлено до последней версии. Я также пытался использовать Cordova
и то же самое происходит.
Кто-нибудь знает, как я могу решить эту проблему или где я должен сообщить об этой ошибке?
Спасибо!
2 ответа
Мне удалось это решить! Я использовал fileEntry.toURL, чтобы получить URL-адреса файлов для использования в моем HTML. Если я использую
fileEntry.toInternalURL()
вместо этого он работает нормально.
С внутренним URL-адресами URL-адреса выглядят так:
cdvfile://localhost/persistent/pages/7/0b0cc746c5e90ee7fc94b2c15d37d43e.png
Я столкнулся с той же проблемой, и мне удалось ее решить. В моем случае моя проблема заключалась в том, что каждый раз, когда я обновляю приложение, новое приложение имеет другой идентификатор, чем последнее. Например, путь для более старого приложения был:
file:///var/mobile/Containers/Data/Application/7A3590E8-C78A-4F45-B5B9-51FD0BAFE524/Library/files/file.pdf
И новый:
file:///var/mobile/Containers/Data/Application/1BC5FS-7B3B-90E8-C7C8-1B7C1984C2A71/Library/files/file.pdf
Поэтому, хотя мои pdf-файлы все еще находились в хранилище данных приложения, я использовал неправильный путь, поскольку приложение создало новый идентификатор приложения. Я решил эту проблему, создав новую функцию, которая обновляет мой путь каждый раз, когда происходит обновление. Я нахожу идентификатор приложения, используя:
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, onFileSystemSuccess, fail);
function onFileSystemSuccess(fileSystem) {
//Do what you need here
}
Файловая система представляет собой объект, содержащий nativeURL внутри корня.
Надеюсь, поможет!