Подтвердить что ты не робот

IOS 6 разбивает GeoLocation в webapps (apple-mobile-web-app-able)

У меня есть приложение, которое делает простой учебник navigator.geoLocation.watchPosition(...), который отлично работает в iOS 5.x как в Safari, так и в качестве веб-приложения (используя мета-приложение apple-mobile-web-app-meta тег).

Однако в iOS6 GeoLocation не работает в webapp. Он по-прежнему работает в сафари, как и ожидалось, но когда я запускаю webapp, он запрашивает у меня разрешение на размещение, а затем бесшумно терпит неудачу. Я вижу значок местоположения, но никаких событий не выбрасывается из watchLocation. Я не получаю никаких сообщений об ошибках или каких-либо событий местоположения.

Кто-нибудь сталкивался с этим? Любые обходные пути? Это определенно iOS6 специфично, а также специфично для Apple-mobile-web-app-able/webapp.

4b9b3361

Ответ 1

Это определенно ошибка, но я нашел работу. Вам это не понравится, но, по крайней мере, он снова заработает ваше веб-приложение. Вам нужно изучить заголовок User Agent, и если он содержит "iPhone OS 6", то не используйте:

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

Да, это означает, что это не будет истинное веб-приложение, и вы получите заголовки и верхние колонтитулы Safari. Но, по крайней мере, это заставит ваше приложение снова работать с главного экрана. Вы можете увидеть, как это работает, перейдя на мой сайт www.nextbus.com.

Обратите внимание, что, похоже, Google столкнулся с этой проблемой. Попытайтесь перейти к maps.google.com, а затем добавьте веб-приложение на свой рабочий стол. Геолокация будет работать для него, но вы действительно увидите уродливые верхние и нижние колонтитулы Safari.

Пожалуйста, громко пожаловаться Apple!

Ответ 2

Хорошая новость: я сделал это... Я понял это. Плохая новость: кто-то умнее меня, должен сказать вам, почему это работает, тогда как любые другие варианты этого решения или любые другие предлагаемые решения не работают. Это была тяжелая победа, но я слишком смущен, чтобы сказать, сколько часов (дней) потребовалось мне, чтобы понять это. Без дальнейших церемоний:

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

Примечание. По какой-то причине это не работает так последовательно, если выполнение этого кода задерживается в какой-то момент после первоначального запуска приложения. Итак, это ПЕРВАЯ вещь, которую я выполняю в моем методе инициализации.

Примечание. Единственное, что я добавил в мое приложение: когда мне нужно использовать данные геолокации (которые для меня происходят после инициализации нескольких других классов/объектов литералов), необходимо проверить значения широты/долготы. Если они существуют, продолжайте; Если нет, повторите описанный выше метод геолокации, затем продолжите.

Примечание. Одна из вещей, которые меня давно забросали, заключалась в том, что мне нужно было только получить текущую позицию пользователя. Мне не нужно было отслеживать движения пользователей. Я продолжал пробовать разные итерации этого метода getCurrentPosition(). По какой-то причине это не сработает. Итак, это решение, с которым я столкнулся. Запустите его, как вы собираетесь отслеживать местоположение пользователей (чтобы получить их местоположение в первую очередь), а затем, как только вы получили свое местоположение, очистите идентификатор watchPosition, чтобы он не отслеживал их. Если вам нужно отслеживать их местоположение, поскольку оно изменяется со временем, вы можете, конечно... не очистить идентификатор watchPosition.

НТН. Из всего, что я читал, есть много разработчиков, которым нужна эта функциональность для работы в своих критически важных приложениях. Если это решение не сработает для вас, я не уверен, какое другое направление я могу дать. Сказав это, я проверил это несколько сотен раз, и это успешно находит местоположение пользователей в WebApp (navigator.standalone) на iOS 6.

Ответ 3

вот видео, в котором я реплицирую ошибку и демонстрирую работу. Кажется, что эта ошибка существует, когда вы используете метатег веб-приложения или нет.

http://youtu.be/ygprgHh6LxA

Обновление: 121212 - тестирование IOS 6.1 Beta 3 показывает, что ошибка все еще не устранена...

Обновление: 122012 - тестирование IOS 6.1 Beta 4 показывает, что ошибка все еще не устранена...


