Событие Cordova filePluginIsReady никогда не запускается в iOS с помощью cordova-plugin-file
Я отлаживал работу с постоянными данными в течение нескольких недель... и я думаю, что наконец-то нашел * часть проблемы.
Большинство моих тестов работают на платформе браузера в Chrome 59 на Windows 10, но я также создаю свое приложение с помощью Phonegap Build и устанавливаю его на моем iPhone (iOS 10.3.2).
Согласно пристрастиям Cordova doc's Chrome:
Файловая система Chrome не сразу готова после события готовности устройства. В качестве обходного пути вы можете подписаться на событие filePluginIsReady. Пример:
window.addEventListener('filePluginIsReady', function(){ console.log('File plugin is ready');}, false);
Ты можешь использовать
window.isFilePluginReadyRaised
функция, чтобы проверить, было ли событие уже возбуждено.
Я не смог заставить работать обработчик событий filePluginIsReady, поэтому в конце концов попытался console.logging window.isFilePluginReadyRaised
и, конечно же, это ложно!
В отчаянии я попытался добавить таймер
setTimeout(function(){
console.log('filePluginIsReady: ' + window.isFilePluginReadyRaised());
consol.append(document.createElement("br"));
consol.append('filePluginIsReady: ', window.isFilePluginReadyRaised());
}, 5000);
И я получаю правду! Я попытался снизить его до 1000 мс, и он все еще работает, но без тайм-аута я получаю ложь. Я добавляю журнал консоли к элементу dom, чтобы отладить это на своем телефоне, что приводит меня к проблеме: я ничего не получаю...
Я получаю красивое зеленое "устройство готово", но через пять секунд моя "консоль" остается пустой. Нет результата от window.isFilePluginReadyRaised()
Мой HTML
<div class="app">
<h1>Apache Cordova</h1>
<div id="deviceready" class="blink">
<p class="event listening">Connecting to Device</p>
<p class="event received">Device is Ready</p>
</div>
<h3>Console:</h3>
<pre id='consol'></pre>
</div>
<script type="text/javascript" src="cordova.js"></script>
<script type="text/javascript" src="dist/build.js"></script>
JS
var app = {
initialize: function () {
document.addEventListener('deviceready', this.onDeviceReady.bind(this), false);
},
onDeviceReady: function () {
this.receivedEvent('deviceready');
setTimeout(function(){
console.log(cordova.file);
console.log('filePluginIsReady: ' + window.isFilePluginReadyRaised());
consol.append(document.createElement("br"));
consol.append('filePluginIsReady: ', window.isFilePluginReadyRaised());
}, 5000);
},
receivedEvent: function (id) {
var parentElement = document.getElementById(id);
var listeningElement = parentElement.querySelector('.listening');
var receivedElement = parentElement.querySelector('.received');
listeningElement.setAttribute('style', 'display:none;');
receivedElement.setAttribute('style', 'display:block;');
console.log('Received Event: ' + id);
},
};
app.initialize();
config.xml
<?xml version='1.0' encoding='utf-8'?>
<widget id="io.cordova.hellocordova" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>HelloCordova</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<preference name="iosPersistentFileLocation" value="Library" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
<engine name="browser" spec="^4.1.0" />
<plugin name="cordova-plugin-file" spec="^4.3.3" />
<plugin name="cordova-plugin-whitelist" spec="^1.3.2" />
</widget>
Изменить: я обнаружил, что моя структура файла, возможно, был неправильным. Phonegap указывает, что конфиг должен быть в каталоге www, в то время как мой был на уровень выше. Исправление этого не решило проблему. Я также проверил журналы PhoneGap Build:
--------------------------------------------------------------------------------
PLUGIN OUTPUT
--------------------------------------------------------------------------------
Fetching plugin "cordova-plugin-file@^4.3.3" via npm
Installing "cordova-plugin-file" at "4.3.3" for ios
Fetching plugin "cordova-plugin-compat" via npm
Installing "cordova-plugin-compat" at "1.1.0" for ios
Fetching plugin "cordova-plugin-whitelist@^1.3.2" via npm
Installing "cordova-plugin-whitelist" at "1.3.2" for ios
1 ответ
Обновленный ответ, после прочтения вопроса чуть ближе:)
Ссылка "Плагин файла" упоминает: "Файловая система Chrome не готова сразу после события готовности устройства". В предоставленном вами примере кода вы подключаетесь к событию "deviceready", но, как отмечают документы, это не будет работать для Google Chrome, но должно работать для iOS (браузер Safari). Чтобы немного подправить мой оригинальный ответ:
Попробуйте как можно скорее зарегистрировать события "filePluginIsReady" и "deviceready", подключив его к методу "onload" тега HTML body:
<body onload="initialize();">
<div class="app">
<!-- all other html -->
</div>
<script type="text/javascript">
function onFilePluginReady() {
// use file plugin
console.log("onFPReady: " + cordova.file);
}
function onDeviceReady() {
// use file plugin - iOS or other mobile platforms
console.log("onDeviceReady: " + cordova.file);
}
function initialize() {
// special event for Google Chrome (Android)
document.addEventListener('filePluginIsReady', onFilePluginReady, false);
// event for iOS and others
document.addEventListener("deviceready", onDeviceReady, false);
}
</script>
</body>