【问题标题】:iOS WebApp's don't allow location services?iOS WebApp 不允许定位服务?
【发布时间】:2012-07-14 01:05:44
【问题描述】:

我有以下 JS 获取用户的当前位置并显示他们的邮政编码...

(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));

请在 CodeReview 上提供帮助,因为我的原始代码非常糟糕,https://codereview.stackexchange.com/questions/13481/to-use-or-not-to-use-public-variables-in-javascript/13483#comment21844_13483

HTML:

<div id="zip"></div>

...然后在 div 中显示邮政编码。

这在移动版 Safari 和桌面版 Safari 中都能正常工作,但我一添加 apple-mobile-web-app-capable 元标记,代码就会中断。

我在每一步之后都将代码日志记录到控制台,并且在常规 Safari 和 Mobile Safari 中都可以顺利运行。一旦我将它添加到我的主屏幕(头部带有元标记),该应用程序甚至不会运行 JS 代码。它也没有麻烦登录到控制台,这让我想知道 WebApps 中是否允许定位服务。

如果在从主屏幕运行时重新加载页面,也会出现此问题。

有没有办法解决这个问题?这是一个常见的问题吗?

【问题讨论】:

    标签: javascript jquery iphone ios iphone-standalone-web-app


    【解决方案1】:

    是的,iOS 网络应用程序使用apple-mobile-web-app-capable 元标记,允许通过navigator.geolocation 进行定位服务。你没有错误回调,这可能会给你一个问题的提示。发布您的 HTML 以供进一步分析。

    试着把它放在一个页面上(设置apple-mobile-web-app-capable):

    navigator.geolocation.getCurrentPosition( function ( position ) {
        alert( 'yay!' );    
    },
    function ( error ) {
        alert( 'boo! error: ' + error.message );
    } );
    

    根据您的评论,这是可行的,所以它不是位置服务。尝试更改最后一行括号的顺序。

    } )( jQuery, window.navigator.geolocation );
    

    另外,这看起来有点奇怪,因为对.text() 的调用会立即发生,而不是在.getJSON() 完成时:

    function (data) {
        $(function () {
            $('#zip').text(data.address.postalcode);
        });
    }
    

    试试:

    function (data) {
        $('#zip').text(data.address.postalcode);
    }
    

    所以你的最终代码应该是这样的:

    ( 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) {
                        $('#zip').text(data.address.postalcode);
                    }
                );
            });
        }
    } )( jQuery, window.navigator.geolocation );
    

    【讨论】:

    • HTML 只是一个 div。这在最基本的层面上不起作用。从主屏幕运行,您的代码有效。
    • @Charlie 好的,如果我的示例有效,那么您知道这不是定位服务。它必须是您的 Javascript 中的其他内容。逐步剥离所有内容,直到找到为止。请记住,从主屏幕运行的应用程序使用不同的 Javascript 引擎,因此通常可以看到它与移动 Safari 之间的差异。
    • 它几乎都被剥离了,我怎么能把它分解得更远?
    • 这两个建议都显示了主屏幕应用程序中的邮政编码,但随后出现了第二个问题:尝试重新加载页面,如果您想要重新检查邮政编码,这将具有现实生活中的场景移动到新位置,破坏密码,并且根本不会显示邮政编码。如果还不够清楚,我会重申,我太累了,说不出来哈哈。
    • @Charlie 所以这解决了你最初的问题,“定位服务在 iOS 应用程序中工作吗?”,现在你遇到了一个新问题?
    【解决方案2】:

    Apple 有自己的方式来获取 webApps 的本地化。如果您在 iOS 开发人员计划中,您绝对应该查看官方文档。

    看看这个:http://developer.apple.com/library/ios/#DOCUMENTATION/AppleApplications/Reference/SafariWebContent/GettingGeographicalLocations/GettingGeographicalLocations.html#//apple_ref/doc/uid/TP40002051-CH5-SW2

    【讨论】:

    • 我正在尝试制作这个相对跨设备的东西,我不想使用只适用于 iPhone 的东西。根据我对代码的理解,它适用于其他某些浏览器,如果我采用这种方法,我认为我会失去......
    • 我的代码已经使用了geolocation.getCurrentPosition,这就是它在文档中所说的使用。
    • 我喜欢 jQuery,但我并不真正理解它,因为我学会了使用它,而不是它是如何工作的。当我的代码中断时我会做什么,将其复制/粘贴到文本编辑器中,然后逐步将其复制回来。首先,尝试只打印坐标。 getJSON 部分可能有问题
    猜你喜欢
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-26
    相关资源
    最近更新 更多