2012-09-19 4 views
24

Ich habe eine App, die ein einfaches Lehrbuch navigator.geoLocation.watchPosition (...), die in iOS 5.x sowohl in Safari funktioniert und als Web-App (mit Apple-Mobile-Web-App-fähigen Meta-Tag).iOS 6 breaks GeoLocation in Webapps (apple-mobile-web-app-fähig)

In iOS6 funktioniert GeoLocation jedoch nicht in der Webanwendung. Es funktioniert immer noch in Safari wie erwartet, aber wenn ich die Webapp ausführen, fordert es mich für die Standortgenehmigung, dann im Hintergrund fehlschlägt. Ich sehe das Standortsymbol, aber keine Ereignisse werden von watchLocation ausgelöst. Ich erhalte keine Fehlerereignisse oder Standortereignisse.

Hat jemand in das hineingeraten? Irgendwelche Problemumgehungen? Es ist definitiv iOS6-spezifisch und auch spezifisch für die apple-mobile-web-app-fähige/webapp.

+0

Nur auf iOS 6.1.1 aktualisiert und das scheint immer noch ein Problem zu sein. – bjudson

Antwort

0

Ich habe das gleiche Problem. Sieht so aus, als ob watchPosition einfach ausfällt, nachdem die erste Position empfangen wurde. Ich habe noch keine Arbeit gefunden, aber ich wollte bestätigen, dass ich Probleme hatte.

diese Proben unter Verwendung von: http://www.w3schools.com/html/html5_geolocation.asp

ich erwartete Ergebnisse auf ios5 aber iOS6 lässt den Ball fallen mit watchPosition.

+0

Ich hebe das Problem im Apple-Entwicklerforum an, um zu sehen, ob jemand gute Informationen hat. – Morgan

+0

Ich habe gerade die obige URL von meinem Gerät aus besucht. Es läuft iOS 6 und wenn ich auf "Try It" klickte, wird eine Karte angezeigt. Sollte es etwas anderes tun? –

+0

Probieren Sie die unter Geolocation-Objekt - Andere interessante Methoden - und gehen Sie herum ... Was Sie sehen sollten, ist die Position Coords leicht verändert, wie Sie sich bewegen. – Morgan

13

Dies ist definitiv ein Fehler, aber ich habe eine Arbeit gefunden. Sie werden das nicht mögen, aber zumindest wird es Ihre Web-App wieder funktionieren lassen. Sie müssen die User-Agent-Header prüfen und, wenn es „iPhone OS 6“ enthält dann nicht verwenden:

<meta content="yes" name="apple-mobile-web-app-capable" /> 

Ja, das bedeutet, dass es nicht um eine echte Web-App wird und Sie erhalten die Safari-Header erhalten und Fußzeilen. Aber zumindest wird Ihre App vom Home-Bildschirm aus wieder funktionieren. Sie können sehen, wie dies funktioniert, indem Sie auf meine Website www.nextbus.com gehen.

Beachten Sie, dass es scheint, dass Google auf dieses Problem stieß. Versuchen Sie, zu maps.google.com gehen und dann die Web-App zu Ihrem Homescreen hinzufügen. Die Geolocation wird dafür funktionieren, aber Sie werden tatsächlich die hässlichen Safari Kopf- und Fußzeilen sehen.

Bitte beschweren Sie sich lautstark bei Apple!

+1

Ja - das habe ich vorerst getan - ich habe gerade den Apple-Mobile-Web-App-fähigen Meta-Tag entfernt. Obwohl Geolocation jetzt funktioniert, bekomme ich nicht die visuellen Vorteile einer echten Chrome-Web-App. Ich vermute, viele andere werden in den nächsten Tagen darüber stolpern. Danke für Ihren Vorschlag. –

0

Ich kann bestätigen, dass ich das gleiche Problem beim Ausführen meiner Web App im Vollbildmodus bekomme.

Interessanterweise, als Safari im Vollbildmodus die Erlaubnis zur Nutzung meines Standortes beantragte, war der Titel der Website "web" und nicht der Titel der Website, wie in früheren Versionen von iOS.

Entfernen Sie den "Apple-Mobile-Web-App-fähigen" Meta-Tag ist in Ordnung, und es funktioniert, aber nur, wenn Sie wieder auf "Homescreen" hinzufügen. Wir haben ~ 7000 tägliche Benutzer, die unser Symbol bereits zu ihrem Homescreen hinzugefügt haben. Sie dazu zu bringen, es wieder zu tun, dann möglicherweise wieder, wenn eine Lösung herbeigeführt wird, ist nicht groß.

1

