web-dev-qa-db-ja.com

iOS 6はwebappsのGeoLocationを壊します(Apple-mobile-web-app-capable)

SafariとWebアプリ(Apple-mobile-web-app-capableメタタグを使用)の両方でiOS 5.xでうまく機能する簡単な教科書navigator.geoLocation.watchPosition(...)を実行するアプリがあります。

ただし、iOS6では、GeoLocationはWebアプリでは機能しません。期待どおりにSafariでも機能しますが、webappを実行すると、場所の許可を求められ、サイレントに失敗します。ロケーションアイコンが表示されますが、watchLocationからイベントがスローされません。エラーイベントやロケーションイベントは発生しません。

誰かがこれに遭遇しましたか?回避策はありますか?これは間違いなくiOS6固有であり、Apple-mobile-web-app-capable/webappにも固有です。

24
Greg Wilson

これは間違いなくバグですが、回避策を見つけました。あなたはこれを気に入らないでしょうが、少なくともそれはあなたのウェブアプリを再び機能させるでしょう。 User Agentヘッダーを調べる必要があり、「iPhone OS 6」が含まれている場合は、以下を使用しないでください。

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

はい、これはそれが本当のWebアプリではなく、Safariのヘッダーとフッターバーが表示されることを意味します。ただし、少なくとも、ホーム画面からアプリが再び機能するようになります。私のサイト www.nextbus.com にアクセスすると、これがどのように機能するかを確認できます。

Googleがこの問題に遭遇したように見えることに注意してください。 maps.google.comに移動して、Webアプリをホーム画面に追加してみてください。地理位置情報はそれで機能しますが、実際には醜いSafariヘッダーとフッターバーが表示されます。

Appleに大声で文句を言ってください!

13
Michael Smith

良いニュースは:私はそれをやった...私はそれを理解した。悪いニュースは、私より賢い人がなぜこれが機能するのかを説明する必要があるのに対し、このソリューションの他のバリエーションや提供されている他のソリューションは機能しないということです。これは苦戦した勝利でしたが、これを理解するのに何時間(日)かかったかを言うのは恥ずかしいことです。難しい話は抜きにして:

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()メソッドを使用して、これをさまざまに繰り返してみました。何らかの理由で、それは機能しません。だから、これは私が思いついた解決策です。ユーザーの場所を追跡するように実行し(最初にユーザーの場所を取得するため)、ユーザーの場所を取得したら、watchPositionIDをクリアしてユーザーが追跡されないようにします。時間の経過とともに変化する場所を追跡する必要がある場合は、もちろん... watchPositionIDをクリアしないでください。

HTH。私が読んでいるすべてのことから、ミッションクリティカルなアプリで機能するためにこの機能を必要とする開発者はたくさんいます。この解決策がうまくいかない場合は、他にどのような方向性を示すことができるかわかりません。そうは言っても、私はこれを数百回テストしましたが、これによりiOS 6のWebApp(navigator.standalone)でユーザーの場所が正常に取得されます。

3
Matt Bontrager

これは、バグを複製し、回避策を示す私のビデオです。このバグは、Webアプリのメタタグを使用しているかどうかに関係なく存在するようです。

http://youtu.be/ygprgHh6LxA

更新:121212-IOS 6.1 Beta 3テストでは、バグがまだ解決されていないことが示されています...

更新:122012-IOS 6.1 Beta 4テストでは、バグがまだ解決されていないことが示されています...


更新:031113-レプリケーションの例

さて、ほんの数秒で複製するのは簡単な問題です。サファリではないと思いますが、IOSの問題です。まるでGoogleがIOS WC3html地理的位置仕様を満たすためにBIOSを作成したかのようです。そして、IOS6が彼らをバスから追い出したときにそれを持っていきました。IOSデバイスを使用してここに行きます:

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

スタートをクリックすると、時計はほぼ毎秒結果を返すはずです。次に、Googleリンクをクリックして、このページを終了します。次に、ユーザーのブラウザに戻るボタンをクリックして戻ります。[開始]をクリックします。時計は1〜3レコードを返し、ハングします。サファリを最小化し(ホームボタン)、次に復元します(サファリアイコン)。ぶら下がるのをやめます

それでおしまい。ハングしなくなるまで、問題は残ります。

マーク

更新:

IOS7.1は問題を修正しました...

2
MarkM

一度しか機能しないようで、その後、セカンダリコールは失敗します。 1つの代替方法は、結果をキャッシュし、キャッシュされた結果がある場合はそれを使用することです。ただし、これは、誰かの位置に従うアプリを作成できないことを意味します。

1
Rob Porter

Ios6のホーム画面アプリにはGeoLocationに関連するバグがあるように思われるため、これは正確な答えではありませんが、次のリンクが非常に役立つことがわかりました。ホーム画面アプリはネイティブアプリのように保存されるようになったため、独自のストレージ/キャッシュがあると説明されています。

地理位置情報は最初の反復で機能しますが、それ以降は更新に失敗します。回避策は、次のメタタグを削除して、ホーム画面アプリがブラウザーモードで実行されるようにすることです(正確にブラウザーモードと呼ばれるかどうかはわかりません)。残念ながら、アプリはブラウザのヘッダーとフッターでレンダリングされますが、GeoLocationは再び機能します。

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

iOS 6地理位置情報とローカルデータストレージ

「ホーム画面アプリのデータはネイティブアプリと同じように保存されるようになりました。ネイティブアプリにはそれぞれ独自のサンドボックスがあり、データの保存、バックアップ、復元が行われます。iOS6より前のホーム画面アプリは、ブラウザで実行されている同じアプリとデータを共有していました。 。ユーザーがブラウザのキャッシュをクリアすると、アプリのホーム画面バージョンもデータを失います。iOS6では、ホーム画面アプリのデータはネイティブアプリと同じようにサンドボックスに保存されます。バックアップと復元はデータを適切に処理します。 、ブラウザのキャッシュをクリアしても影響はありません。」

1
Anit Lacoul

ロードされた安全でないコンテンツに注意する必要があります。私にとって、安全なコンテキストからすべてのjavascript、画像、およびcssをロードすると、safariの問題が解決しました。

0
jlbofh

これはiOS6.1で修正されているようです。最近のベータ版ではありませんでしたが、今日の最終的な6.1リリースは私のテストでは良いようです。

0
Greg Wilson

私も同じ問題を抱えています。最初の位置を受け取った後、watchPositionが単に失敗しているように見えます。まだ回避策は見つかりませんでしたが、問題が発生していることを確認したいと思いました。

これらのサンプルの使用: http://www.w3schools.com/html/html5_geolocation.asp

Ios5で期待どおりの結果が得られますが、ios6はwatchPositionでボールをドロップします。

0
Morgan

ついにiOS6.1で修正されたようです!私のサイトwww.slople.comを参照してください。6.1で再び機能します。

0
Raphael Jeger

Webアプリをフルスクリーンで実行すると、同じ問題が発生することを確認できます。

興味深いことに、フルスクリーンのSafariが私の場所を使用する許可を求めたとき、以前のバージョンのiOSのように、WebサイトのタイトルはWebサイトのタイトルではなく「web」でした。

「Apple-mobile-web-app-capable」メタタグの削除は問題なく機能しますが、「ホーム画面に追加」を再度実行した場合に限ります。すでにホーム画面にアイコンを追加しているユーザーは毎日約7000人います。彼らに再びそうさせること、そして修正が暗示されるときに潜在的に再びそうすることは素晴らしいことではありません。

0
Gers

これはiOS7ベータで最終的に修正されました(ベータ2は私がテストしたすべてです)!

0
Greg Wilson