通过 iPhone 的 IP 地址进行地理定位

Posted

技术标签:

【中文标题】通过 iPhone 的 IP 地址进行地理定位【英文标题】:Geolocation by iPhone's IP address 【发布时间】:2018-07-09 21:27:16 【问题描述】:

我喜欢使用设备的 IP 地址来跟踪用户的“位置”。

我已经在寻找一些 API 服务,例如:

freegeoip.net api.petabyet.com ip-api.com

但我不知道如何使用此服务来获取用户设备的位置。

实际上我已经寻找了一些 Swift 代码 sn-ps 来获得想要的结果 (获取位置) 但我找不到任何与当前版本的 Swift 匹配的代码.

let url = NSURL(string: "http://freegeoip.net")
    let task = URLSession.shared.dataTask(with: url! as URL) (data, response, error) in
        let httpResponse = response as? HTTPURLResponse
        if (httpResponse != nil) 

         else  
    ; task.resume()

以上几行是我到目前为止所得到的全部内容。但我真的希望有人能帮我解决这个问题。

【问题讨论】:

这些服务的文档告诉你什么?你在哪里卡住了? 本方案例如:freegeoip.net/format/IP_or_hostname。如何在我上面的函数中实现这个方案? @意义问题 my answer 对您有何帮助?你有什么问题吗? 【参考方案1】:

您可以先尝试 http://ip-api.com/json,它会返回一个 JSON,如 on their API page 所述。

然后您可以将此 JSON 字符串转换为字典并访问数据。

func getIpLocation(completion: @escaping(NSDictionary?, Error?) -> Void)

    let url     = URL(string: "http://ip-api.com/json")!
    var request = URLRequest(url: url)
    request.httpMethod = "GET"

    URLSession.shared.dataTask(with: request as URLRequest, completionHandler:
     (data, response, error) in
        DispatchQueue.main.async
        
            if let content = data
            
                do
                
                    if let object = try JSONSerialization.jsonObject(with: content, options: .allowFragments) as? NSDictionary
                    
                        completion(object, error)
                    
                    else
                    
                        // TODO: Create custom error.
                        completion(nil, nil)
                    
                
                catch
                
                    // TODO: Create custom error.
                    completion(nil, nil)
                
            
            else
            
                completion(nil, error)
            
        
    ).resume()

此函数返回字典或错误(在您解决 TODO 之后)。 completion 在主线程上调用,假设您将使用结果来更新 UI。如果没有,您可以删除DispatchQueue.main.async

【讨论】:

除非有充分的理由,否则不要使用 Foundation 类型。由于您立即将 NSURLNSMutableURLRequest 转换为它们的原生 Swift 替代品,因此根本没有理由使用它们。此外,无需从主线程调用完成处理程序。 太酷了!我不知道您可以在如此简单的 JSON 返回中获得如此精细的数据。

以上是关于通过 iPhone 的 IP 地址进行地理定位的主要内容,如果未能解决你的问题,请参考以下文章

win32 api根据wifi和IP地址对笔记本电脑进行地理定位

谷歌地图是不是只使用我的 IP 进行地理定位?

使用 IP 进行地理定位是查找计算机位置的好方法吗

前端页面获取访问者的IP地址经纬度和地理位置

怎样根据ip察地理位置??

iPhone如何进行地理定位?