PhoneGap и iOS 8: не удалось загрузить локальные файлы ТОЛЬКО после обновления моего приложения

Я разрабатываю PhoneGapapplication где пользователь может перемещаться по некоторым страницам, обслуживаемым сервером. Когда пользователь переходит на эти страницы, приложение загружает все файлы (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 внутри корня.

Надеюсь, поможет!

Другие вопросы по тегам