地理位置不适用于苹果移动网络应用程序功能

Geolocation not working with apple-mobile-web-app-capable?

本文关键字:网络 应用程序 功能 移动网 移动 不适用 适用于 苹果 地理位置      更新时间:2023-09-26

我有以下JS在#zip中显示当前用户的邮政编码:

(function ($, geolocation) {
    if (geolocation) {
        geolocation.getCurrentPosition(function (position) {
            $.getJSON(
                "http://ws.geonames.org/findNearestAddressJSON?callback=?",
                {
                    lat : position.coords.latitude,
                    lng : position.coords.longitude
                },
                function (data) {
                    $(function () {
                        $('#zip').text(data.address.postalcode);
                    });
                }
            );
        });
    }
}(jQuery, navigator.geolocation));

我还有一个JS函数来重新加载页面:

$('.reload').click(function(){
    window.location.reload(true);
});

在移动野生动物园中,这两个功能可以很好地协同工作。如果用户打开网页,它将加载用户的当前邮政编码。然后,如果用户更改了位置,则用户可以通过点击 botton 重新加载页面。这工作正常,除非存在<meta name="apple-mobile-web-app-capable" content="yes">

当它存在时,会发生什么:

  1. 用户点击主屏幕上的图标
  2. 网页打开,地址栏隐藏,<meta name="apple-mobile-web-app-capable" content="yes">执行此操作
  3. 邮政编码加载如预期的那样
  4. 用户移动位置,点击重新加载按钮
  5. 页面无法显示邮政编码,控制台上没有错误

我真的坚持如何解决这个问题,但如果这有帮助,这里有一个工作示例:

http://www.codekraken.com/testing/zipper/zip.html

全屏 Web 应用程序中没有重新加载(使用 Apple-mobile-web-appable)。 但是,当用户更改位置,然后再次运行应用时,它将始终加载页面。 它不会触发重新加载事件,但会在每次运行时触发 onload 事件。

如果用户让应用保持运行状态并更改位置,你将需要一个简单的"再次查找我"函数,只需重新运行代码即可查找当前位置和邮政编码。

现在 - 这是一个问题! 我发现在iOS上,位置经常被缓存,即使你告诉它只使用一个新的位置,所以有时,你会得到旧的位置。 我为此创建了一个称为getAccurateCurrentLocation()的解决方法,它使用非常相似的接口。 您可以在 https://github.com/gwilson/getAccurateCurrentPosition 中找到代码 - 作为getCurrentPosition()的替代品非常简单。

这应该可以做到。

如果其他人有困惑(就像我一样),这里涉及的方法就是地理位置对象的本机"watchPosition"方法。

观察位置 MDN 规格

当用户移动位置时,将调用 watchPosition 方法,您可以将经度/经度到 zip 生成器指定为回调。

从规格:

    var watchID = navigator.geolocation.watchPosition(function(position) {
        do_something(position.coords.latitude, position.coords.longitude);
    });

所以看起来你可以做到:

    var watchID = navigator.geolocation.watchPosition(function(position) {
        $.getJSON(
            "http://ws.geonames.org/findNearestAddressJSON?callback=?",
            {
                lat : position.coords.latitude,
                lng : position.coords.longitude
            },
            function (data) {
                $(function () {
                    $('#zip').text(data.address.postalcode);
                });
            }
        );
    });

这将实现更多的简单性 - 用户不必点击位置按钮,它应该已经在他们移动时更新。

需要明确的是,Greg的函数使用这个watchPosition方法,但如果你想了解工作是什么,或者使用更精简的本机代码并自己自定义它,watchPosition就是你的工具。

全屏模式在可能具有一组单独地理位置权限的 WebTable 中启动浏览器。也许以前您拒绝在WebSheet中共享地理位置信息,但允许在Safari浏览器中共享。

如果我没记错的话,众所周知,WebSheets会不时重置其权限,并再次提示用户每隔几个小时允许读取地理位置。