iOS 6 brise la géolocalisation dans les applications Web (apple-mobile-Web-capable)

j'ai une application qui fait un navigateur manuel simple.la géolocalisation.watchPosition(...) qui fonctionne très bien sous iOS 5.x à la fois en Safari et en tant qu'application web (en utilisant la balise meta apple-mobile-web-App-capable).

cependant, dans iOS6, la géolocalisation ne fonctionne pas dans la webapp. Il fonctionne toujours en safari comme prévu, mais quand je lance le webapp, il me demande la permission de localisation, puis échoue silencieusement. Je vois l'icône de localisation, mais aucun événement n'est jeté de guetlocation. Je n'obtiens pas d'événements d'erreur ou tout événement de localisation.

quelqu'un A courir dans tout cela? Aucune solution de contournement? Il est certainement iOS6 spécifique et également spécifique à la apple-mobile-Web-capable/webapp.

24
demandé sur ThinkingStiff 2012-09-20 02:31:58
la source

11 ответов

c'est définitivement un bug mais j'ai trouvé un travail autour. Vous n'allez pas aimer cela, mais au moins il obtiendra votre application web fonctionne à nouveau. Vous devez examiner l'en-tête User Agent et si elle contient "iPhone OS 6" alors ne pas utiliser:

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

Oui, cela signifie que ce ne sera pas une vraie application web et vous obtiendrez les barres D'en-tête et de pied de page Safari. Mais au moins, il fera à nouveau fonctionner votre application à partir de l'écran d'accueil. Vous pouvez voir comment cela fonctionne en allant sur mon site www.nextbus.com.

notez qu'il semble que Google ait rencontré ce problème. Essayez d'aller à maps.google.com et ensuite ajouter l'application web à votre écran d'accueil. La géolocalisation fonctionnera pour elle, mais vous verrez en effet l'en-tête Safari laid et les barres de pied de page.

s'il vous Plaît se plaindre bruyamment Apple!

13
répondu Michael Smith 2012-09-20 17:25:46
la source

la bonne nouvelle est: je l'ai fait... J'ai pensé à elle. La mauvaise nouvelle est que quelqu'un de plus intelligent que moi va devoir vous dire pourquoi cela fonctionne, alors que toute autre variante de cette solution ou l'une des autres solutions proposées ne fonctionne pas. Ce fut une victoire difficile, mais je suis trop gêné pour dire combien d'heures (jours) il m'a fallu pour comprendre cela. Sans plus tarder:

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.");
        }

Note: pour une raison quelconque, cela ne semble pas fonctionner de manière aussi cohérente que si l'exécution de la présente le code de retard à un certain point, après un premier lancement de l'application. Donc, c'est la première chose que j'exécute dans ma méthode d'initialisation.

Note: la seule autre chose que j'ai ajoutée à mon application est, quand j'ai besoin d'utiliser les données de géolocalisation (qui, pour moi, a lieu après l'initialisation de plusieurs autres Classes/objets littéraux), de vérifier les valeurs de latitude/longitude. Si elles existent, continuer; sinon, exécutez la géolocalisation méthode, puis passez.

Note: Un des choses qui m'a jeté longtemps que je n'avais besoin d'obtenir la position actuelle de l'utilisateur. Je n'ai pas besoin de suivre la navigation des utilisateurs. J'ai continué à essayer différentes itérations de ceci avec la méthode getCurrentPosition (). Pour quelque raison que ce soit, il ne fonctionne pas. Donc, c'est la solution que j'ai trouvé. Exécutez-le comme vous allez suivre l'emplacement des utilisateurs (pour obtenir leur emplacement en premier lieu), puis une fois que vous avez obtenu leur emplacement, effacer l'ID de watchPosition pour l'empêcher de suivi de ceux-ci. Si vous avez besoin de suivre leur localisation, car il change au fil du temps, vous pouvez bien entendu... pas clair le watchPosition ID.

HTH. De tout ce que j'ai lu, il y a beaucoup de développeurs qui ont besoin de cette fonctionnalité pour travailler pour leurs applications critiques. Si cette solution ne fonctionne pas pour vous, Je ne suis pas sûr de quelle autre direction je peux donner. Cela dit, j'ai testé cela plusieurs centaines de fois et cela récupère avec succès l'emplacement des utilisateurs dans une WebApp (Navigator.standalone) sur iOS 6.

3
répondu Matt Bontrager 2013-01-19 05:11:36
la source

voici une vidéo de moi reproduisant le bug et démontrant un travail autour. Ce bug semble exister que vous utilisiez ou non la balise meta de l'application web.

http://youtu.be/ygprgHh6LxA

mise à jour: 121212 - IOS 6.1 Le test bêta 3 montre que le bogue n'est toujours pas résolu...

mise à jour: 122012 - iOS 6.1 Beta 4 testing montre que le bogue n'est toujours pas résolu...


Mise À Jour: 031113-Réplication Exemple

