iPhone的IP地址进行地理定位

5
我希望通过使用设备的IP地址来跟踪用户的"位置"。
我已经查找了一些API服务,例如:
  • freegeoip.net
  • api.petabyet.com
  • ip-api.com
但是我不知道如何使用这些服务来获取用户设备的位置。
实际上,我已经查找了一些Swift代码片段以实现所需的结果(获取位置),但我找不到任何与当前版本的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()

目前为止,我只有上面几行代码。但我真的希望有人能帮助我解决这个问题。


这些服务的文档告诉了你什么?你在哪里卡住了? - meaning-matters
例如,这个方案:freegeoip.net/{format}/{IP_or_hostname}。如何在我的上述函数中实现这个方案?@meaning-matters - user9225081
我的回答对你有何帮助?你有什么问题吗?我的回答 - meaning-matters
1个回答

16
你可以尝试使用http://ip-api.com/json,该网址将返回一个JSON格式的数据,如在他们的API页面中所解释的那样。

然后,你可以将这个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替代品,因此它们的使用根本没有被证明是合理的。此外,没有必要从主线程调用完成处理程序。 - Dávid Pásztor
太酷了!我从未想过在一个简单的JSON返回中可以获得如此细致的数据。 - Adrian

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