Обновление: 031113 - Пример репликации

Хорошо, это простая проблема для репликации всего за несколько секунд. Я считаю, что это не сафари, а проблема IOS. Его почти так, как если бы Google написал биос для IOS, чтобы встретить спецификацию местоположения геоданных WC3 html и взял его с собой, когда IOS6 вышвырнул их с шины. Использование устройства IOS можно найти здесь:

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

Нажмите "Старт", часы должны возвращать результат почти каждую секунду. Затем нажмите ссылку Google, чтобы выйти из этой страницы. Затем верните кнопку возврата браузера Нажмите "Пуск". Часы возвратят от 1 до 3 записей и повесят. Минимизация сафари (кнопка "домой" ), а затем восстановление (значок сафари); перестает висит

Что это. пока он не зависает, проблема остается.

Марк

UPDATE:

IOS 7.1 исправил проблему...

Ответ 4

Кажется, что он работает только один раз, тогда любые вторичные вызовы терпят неудачу. Один из вариантов заключается в кэшировании результата и использовании кэшированного результата, если он у вас есть, хотя это означает, что у вас не может быть приложения, которое следует за кем-то.

Ответ 5

Это не совсем так, как кажется, что в приложениях для Home Screen в ios6 есть некоторая ошибка, связанная с GeoLocation, но я нашел следующую ссылку очень полезной. В нем объясняется, что, поскольку приложения для Home Screen теперь хранятся как родные приложения, у них есть собственное хранилище/кеширование.

Геолокация работает на первой итерации, но с тех пор не обновляется. работа вокруг заключается в том, чтобы удалить следующий метатег, чтобы приложение "Домашние экраны" запускалось в режиме браузера (я не уверен, что он точно вызывает режим браузера). Приложение, к сожалению, сделает с верхними и нижними колонтитулами браузера, но GeoLocation снова будет работать.

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

iOS 6 Геолокация и локальное хранение данных

"Данные в приложениях" Домашний экран "теперь хранятся как родные приложения. В собственных приложениях есть свои собственные песочницы, где хранятся, архивируются и восстанавливаются их данные. До IOS 6 приложения для домашних приложений совместно используют одно и то же приложение в браузере. Если пользователь очистил кеш в браузере, версия главного экрана приложения также потеряет свои данные. С iOS 6 данные приложений на экране" Домашний экран "сохраняются в песочнице, как и в случае с родными приложениями. Резервные копии и восстановление данные корректно, и очистить кеш в браузере не повлияет на них."

Ответ 6

У меня такая же проблема. Похоже, что watchPosition просто выходит из строя после получения первой позиции. Я еще не нашел работу, но я хотел подтвердить, что у меня возникают проблемы.

Используя эти образцы: http://www.w3schools.com/html/html5_geolocation.asp

Я получаю ожидаемые результаты на ios5, но ios6 сбрасывает мяч с помощью watchPosition.

Ответ 7

Я могу подтвердить, что у меня такая же проблема при запуске моего веб-приложения в полноэкранном режиме.

Интересно, что, когда Safari в полноэкранном режиме попросил разрешения использовать мое местоположение, название сайта было "веб", а не названием веб-сайта, как в предыдущих версиях iOS.

Удаление метатега "apple-mobile-web-app-able" отлично, и оно работает, но только если вы снова добавите "Добавить в Homescreen". У нас ~ 7000 ежедневных пользователей, которые уже добавили наш значок на свой рабочий стол. Как заставить их делать это снова, а затем потенциально снова, когда исправление будет имплантировано, не является большим.

Ответ 8

Это, похоже, исправлено в iOS 6.1! Это было не в последних бета-версиях, но сегодня окончательный выпуск 6.1, похоже, хорош с моим тестированием.

Ответ 9

похоже, исправлено в iOS 6.1, наконец! См. Мой сайт www.slople.com, где он снова работает под 6.1

Ответ 10

Это окончательно исправлено в бета-версии iOS7 (бета-2 - это все, что я тестировал)!

Ответ 11

Вы должны позаботиться о загруженном небезопасном содержимом. Для меня загрузка всех javascript, изображений и css из безопасного контекста решила проблему с сафари.