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

getCurrentPosition() and watchPosition() are deprecated on insecure origins

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

getCurrentPosition() and watchPosition() are deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See goo.gl/rStTGz for more details.

我的意思是它基本上只是一个通知,google link 只是说它被弃用了。

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

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

是的。 Google Chrome 已弃用版本 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. Here's guide

非常容易

出于测试目的,您可以试试这个:

1.localhost is treated as a secure origin over HTTP, so if you're able to run your server from localhost, you should be able to test the feature on that server.

2.You can run chrome with the --unsafely-treat-insecure-origin-as-secure="http://example.com" flag (replacing "example.com" with the origin you actually want to test), which will treat that origin as secure for this session. Note that you also need to include the --user-data-dir=/test/only/profile/dir to create a fresh testing profile for the flag to work.

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

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

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

这是 JSFiddles:

  • HTTPgetCurrentPosition() 将失败并退回到 API
  • HTTPS: getCurrentPosition() 会成功

您可以 运行 chrome 使用 --unsafely-treat-insecure-origin-as-secure="http://example.com" 标志(将 "example.com" 替换为您的来源actually want to test),这将把该来源视为本次会话的安全来源。请注意,您还需要包含 --user-data-dir=/test/only/profile/dir 以创建新的测试配置文件以使该标志起作用。

例如 如果使用 Windows,单击开始并 运行。

chrome --unsafely-treat-insecure-origin-as-secure="http://localhost:8100"  --user-data-dir=C:\testprofile

在 HTTP 中发生错误。

在波纹管标签中为 localhost 设置权限(接受来自这些 HTTP 引荐来源网址(网站)的请求)。

对我有用。

如果您想在您的开发环境中测试它,请使用 FireFox 或任何其他浏览器而不是 Chrome,对于生产环境,除了使用 https.[=14 之外别无他法=]

对于开发环境,只需在 FireFox 上打开 http://localhost:8100/,唉,没有这样的错误。

请花些时间安装 SSL 证书 getCurrentPosition() 并且 watchPosition() 不再适用于不安全的来源。要使用此功能,您应该考虑将您的应用程序切换到安全来源,例如 HTTPS。

我知道 geoLocation API 更好,但对于不能使用 SSL 的人,您仍然可以使用某些服务,例如 geopluginService

如文档中所述,您只需将带有 ip 的请求发送到服务 url http://www.geoplugin.net/php.gp?ip=xx.xx.xx.xx 输出是一个序列化数组,因此您必须在使用前将其反序列化。

请记住,此服务不像地理定位那样非常准确,但它仍然是一个简单快捷的解决方案。

您可以为此使用 https://ipinfo.io API(这是我的服务)。最多 1,000 req/day(支持或不支持 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 响应构造一个坐标对象,该响应与您从 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

仅供开发人员使用,您可以授权特定本地域使用此功能:

https://medium.com/@Carmichaelize/enabling-the-microphone-camera-in-chrome-for-local-unsecure-origins-9c90c3149339

仅供测试,您可以在google chrome中进行: 导航至:chrome://flags/#unsafely-treat-insecure-origin-as-secure 然后你会看到: 输入您要允许的地址,然后 启用重新启动 您的浏览器。