【问题标题】:getCurrentPosition in JS does not work on iOSJS 中的 getCurrentPosition 在 iOS 上不起作用
【发布时间】:2019-11-29 12:53:23
【问题描述】:

我有一个页面,其中包含从设备获取当前位置并使用此代码根据位置加载其他内容的代码:

if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(successFunction);
} else {
    // Make API call to the GeoIP services
}

它适用于我测试过的所有 android 设备,但在 iOS 和 macOS 上,它不起作用。 ifelse 都不是。似乎它卡在获取当前位置。

有什么帮助吗?

【问题讨论】:

  • 显示错误,你就会知道发生了什么-> look navigator.geolocation.getCurrentPosition(success, error, options);
  • @The Rock,您的网站是否通过 https 提供服务?
  • 不,它主要在 localhost 上,并且登台服务器不支持 https。我在生产服务器上进行了测试,它按原样工作。

标签: javascript ios macos google-chrome safari


【解决方案1】:

GeoLocation 仅在用户提供其权限时才有效。

确保确实如此。

This CodePen demo已经在iOS模拟器上用Safari测试,成功显示经纬度。

var options = {
  enableHighAccuracy: true,
  timeout: 5000,
  maximumAge: 0
};

function log(data) {
  const tag = document.createElement('p');
  tag.textContent = data;
  document.body.appendChild(tag);
}

function success(pos) {
  var crd = pos.coords;
  console.log('Successfully determined a user position:', crd);

  log('Your current position is:');
  log(`Latitude : ${crd.latitude}`);
  log(`Longitude: ${crd.longitude}`);
  log(`More or less ${crd.accuracy} meters.`);
}

function error(err) {
  console.warn(`ERROR(${err.code}): ${err.message}`);
}

navigator.geolocation.getCurrentPosition(success, error, options);

如果您的代码未命中 ifelse,则不会出现这种情况,除非其他代码在您的代码中早些时候触发了无限循环。

【讨论】:

  • 确保将权限提示给用户:support.google.com/chrome/answer/…
  • 您提供的代码 sn-p 可能无法在 macOS Safari 上运行,因为与原始问题完全相同。显示如下:ERROR(2): Origin 无权使用地理位置服务
  • 很有可能。在我的情况下,会提示用户:“网站“s.codepen.io”想使用您当前的位置”。选择“允许”显示当前坐标。仔细检查您是否在设置 -> 安全和隐私 -> 定位服务中勾选了“启用定位服务”复选框。不要忘记在有权确定您的位置的应用列表中勾选 Safari 旁边的相应复选框。
  • 感谢您的时间和精力,我已经使用了您的代码,正如我所说,权限没有出现。即使在这段代码中是sn-p。我的问题是关于@MojtabaHosseini 提到的https
【解决方案2】:

如果 iOS 和 macOS 不允许如果系统无法信任您,则不会向您提供用户的位置。所以:

- 首先(可能是你的答案)

它适用于您提供的确切代码仅当主机(又名来源)使用 https。这是由于您对以下答案的评论而导致权限警报未显示的原因。

记住如果你不使用https,它会卡住大约一分钟,然后返回一个关于身份验证失败的错误。使用 error 检查:

navigator.geolocation.getCurrentPosition(success, error, options)

它会告诉你这样的事情:

[blocked] 对地理位置的访问因不安全的连接而被阻止 到http://example.com

提示:您可以在请求位置后刷新页面以跳过等待过程。但不要忘记检查检查器中的 Preserve Log 选项。

- 第二个:

如果您使用的是 https,请检查您的 Safari 位置设置,该设置可能以某种方式设置为“关闭”,您可以在此处进行更改:设置 > 隐私 > 位置服务 > Safari。这不是默认选项,但也许您不小心更改了它。因此,如果这是问题所在,请不要担心用户。如果您使用 Chrome 或任何其他第三方浏览器,请前往其设置并检查位置访问。默认情况下它不存在,只有在至少需要一次位置时才会出现。

- 第三个:

如果您要使用webView在应用中加载您的网站,请确保将位置权限描述添加到 info.plist强>文件。根据您的需要添加NSLocationWhenInUseUsageDescriptionNSLocationAlwaysUsageDescriptionNSLocationUsageDescription

为了完整起见,在iOS13上,你无法获得always的权限。但这不是重点,重点是您必须在之前获得所需的权限,否则您需要从 GPS 获取位置,否则它根本不起作用。

【讨论】:

  • 你是对的!这是因为httpstip 帮助我获取了错误消息。但是我怎样才能在我的机器上测试呢?本地主机不是https
  • 这是一个不同的问题。你可以搜here
  • 上面的“第二”部分对我有用。确保不仅启用了一般的定位服务。但还要确保它是专门为 Safari 启用的(如上所述)。谢谢!
【解决方案3】:

我刚刚遇到了同样的问题。简单的答案是询问用户,在

中授予您的浏览器权限
Settings > Privacy > Location Services.

【讨论】:

    【解决方案4】:

    你需要检查三件事

    您需要检查以下内容以了解您的程序为何无法访问用户的位置。您的代码应确保以下三点:

    1. 用户的操作系统启用了定位服务。
    2. 用户的浏览器支持检查定位服务。
    3. 用户的浏览器启用了位置服务

    结合页面上的答案和一项额外的检查,我们可以处理所有这三种情况:

        /* Set up getCurrentPosition options with a timeout */
        const navigatorLocationOptions = {
          enableHighAccuracy: true,
          timeout: 5000,
          maximumAge: 0
        };
    
        /* Determine browser permissions status */
        navigator.permissions.query({name:'geolocation'})
          .then((result) => {
            /* result.state will be 'granted', 'denied', or 'error' */
            if (result.state === 'granted') {
              navigator.geolocation.getCurrentPosition(pos => {
                 console.log('Retrieved user location', pos);
                 /* Got the location! Write your successful code here. */            
    
              }, (error) => {
                /* System/OS location services disabled */
                console.log('System/OS services disabled', navigator);
                noLocationFound();
              }, navigatorLocationOptions);
    
            } else {
              /* Browser location services disabled or error */
              console.log('Browser location services disabled', navigator);
              noLocationFound();
            }
          }, (error) => {
            /* Browser doesn't support querying for permissions */
            console.log('Browser permissions services unavailable', navigator);
            noLocationFound()
          }
        );
        
        /* Handle no location found */
        function noLocationFound() {
          /* Write code here to handle: user location is unavailable */
        }
    

    只需在noLocationFound() 函数中添加用户通知和回退的处理代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多