Неподдерживаемая ошибка URL для cdvfile://

Проблема:

В моем приложении я хочу получить доступ к изображению через cordova wkwebview. Элемент HTML выглядит следующим образом.

<img src="cdvfile://localhost/library-nosync/MyFolder/file.jpg">

При загрузке я получаю сообщение об ошибке "Не удалось загрузить ресурс: неподдерживаемый URL". Я работаю с iOS 10.2.

Вещи проверены / проверены:

Если проверен список файлов, находящихся в "cordova.file.dataDirectory" в папке "MyFolder", я вижу там "file.jpg". Он имеет собственный URL-адрес в виде файла: ///var/mobile/Containers/Data/Application/app_id/Library/NoCloud/MyFolder/file.jpg.

Я добавил "img-src 'self' cdvfile:" в Content-Security-Policy.

Я добавил следующее в config.xml

<access origin="cdvfile://*" /> 
<allow-navigation href="cdvfile://*" /> 
<allow-intent href="cdvfile://*" />
<preference name="iosPersistentFileLocation" value="Compatibility" />
<preference name="iosExtraFilesystems" value="library,library-nosync,documents,documents-nosync,cache,bundle,root" />

В URL нет специальных (не ASCII) символов, как указано в темах, связанных с этой ошибкой. Что еще может быть причиной "Неподдерживаемый URL"?

Способ доступа к cdvfile:// путь неверен?

Обновить

Я наткнулся на ссылку (забыл ее перехватить), в которой говорится, что для веб-просмотра нужен относительный путь, и поэтому cdvfile:// не будет работать. Я попытался изменить источник изображения на относительный путь, изменив его на "../../../../../../../../..//var/mobile/Containers/ Data / Application / app-id / Library / NoCloud / MyFolder / file.jpg ", и теперь я вижу новую ошибку -" Не удалось загрузить ресурс: операция не может быть завершена. Операция не разрешена "

Я мог заставить изображение работать, "читая" содержимое файла и передавая эти данные base64 в качестве источника изображения. Но так не должно быть?

1 ответ

Если вы используете новейшую платформу ios (cordova-ios@6.xx), вы можете использовать параметры схемы и имени хоста:

<preference name="scheme" value="app" />
<preference name="hostname" value="localhost" />

Затем вы должны получить и использовать schemeUrl (app://) вместо cdvfile:// или же file:// URL.

var cdvfileUrl = "cdvfile://localhost/library-nosync/MyFolder/file.jpg";

// Convert to native url
window.resolveLocalFileSystemURL(cdvfileUrl, function(entry) {
    var nativeUrl = entry.toNativeURL(); // will be "file://...."

    // Use nativeUrl to get scheme friendly url
    var schemeUrl = window.WkWebView.convertFilePath(nativeUrl);  // Will be "app://..."
});

Вы можете использовать эту schemeUrl в своем <img> src тег.

For Future reference, with the latest WKWebView, the direct setting of the src attribute fails.

Only way I've found to load the image is something like this:

    function loadImageFromFile(filename, imgElement) {
        // filename is cdvfile:....... (string)
        // imgElement is target IMG element name (string)
        window.resolveLocalFileSystemURL(filename, function success(fileEntry) {
            fileEntry.file(function (file) {
                var reader = new FileReader();
                reader.onloadend = function() {
                    if (this.result) {
                        var elem = document.getElementById(imgElement);
                        var blob = new Blob([new Uint8Array(this.result)], { type: "image/png" });
                        elem.src = window.URL.createObjectURL(blob);
                        window.URL.revokeObjectURL(blob);
                    }
                };
                reader.readAsArrayBuffer(file);
            });
        }, function () {
            console.log("File not found: ");
        });
    }

Если вы используете WKWebView, есть только вариант, который вы настраиваете локальный http веб-сервер и затем получаете к нему доступ через http://localhost/...

К сожалению, "cdvfile" не работает для WKWebView.

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