24

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

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

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

4

11 に答える 11

14

これは間違いなくバグですが、回避策を見つけました。これは気に入らないかもしれませんが、少なくとも Web アプリが再び機能するようになるでしょう。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に大声で文句を言ってください!

于 2012-09-20T06:07:56.120 に答える
3

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

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

注: 何らかの理由で、このコードの実行が最初にアプリを起動した後のある時点で遅れた場合、これは一貫して機能しないようです。したがって、これは初期化メソッドで実行する最初のことです。

注: アプリに追加した他の唯一のことは、地理位置情報データを使用する必要がある場合 (私にとっては、他のいくつかのクラス/オブジェクト リテラルの初期化後に行われます)、緯度/経度値。存在する場合は続行します。そうでない場合は、上記のジオロケーション メソッドを再度実行してから続行します。

注: 長い間悩まされていたことの 1 つは、ユーザーの現在の位置を取得するだけでよいということでした。ユーザーの動きを追跡する必要はありませんでした。getCurrentPosition() メソッドを使用して、これをさまざまに繰り返してみました。何らかの理由で、それは機能しません。それで、これが私が思いついた解決策です。ユーザーの位置を追跡するように実行し (最初に位置を取得するため)、位置を取得したら、watchPosition ID をクリアして追跡されないようにします。時間の経過とともに変化する位置を追跡する必要がある場合は、もちろんできます... watchPosition ID をクリアしません。

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

于 2013-01-19T01:11:36.560 に答える
2

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

http://youtu.be/ygprgHh6LxA

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

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


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

わかりました、ほんの数秒で複製できる簡単な問題です。サファリではなく、IOSの問題だと思います。それはあたかも、Google が WC3 html 地理的位置の仕様を満たすように IOS の BIOS を作成し、IOS6 がバスから追い出したときにそれを持っていったかのようです。IOS デバイスを使用する場合は、次の場所に移動します。

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

開始をクリックすると、時計はほぼ毎秒結果を返すはずです。次に、Google リンクをクリックしてこのページを離れます。次に、ユーザー ブラウザの [戻る] ボタンで戻り、[開始] をクリックします。Watch は 1 ~ 3 個のレコードを返し、ハングします。サファリ (ホーム ボタン) を最小化してから復元 (サファリ アイコン); ハングを停止します

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

マーク

アップデート:

IOS 7.1 は問題を修正しました...

于 2012-11-17T23:30:19.513 に答える
1

1 回しか機能しないようで、2 番目の呼び出しは失敗します。代替手段の 1 つは、結果をキャッシュし、キャッシュされた結果がある場合はそれを使用することですが、これは、誰かの位置を追跡するアプリを作成できないことを意味します。

于 2012-09-28T19:56:08.160 に答える
0

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

于 2013-01-30T12:08:45.997 に答える
0

これは、iOS 6.1 で修正されたようです。最近のベータ版にはありませんでしたが、今日の最後の 6.1 リリースは、私のテストではうまくいっているようです。

于 2013-01-29T05:26:48.643 に答える
0

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

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

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

于 2012-09-19T22:44:30.210 に答える
0

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

于 2013-07-04T23:17:54.013 に答える
0

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

興味深いことに、全画面表示の Safari が私の位置情報を使用する許可を求めたとき、Web サイトのタイトルは以前のバージョンの iOS のように Web サイトのタイトルではなく「web」でした。

「apple-mobile-web-app-capable」メタ タグを削除しても問題なく機能しますが、「ホームスクリーンに追加」した場合に限ります。私たちのアイコンをすでにホームスクリーンに追加している毎日のユーザーは約 7000 人です。彼らにもう一度そうしてもらい、修正が実装されたときに再びそうする可能性はあまりありません。

于 2012-09-28T10:59:00.480 に答える