getCurrentPosition() 和 watchPosition() 在不安全的来源上被弃用

IT技术 javascript html geolocation deprecation-warning
2021-01-29 03:03:03

我在我的网站上收到此错误,该错误要求用户提供地理位置数据:

getCurrentPosition() 和 watchPosition() 在不安全的来源上已被弃用,未来将取消支持。您应该考虑将应用程序切换到安全来源,例如 HTTPS。有关更多详细信息,请参阅goo.gl/rStTGz

我的意思是它基本上只是一个通知,而谷歌链接只是说它被弃用了。

我没有将我的网站迁移到 SSL 的计划……那么像我这样的人有替代方案吗?

6个回答

因为根据您的架构,切换到 HTTPS 可能会很痛苦或不可能,所以我找到了一个变通的解决方案:您可以使用Google Maps Geolocation API虽然它有使用限制,但它可以完成工作。您将需要一个浏览器 API 密钥,因此不要忘记将其使用限制为您的页面主机名。

getCurrentPosition()如果失败,我将其用作该方法的后备方法它允许我让它工作,直到我切换到 HTTPS。

这是 JSFiddles:

  • HTTPgetCurrentPosition()将失败并回退到 API
  • HTTPS :getCurrentPosition()会成功
是的,因为 fiddle 仅在浏览器地理定位失败时(当您收到警告时)才使用 API。
2021-03-14 03:03:03
你好,可以发个例子吗?谢谢
2021-03-25 03:03:03
我仍然会收到警告信息,可以吗?
2021-03-26 03:03:03
请注意,该示例使用 JQuery。
2021-04-09 03:03:03
此外,谷歌地图地理定位 API 没有提到 GPS,而是提到网络接入点(wifi、蜂窝)或 IP 地理信息作为后备。所以现在看来​​ HTTPS 是必不可少的。
2021-04-09 03:03:03

在 /jstillwell 的帖子中找到了一个可能的答案:https : //github.com/stefanocudini/leaflet-gps/issues/15 基本上未来将不支持此功能(仅在 Chrome 中?),但仅适用于 HTTP 站点。HTTPS 仍然可以,并且没有计划为 HTTP 使用创建等效的替代品。

它仅用于测试,您可以在谷歌浏览器中进行:导航到:chrome://flags/#unsafely-treat-insecure-origin-as-secure 然后您会看到:输入 在此处输入图片说明 您想要允许的地址,然后启用重新启动浏览器。

这应该被标记为正确答案。
2021-03-14 03:03:03
很有魅力!
2021-03-26 03:03:03

是的。谷歌浏览器在 50 版中已弃用该功能。如果您尝试在 chrome 中使用它,错误是:

getCurrentPosition() and watchPosition() are deprecated on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See https://sites.google.com/a/chromium.org/dev/Home/chromium-security/deprecating-powerful-features-on-insecure-origins for more details.

因此,您必须添加 SSL 证书。嗯,这是唯一的方法。

现在使用Let's Encrypt非常容易这是指南

出于测试目的,您可以尝试以下操作:

1.localhost 被视为 HTTP 上的安全来源,因此如果您能够从 localhost 运行您的服务器,您应该能够在该服务器上测试该功能。

2.您可以使用 --unsafely-treat-insecure-origin-as-secure="http://example.com" 标志运行 chrome(用您实际想要测试的源替换“example.com”),将在此会话中将该源视为安全的。请注意,您还需要包含 --user-data-dir=/test/only/profile/dir 以创建新的测试配置文件以使标志工作。

我认为 Firefox 还限制用户访问来自http. 这是 webkit 更新日志:https : //trac.webkit.org/changeset/200686

杀死所有实例并重试。stackoverflow.com/questions/6918393/...
2021-04-06 03:03:03
我正在获取信息:“您正在使用不受支持的命令行标志:--unsafely-treat-insecure-origin-as-secure。稳定性和安全性将受到影响”。Chrome 版本:50.0.2661.102。地理定位仍然无法正常工作
2021-04-11 03:03:03
在 Chrome 浏览器中测试您的应用程序时,只需将应用程序 url(通常为 192.xxx.xxx.xxx:3000)更改为 localhost:3000 .. 您需要确保您的媒体策略支持它,但您不会得到安全错误。
2021-04-11 03:03:03

您可以为此使用https://ipinfo.io API(这是我的服务)。每天最多 1,000 个请求是免费的(有或没有 SSL 支持)。它为您提供坐标、名称等。下面是一个例子:

curl ipinfo.io
{
  "ip": "172.56.39.47",
  "hostname": "No Hostname",
  "city": "Oakland",
  "region": "California",
  "country": "US",
  "loc": "37.7350,-122.2088",
  "org": "AS21928 T-Mobile USA, Inc.",
  "postal": "94621"
}

这是一个示例,它使用与您从中获得的内容相匹配的 API 响应构造一个 coords 对象getCurrentPosition()

$.getJSON('https://ipinfo.io/geo', function(response) { 
    var loc = response.loc.split(',');
    var coords = {
        latitude: loc[0],
        longitude: loc[1]
    };
});

这是一个详细的示例,展示了如何将其用作以下各项的后备getCurrentPosition()

function do_something(coords) {
    // Do something with the coords here
}

navigator.geolocation.getCurrentPosition(function(position) { 
    do_something(position.coords);
    },
    function(failure) {
        $.getJSON('https://ipinfo.io/geo', function(response) { 
        var loc = response.loc.split(',');
        var coords = {
            latitude: loc[0],
            longitude: loc[1]
        };
        do_something(coords);
        });  
    };
});

有关更多详细信息,请参阅http://ipinfo.io/developers/replacing-navigator-geolocation-getcurrentposition

您的机器或网络上安装了什么防病毒软件?
2021-03-16 03:03:03