OK, c'est un problème simple à reproduire en quelques secondes. Je pense que ce n'est pas un safari, mais un problème D'IOS. C'est presque comme si Google avait écrit le bios de l'IOS pour répondre à la spécification de géolocalisation html WC3 et l'avait pris avec lui quand IOS6 l'avait viré du bus. À l'aide d'un appareil IOS, allez ici:

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

cliquez sur Démarrer, regardez devrait retourner le résultat presque chaque seconde. Puis cliquez sur le lien Google pour quitter cette page. Puis navigateur de l'utilisateur bouton retour Cliquez sur démarrer. Watch retournera 1 à 3 disques et hang. Minimisez safari (bouton d'accueil) puis restaurez (icône de safari); arrêtez de pendre

c'est tout. tant qu'elle n'est pas suspendue, la question demeure.

Marque

mise à jour:

IOS 7.1 correction du problème...

2
répondu MarkM 2014-11-21 05:23:18
la source

Il semble qu'il ne fonctionne qu'une fois, alors secondaire échouent. Une alternative est de mettre en cache le résultat et d'utiliser le résultat mis en cache si vous en avez un, bien que cela signifie que vous ne pouvez pas avoir une application qui suit la position de quelqu'un.

1
répondu Rob Porter 2012-09-28 23:56:08
la source

ce n'est pas vraiment une réponse car il semble que Home Screen apps dans ios6 ait un bug lié à la géolocalisation, mais j'ai trouvé le lien suivant très utile. Il explique que comme les applications D'écran D'accueil sont maintenant stockées comme les applications natives, ils ont leur propre stockage/cache.

La géolocalisation fonctionne sur la première itération mais ne parvient pas à mettre à jour à partir de là. le travail consiste à supprimer la balise meta suivante afin que L'application Home Screens s'exécute en mode Navigateur (Je ne suis pas sûr que ce soit exactement un Mode navigateur). L'application va malheureusement rendre avec les en-têtes et les pieds de page du navigateur, mais la géolocalisation fonctionnera à nouveau.

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

iOS 6 de la Géolocalisation et des Locaux de Stockage de Données

"les Données dans l'Écran d'Accueil des applications sont maintenant stockées comme des applications natives. Les applications natives ont chacun leur propre bac à sable où leurs données sont stockées, sauvegardés et restaurés. Avant iOS 6, Home Screen apps partageait des données avec la même application fonctionnant dans le navigateur. Si l'utilisateur effaçait le cache dans le navigateur, la version écran D'accueil de l'application perdrait aussi ses données.Avec iOS 6, Les données de Home Screen apps sont sauvegardées dans un bac à sable comme les applications natives. Les sauvegardes et les restaurations gèrent les données correctement, et effacer le cache dans le navigateur ne les affectera pas."

1
répondu Anit Lacoul 2012-10-04 19:27:04
la source

j'ai le même problème. Ressemble watchPosition est tout simplement faute de après les première position est reçu. Je n'ai pas encore trouvé de travail, mais je voulais confirmer que j'avais des problèmes.

en utilisant ces échantillons: http://www.w3schools.com/html/html5_geolocation.asp

j'obtiens les résultats attendus sur ios5 mais ios6 laisse tomber la balle avec la position de la montre.

0
répondu Morgan 2012-09-20 02:44:30
la source

je peux confirmer que j'ai le même problème lorsque j'exécute mon application web en plein écran.

fait intéressant, lorsque Safari En Plein écran a demandé la permission d'utiliser mon emplacement, le titre du site Web était " web " plutôt que le titre du site web, comme dans les versions précédentes de iOS.

supprimer la balise meta" apple-mobile-web-App-capable "est très bien, et cela fonctionne, mais seulement si vous" ajoutez à Homescreen " à nouveau. Nous avons ~7000 utilisateurs quotidiens qui ont déjà ajouté notre icône à leur écran d'accueil. Ce n'est pas génial de les faire recommencer, puis potentiellement recommencer quand une dose est appliquée.

0
répondu Gers 2012-09-28 14:59:00
la source

ceci semble être corrigé sous iOS 6.1! Ce n'était pas dans les récentes bêtas, mais la version finale d'aujourd'hui semble être bonne avec mes tests.

0
répondu Greg Wilson 2013-01-29 09:26:48
la source

semble être fixé dans iOS 6.1, enfin! Voir mon site www.slople.com là où il fonctionne à nouveau sous 6.1

0
répondu Raphael Jeger 2013-01-30 16:08:45
la source

c'est enfin corrigé dans iOS7 beta (beta 2 est tout ce que j'ai testé)!

0
répondu Greg Wilson 2013-07-05 03:17:54
la source

vous devez vous occuper du contenu non sécurisé chargé. Pour moi, le chargement de tout javascript, images et css depuis secure context a résolu le problème avec safari.

0
répondu jlbofh 2017-09-13 14:01:16
la source