Es scheint, es funktioniert nur einmal, dann alle sekundären Anrufe fehlschlagen. Eine Alternative besteht darin, das Ergebnis zwischenzuspeichern und das zwischengespeicherte Ergebnis zu verwenden, wenn Sie eines haben. Dies bedeutet jedoch, dass Sie keine App haben können, die der Position von jemandem folgt.

1

Dies ist nicht genau eine Antwort, da es scheint, dass Home-Screen-Apps in ios6 einen Fehler im Zusammenhang mit GeoLocation haben, aber ich fand den folgenden Link sehr hilfreich. Es wird erklärt, dass Home-Screen-Apps jetzt wie native Apps gespeichert sind und ihr eigenes Storage/Caching haben.

Geolocation funktioniert bei der ersten Iteration, wird jedoch nicht aktualisiert.Das Problem besteht darin, das folgende Meta-Tag zu entfernen, damit die Home Screens-App im Browser-Modus ausgeführt wird (ich bin mir nicht sicher, ob es sich genau um einen Browser-Modus handelt). Die App wird leider mit den Kopf- und Fußzeilen des Browsers gerendert, aber GeoLocation wird wieder funktionieren.

<meta content="yes" name="apple-mobile-web-app-capable" />

iOS 6 Geolocation and Local Data Storage

„Data in Home Screen Apps jetzt wie native Anwendungen gespeichert sind. Native Anwendungen haben jeweils ihre eigenen Sandbox, wo ihre Daten gespeichert sind, gesichert und wiederhergestellt. Vor iOS 6, Home-Screen-Apps gaben Daten mit derselben App im Browser frei Wenn der Benutzer den Cache im Browser löschte, verlor die Home-Bildschirm-Version der App ebenfalls ihre Daten.Mit iOS 6 werden die Daten der Home-Bildschirm-Apps abgerufen Wie eine native Anwendung werden die Daten in einer Sandbox gespeichert, während Sicherungen und Wiederherstellungen die Daten ordnungsgemäß verarbeiten und der Cache im Browser nicht gelöscht wird beeinflusse sie. "

2

Hier ist ein Video von mir repliziert den Fehler und demonstriert eine Arbeit um. Dieser Fehler scheint zu existieren, wenn Sie das Web-App-Meta-Tag verwenden oder nicht.

http://youtu.be/ygprgHh6LxA

Update: 121212 - IOS 6.1 Beta 3 Testen der Bug zeigt noch nicht behoben ...

Update: 122012 - IOS 6.1 Beta 4 Testen der Bug zeigt noch nicht behoben wird ..


Update:. 031113 - Replizierung Beispiel

okay, es ist Ein einfaches Problem, das in wenigen Sekunden repliziert werden kann. Ich denke, es ist keine Safari, sondern ein IOS-Problem. Es ist fast so, als ob Google das BIOS für das IOS geschrieben hätte, um die WC3-Html-Geo-Location-Spezifikation zu erfüllen, und es mitgenommen hätte, als IOS6 sie aus dem Bus geworfen hat. ein iOS-Gerät verwenden Sie hier:

http://uc.myaesc.com/geoloctestorig.htm

Klicken Sie auf Start, Uhren Ergebnis fast jeder zweite zurückkehren. Klicken Sie dann auf den Google-Link, um diese Seite zu verlassen. Dann Benutzer-Browser zurück, um zurückzukehren Klicken Sie auf Start. Uhr wird 1 bis 3 Datensätze zurückgeben und hängen. Safari minimieren (Home-Taste) und dann wiederherstellen (Safari-Icon); hört auf zu hängen

Das ist es. bis es nicht hängt, bleibt das Problem bestehen.

Mark

UPDATE:

IOS 7.1 das Problem behoben ...

+0

Link scheint gebrochen zu sein –

3

Die gute Nachricht ist: Ich habe es getan habe ... Ich habe es herausgefunden. Die schlechte Nachricht ist: Jemand, der schlauer ist als ich, wird Ihnen sagen müssen, warum das funktioniert, während jede andere Variante dieser Lösung oder einer der anderen angebotenen Lösungen nicht funktioniert. Das war ein hart umkämpfter Sieg, aber es ist mir zu peinlich, zu sagen, wie viele Stunden (Tage) ich brauchte, um das herauszufinden.Ohne weitere Umschweife:

