不使用核心定位获取用户位置(谷歌地图地理定位)?

3
最近我正在开发一个应用程序,用户位置很重要。为了获取用户的位置,我们正在使用位置管理器。不幸的是,只有在用户启用位置服务并授权访问后才能使用此功能。
如果用户没有授予权限,我们只能使用几个不太准确的IP服务。我正在尝试找到一种方法,可以在未启用位置服务的情况下获得大致的用户位置,并且比IP服务更好。
唯一有希望的API是Google Maps Geolocation API,它声称可以使用基站和WiFi节点获取用户位置。
我尝试寻找库或方法,可以在iOS上特别是Swift中使用,但没有成功。有人能帮忙吗?

1
如果你在用户拒绝提供位置数据后,基本上突破了它们的位置数据,那么你的应用程序将无法进入应用商店。如果您想要一般性的信息,请使用用户设置的语言环境。 - Quantaliinuxite
如果位置服务被禁用,则在iOS中最好的情况是使用IP地址。Google API需要可见基站和/或WiFi网络的详细信息,而这些信息在iOS上无法获取,因此它也将退回到IP地址。正如@Quantaliinuxite所说,如果用户希望您的应用程序具有其位置,则会向您提供该信息。 - Paulw11
@Quantaliinuxite,我并不想突破用户位置数据的限制,因为我知道这样的应用会被拒绝。我只是试图找到比IP地址更好的解决方案。Google Geolocation API看起来很有前途,但由于你无法获取所需的详细信息(正如Paulw11所提到的),因此它无法使用。 - zirinisp
2个回答

2
我使用用户的时区来获取大致位置,仅用于根据日出或日落设置应用程序主题和地图样式(这是一款导航应用程序)。
我使用下面的函数,并拥有一个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文件。如果您需要,请留下评论。


为什么要踩我?我不是已经给出了解决方案吗? - guido

0

很遗憾,没有办法做到这一点,因为操作系统不提供访问任何其他确定用户位置的方法(如基站等)。

说实话,这是有道理的,因为如果用户希望应用程序可以访问他的位置,他会给予我们权限。

这就是Google Geolocation API无法在iOS上工作的原因。

唯一的解决方法是使用IP地址,但那里的准确性几乎是全国范围的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接