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

我得到这个错误,在我的网站上向用户请求地理位置数据:

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

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

我没有计划将我的网站迁移到SSL …所以有没有像我这样的人的替代scheme?

在/ jstillwell的post中find了一个可能的答案: https : //github.com/stefanocudini/leaflet-gps/issues/15基本上这个function将来不会被支持(仅在Chrome中?),但仅限于HTTP站点。 HTTPS仍然可以,并且没有计划为HTTP使用创build等效的替代品。

由于根据您的体系结构切换到HTTPS可能是痛苦的或不可能的,所以我find了解决方法:您可以使用Google Maps地理定位API 。 尽pipe它有使用限制,但它完成了这项工作。 您将需要一个浏览器API密钥,所以不要忘记将它的使用限制在您的页面主机名。

如果失败,我将它作为getCurrentPosition()方法的后备方法。 它使我能够工作,直到我切换到HTTPS。

这里是JSFiddles:

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

你可以使用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" } 

下面是一个使用与getCurrentPosition()相匹配的API响应构造coords对象的示例:

 $.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

是。 Google Chrome已弃用版本50中的function。如果您尝试在Chrome中使用该function,则错误是:

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很容易。 这是指导

而为了testing目的,你可以试试这个:

1.本地主机被视为HTTP上的安全源,所以如果你能够从本地主机运行你的服务器,你应该能够testing该服务器上的function。

2.您可以使用–unsafely-treat-insecure-origin-as-secure =“http://example.com”标志运行chrome(将“example.com”replace为您实际想要testing的来源),将把这个来源视为这个会议的安全。; 请注意,您还需要包含–user-data-dir = / test / only / profile / dir来为标志创build新的testingconfiguration文件。

我认为Firefox也限制用户访问来自http GeoLocation API请求。 以下是webkit变更日志: https : //trac.webkit.org/changeset/200686

您可以使用–unsafely-treat-insecure-origin-as-secure =“http://example.com”标志(将“example.com”replace为您实际想要testing的来源)来运行chrome,该来源对于本次会议来说是安全的。; 请注意,您还需要包含–user-data-dir = / test / only / profile / dir来为标志创build新的testingconfiguration文件。

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

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

在HTTP中发生错误。

在下面的标签中设置localhost的权限(接受来自这些HTTP引用者(网站)的请求)。

它为我工作。

如果你想在你的开发环境中进行testing,使用FireFox或者任何其他的浏览器来代替Chrome ,除了使用https以外,没有其他的方法可以进行生产。

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

哦,亲爱的,现在刚刚生效。 时间安装SSL证书:

 getCurrentPosition() and watchPosition() no longer work on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. 

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

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

请记住,这个服务并不是非常准确的地理位置,但它仍然是一个简单而快速的解决scheme。