if (window.navigator.geolocation) { 

      var accuracyThreshold = 100, 
      timeout = 10 * 1000, 
      watchID = navigator.geolocation.watchPosition(function(position) { 
       $('#latitude').val(position.coords.latitude); // set your latitude value here 
       $('#longitude').val(position.coords.longitude); // set your longitude value here 

       // if the returned distance accuracy is less than your pre-defined accuracy threshold, 
       // then clear the timeout below and also clear the watchPosition to prevent it from running continuously 
       position.coords.accuracy < accuracyThreshold && (clearTimeout(delayClear), navigator.geolocation.clearWatch(watchID)) 
      }, function(error) { 

       // if it fails to get the return object (position), clear the timeout 
       // and cancel the watchPosition() to prevent it from running continuously 
       clearTimeout(delayClear); 

       navigator.geolocation.clearWatch(watchID); 

       // make the error message more human-readable friendly 
       var errMsg; 

       switch (error.code) { 
        case '0': 
         errMsg = 'Unknown Error'; 
         break; 
        case '1': 
         errMsg = 'Location permission denied by user.'; 
         break; 
        case '2': 
         errMsg = 'Position is not available'; 
         break; 
        case '3': 
         errMsg = 'Request timeout'; 
         break; 
       } 
      }, { 
       enableHighAccuracy: true, 
       timeout: timeout, 
       maximumAge: 0 
      }), 
      delayClear = setTimeout(function() { 
       navigator.geolocation.clearWatch(watchID); 
      }, timeout + 1E3); // make this setTimeout delay one second longer than your watchPosition() timeout 
     } 
     else { 
      throw new Error("Geolocation is not supported."); 
     } 

Hinweis: aus irgendeinem Grund, dies scheint nicht so konsequent, wenn die Ausführung dieses Codes zu arbeiten, um es zu einem bestimmten Zeitpunkt verzögert, nachdem zunächst die App zu starten. Also, das ist die erste Sache, die ich in meiner Initialisierungsmethode ausführe.

Hinweis: Die einzige andere Sache, die ich meiner App hinzugefügt habe, ist, wenn ich die Geolocation-Daten verwenden muss (was für mich nach der Initialisierung von mehreren anderen Klassen/Objektliteralen stattfindet) für die Breiten-/Längenwerte. Wenn sie existieren, fahre fort; Wenn nicht, führen Sie die obige Geolocation-Methode erneut aus und fahren Sie fort.

Hinweis: Eines der Dinge, die mich für eine lange Zeit warf war, dass ich nur die aktuelle Position des Benutzers erhalten musste. Ich musste die Bewegungen der Benutzer nicht verfolgen. Ich habe verschiedene Wiederholungen mit der Methode getCurrentPosition() versucht. Aus irgendeinem Grund funktioniert es nicht. Also, das ist die Lösung, die mir einfällt. Führen Sie es so aus, als würden Sie den Standort des Benutzers verfolgen (um seinen Standort an erster Stelle zu erhalten), und löschen Sie die watchPosition-ID, sobald sie ihren Standort erreicht hat, damit sie nicht mehr verfolgt wird. Wenn Sie ihren Standort im Laufe der Zeit verfolgen müssen, können Sie natürlich die watchPosition ID nicht löschen.

HTH. Nach allem, was ich gelesen habe, gibt es viele Entwickler, die diese Funktionalität für ihre unternehmenskritischen Anwendungen benötigen. Wenn diese Lösung für Sie nicht funktioniert, bin ich nicht sicher, welche andere Richtung ich geben kann. Nachdem ich das gesagt habe, habe ich das mehrere hundert Mal getestet und dies hat erfolgreich den Standort der Benutzer in einer WebApp (navigator.standalone) auf iOS 6 abgerufen.

+0

das ist super! Da ioS 6.1 mit Geolocation immer noch fehlerhaft ist, hat jemand ein Beispiel dafür, dass es im WatchPosition-Modus läuft? – ajayel

0

Dies scheint unter iOS 6.1 behoben zu sein! Es war nicht in den letzten Betas, aber die heutige Version 6.1 scheint gut mit meinen Tests zu sein.

+0

Ok - es ist nicht 100% behoben. Ich erhalte ein erstes Location-Event, das vor 6.1 nicht stattgefunden hat, aber ich bekomme keine Folge-Events aus der Watchlocation. Ich bekomme nur den ersten. Ich werde an alternativen Lösungen arbeiten und komme bald wieder auf diesen Thread zurück (ich bin das Original-Poster) –

+0

Mit iOS 6.1 auf meinem iPhone 4s kann ich watchPosition nur zuverlässig bekommen, wenn WLAN beim Starten meiner Web-App ausgeschaltet ist . – ajayel

0

scheint in iOS 6.1 endgültig behoben zu sein! Siehe meine Website www.slople.com wo es wieder funktioniert unter 6.1

0

Dies ist endlich in iOS7 Beta behoben (Beta 2 ist alles, was ich getestet habe)!

0

Sie müssen auf nicht sichere Inhalte achten. Für mich laden alle Javascript, Bilder und CSS aus dem sicheren Kontext löste das Problem mit Safari.