在最近的应用程序中,我正在开发用户位置是必不可少的。要获取用户的位置,我们正在使用位置管理器。不幸的是,这仅在用户启用了位置服务并且允许访问它时才有效。
如果用户未给予许可,我们只会留下一些不太准确的ip服务。我试图找到一种方法,我可以在没有启用位置服务的情况下获得大致的用户位置,并且ip服务更好。
唯一有希望的API是Google Maps Geolocation API,声称它可以使用手机信号塔和wifi节点获取用户位置。
我试图找到一个库或者我可以在iOS上使用它的方式,最好是Swift没有成功。有人可以帮忙吗?
答案 0 :(得分:1)
我正在使用用户的时区来获取一个大概的位置,我只用它来设置我的应用主题和地图样式(它是导航应用),基于太阳升起或太阳下山。
我使用下面的函数并有一个plist'查找表'。查找表中的坐标是该时区的中心坐标。因此,如果用户在自己的时区之外,它会给你“错误”的位置。
func getLastKnownLocationFromTimeZone() {
var timeZonesArray: NSMutableArray!
if let path = Bundle.main.path(forResource: "NSTimeZoneCoordinates", ofType: "plist") {
timeZonesArray = NSMutableArray(contentsOfFile: path)
for timeZoneDictionary in timeZonesArray {
if let tzDic = timeZoneDictionary as? NSDictionary {
if let timeZoneName = tzDic["NSTimeZoneName"] as? String {
if timeZoneName == TimeZone.autoupdatingCurrent.identifier {
let lat = tzDic["Lat"] as! String
let lon = tzDic["Lon"] as! String
lastKnownLocation = CLLocation(latitude: lat.doubleValue(), longitude: lon.doubleValue())
return
}
}
}
}
}
}
plist样本:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>Lat</key>
<string>5.316667</string>
<key>Lon</key>
<string>-4.033333</string>
<key>NSTimeZoneName</key>
<string>Africa/Abidjan</string>
</dict>
<dict>
<key>Lat</key>
<string>5.55</string>
<key>Lon</key>
<string>-0.2</string>
<key>NSTimeZoneName</key>
<string>Africa/Accra</string>
</dict>
<dict>
<key>Lat</key>
<string>8.980603</string>
<key>Lon</key>
<string>38.757761</string>
<key>NSTimeZoneName</key>
<string>Africa/Addis_Ababa</string>
</dict>
<dict>
<key>Lat</key>
<string>36.752887</string>
<key>Lon</key>
<string>3.042048</string>
<key>NSTimeZoneName</key>
<string>Africa/Algiers</string>
</dict>
<dict>
<key>Lat</key>
<string>15.333333</string>
<key>Lon</key>
<string>38.933333</string>
<key>NSTimeZoneName</key>
<string>Africa/Asmara</string>
</dict>
<dict>
<key>Lat</key>
<string>12.65</string>
<key>Lon</key>
<string>-8</string>
<key>NSTimeZoneName</key>
<string>Africa/Bamako</string>
</dict>
<dict>
<key>Lat</key>
<string>4.366667</string>
<key>Lon</key>
<string>18.583333</string>
<key>NSTimeZoneName</key>
<string>Africa/Bangui</string>
</dict>
<dict>
<key>Lat</key>
<string>13.453056</string>
<key>Lon</key>
<string>-16.5775</string>
<key>NSTimeZoneName</key>
<string>Africa/Banjul</string>
</dict>
<dict>
<key>Lat</key>
<string>11.881655</string>
<key>Lon</key>
<string>-15.617794</string>
<key>NSTimeZoneName</key>
<string>Africa/Bissau</string>
</dict>
<dict>
<key>Lat</key>
<string>-15.786111</string>
<key>Lon</key>
<string>35.005833</string>
<key>NSTimeZoneName</key>
<string>Africa/Blantyre</string>
</dict>
<dict>
<key>Lat</key>
<string>-4.267778</string>
<key>Lon</key>
<string>15.291944</string>
<key>NSTimeZoneName</key>
<string>Africa/Brazzaville</string>
</dict>
<dict>
<key>Lat</key>
<string>-3.383333</string>
<key>Lon</key>
<string>29.366667</string>
<key>NSTimeZoneName</key>
<string>Africa/Bujumbura</string>
</dict>
<dict>
<key>Lat</key>
<string>30.119799</string>
<key>Lon</key>
<string>31.537</string>
<key>NSTimeZoneName</key>
<string>Africa/Cairo</string>
</dict>
<dict>
<key>Lat</key>
<string>33.57311</string>
<key>Lon</key>
<string>-7.589843</string>
<key>NSTimeZoneName</key>
<string>Africa/Casablanca</string>
</dict>
<dict>
<key>Lat</key>
<string>35.889387</string>
<key>Lon</key>
<string>-5.321346</string>
<key>NSTimeZoneName</key>
<string>Africa/Ceuta</string>
抱歉,将整个plist粘贴到这里太长了。如果你想要它留下评论。
答案 1 :(得分:0)
不幸的是没有办法做到这一点,因为操作系统无法访问任何确定用户位置的替代方法(手机信号塔等)。
说实话,这是有道理的,好像用户希望应用程序可以访问他的位置,他会给我们许可。
这就是Google Geolocation API无法在iOS上运行的原因。
唯一的解决方法是使用IP地址,但其准确性几乎遍布全国。