2015-06-18 5 views
7

Ich hatte einen wirklich seltsamen Bug wo Deviceready Ereignis würde nicht in einem iOS-Gerät ausgelöst, bis der Benutzer mit dem Betriebssystem selbst interagiert, das ist, drücken Sie die vordere Taste, zeigen Sie die Benachrichtigungszentrale mit der Maus nach unten ziehen oder zu den Geräteeinstellungen ziehen.Cordova Deviceready nicht feuern in iOS bis zur Interaktion mit iOS

Sobald der Benutzer das iOS-Benachrichtigungscenter gezogen hat, wurde das Gerät ausgelöst.

Etwas so einfach wie das funktionieren würde einfach nicht:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="utf-8" /> 
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width" /> 
    <meta http-equiv="Content-Security-Policy" content="default-src 'self' data:* gap:* tel:* 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'" /> 

    <title></title> 

    <!-- cordova script (this will be a 404 during development) --> 
    <script src="cordova.js"></script> 
</head> 

<body> 
    <div id="log"></div> 

    <script type="text/javascript"> 
    var log = document.getElementById("log"); 
    if(window.cordova){ 
     log.innerHTML = "with cordova"; 
     document.addEventListener("deviceready", function onDeviceReady(){ 
      log.innerHTML = "deviceready"; 
     }, false); 
    }else{ 
     log.innerHTML = "with browser"; 
    } 
    </script> 
</body> 
</html> 

Antwort

18

Das Problem war wirklich subtil. Ich verbrachte etwa 4 Stunden Debugging iOS warum wurde cordova nicht feuern, bis ich ich gerade gesehen wurde zwei //, hier fehlt:

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

, dass kleine gap in Content-Sicherheitspolitik hatte zwei // vor haben, um es zu Arbeit. Dies löste meinen Fehler, ich verstehe immer noch nicht warum.

Hoffe, das hilft!

+1

vielen Dank, es auch hier behoben –

+0

Wow! Du hast meinen Tag gerettet ... Wo hast du ihn gefunden? Kannst du mehr Dokumentation über das gleiche bekommen? –

+1

@MalaySarkar Nein, ich war mir nicht sicher warum. Wie ich das gefunden habe, mit diesen 4 Stunden Debugging am Ende habe ich meine nicht funktionierende App auf das reduziert, was ich oben im Code hatte (Frageabschnitt) und habe versucht, sie mit einer neuen Cordova-App zu vergleichen, mit etwas Startkapital hatte dieses Content-Security-Plolicy-Tag. Wie für zusätzliche Dokumentation über dieses Tag, hier ist eine vollständige Antwort http://stackoverflow.com/questions/30280370/how-does-content-security-policy-work – olivarra1

0

Ich hatte das gleiche Problem auf iOS. Schließlich eine dieser beiden Abhilfen arbeitete für

  1. <meta http-equiv="Content-Security-Policy".......> indizieren hinzufügen.

  2. Herunterstufung Plattform 4.0.0 (Cordova Plattform Update [email protected])

die erste Option ausüben wird bevorzugt als zu 4.0.0 Herabstufung Sie wahrscheinlich nicht bevorzugt ist.

+0

Die Ursache des Problems ist, dass Sie "gap: // *" in Ihrer Inhaltssicherheitsrichtlinie auf die weiße Liste setzen müssen. Das Downgrade auf 4.0.0 funktioniert, weil die Whitelist auf andere veraltete Weise verwaltet wird. – olivarra1

+0

Ich verwende Cordova 4.4.0 für iOS. Ich habe versucht, Meta für Content-Security-Policy hinzuzufügen und auch zu entfernen. Es ruft während der Ladung nicht an. Wenn ich stattdessen den Home-Button drücke, hat es gefeuert. Gleiches Projekt, es funktioniert für andere HTML. Nur ein bestimmter HTML-Code funktioniert nicht. Bitte verweisen Sie meine Frage - [link] https://stackoverflow.com/questions/47076208/deviceready-not-firing-in-cordova-app-on-ios/ Jede Hilfe sehr geschätzt. –