Helpers - компьютеры, интернет, программирование

deviceready не срабатывает в приложении Cordova на iOS

У меня есть index.html, где к тегу скрипта добавлен прослушиватель событий deviceready. Но он не запускается при загрузке HTML. Вместо этого при нажатии кнопки «Домой» он запускается из метода onAppDidEnterBackground в CDVViewController.

Я хотел вызвать свой собственный плагин, чтобы получить значения, которые я пытаюсь заполнить в загруженном HTML. Я нашел несколько решений с просьбой изменить метатег. Пробовал менять, но бесполезно. Он также не работает в iOS9. Я предполагаю, что проблема с метатегами связана с iOS10. Я не уверен, что мне здесь не хватает.

Кордова v4.4.0

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: http://* 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *; img-src 'self' data: content:;">
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
    <title>My HTML Document</title>
    <link rel="stylesheet" type="text/css" href="style.css" />
  <script type="text/javascript" src='cordova.js'></script>
    <script type="text/javascript" src='CustomPlugin.js'></script>
        <script>
        document.addEventListener('deviceready', function () {
            window.plugins.CustomPlugin.myMethod(function (result) {
                document.getElementById('Name').value = result['Name'];
            }, function (error) {
                alert(error);
            });
        }, false);
    </script>
</head>
<body>
    <div class='article'>
            <div class='tableWrapper'>
                <table>
                <tr>
                    <td class='right'>CName:</td>
                    <td colspan='3'><input type='text' id='Name'/></td>
                </tr>
                </table>
            </div>

    </div>

</body>
</html>
02.11.2017

  • Попробуйте использовать оповещение, чтобы проверить, запускается событие или нет. 02.11.2017
  • Неа. Это не так. Он срабатывает, когда я нажимаю кнопку «Домой»... 02.11.2017

Ответы:


1

Если у вас возникла та же проблема, что и у меня, то это связано с вашим метатегом content-security-policy. Я использовал приведенный ниже ответ из , и проблема решена.

<meta http-equiv="Content-Security-Policy" content="default-src 'self' data:* gap://* tel:* 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'" />
28.08.2018

2

Попробуйте поместить свой addEventListener в функцию onLoad и вызвать его с событием onload в теге body:

    function onLoad() {
    document.addEventListener("deviceready", onDeviceReady, false);
    }

    function onDeviceReady(){
           //the code you want to execute
    }

и

<body onload="onLoad()">

Потому что, если вы сделаете это по-своему, вы попытаетесь выполнить событие deviceready до загрузки библиотеки Cordova.

02.11.2017
  • Пробовал и это. Функция onLoad не вызывается, но и событие deviceready не срабатывает. :( 02.11.2017
  • Что, если вы поместите свой скрипт javascripts cordova.js в последнюю позицию, потому что он находится перед вашим customplugin.js, и когда срабатывает событие загрузки, cordova.js может быть загружен, но не ваш customplugin.js 03.11.2017
  • Я попытался добавить Cordova.js после customplugin.js. Это не работает. 03.11.2017
  • попробуйте выполнить эту команду в каталоге вашего проекта. Платформа Cordova. Удаление платформы ios. Cordova. Добавьте ios. 03.11.2017
  • Если что-то не так, оно вообще не должно вызывать событие deviceready, верно? Он срабатывает, когда теряет фокус, например, при нажатии кнопки «Домой», длительном нажатии, чтобы открыть Siri и т. д., 03.11.2017
  • Ломаю голову уже два дня. Перепробовал все возможные решения, доступные в инете. :( 03.11.2017
  • вы пробовали на простом примере? например, просто вызовите ondeviceready и предупредите («привет, мир!») в новом проекте. И правильно ли работает ваш метод? 03.11.2017
  • Это как родное приложение, так и приложение на основе Cordova. Какая-то часть родная, а какая-то кордовская. У меня проблема только с этим html файлом. В других областях работает нормально. 03.11.2017
  • Теперь запускается событие готовности устройства.. Но плагины не работают.. Пробовал изменить метатег.. Но безуспешно.. Есть мысли? 06.11.2017
  • Может быть, это потому, что ваш файл js не загружается, когда ваше устройство готово к работе, я бы посоветовал вам использовать jquery и поместить ваш addeventlistener в $(document).ready(function(){ }, это то, что я делал, когда мне было делаю кордову, и у меня никогда не было проблем 07.11.2017
  • Я использовал часть ответа из этой темы, когда начинал :) устройство телефонной щели готово"> stackoverflow.com/questions/12576062/ 07.11.2017

  • 3

    Загрузите весь свой скрипт внизу тела html

    <html lang="en">
    <head>...</head>
    <body>
      <div>Your content here</div>
      ...
      <script type="text/javascript" src='CustomPlugin.js'></script>
      <script type="text/javascript" src='cordova.js'></script>
      <script type="text/javascript" src='main.js'></script>
    </body>
    </html>
    

    и создайте файл main.js, затем поместите туда свой код.

    window.onload = function(){
        document.addEventListener("deviceready", firstInitCordova, true);
    };
    
    function firstInitCordova(){
        if(!window.cordova){
            // If cordova is not defined then call this function again after 2 second
            setTimeout(firstInitCordova, 2000);
            return;
        }
    
        //console.log(window.plugins);
        window.plugins.CustomPlugin.myMethod(function (result) {
            document.getElementById('Name').value = result['Name'];
        }, function (error) {
            alert(error);
        });
    }
    
    // If you're unsure then set a timer
    setTimeout(function(){
        firstInitCordova();
    }, 3000);
    
    03.11.2017
  • Я пробовал и твой способ. firstInitCordova вызывается только после перехода на задний план и перехода на передний план. 03.11.2017
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..