Можно ли получить приблизительное местоположение пользователя без разрешения в iOS? - PullRequest
0 голосов
/ 08 апреля 2020

Как бы вы порекомендовали получить страну пользователя без разрешения пользователя? Можно ли использовать триангуляцию вышек сотовой связи или Wi-Fi для определения приблизительного местоположения? Как еще вы предлагаете угадать, в какой стране находится пользователь?

1 Ответ

3 голосов
/ 08 апреля 2020

Из документации Apple

Важно: В дополнение к отсутствию аппаратного обеспечения пользователь может запретить приложению доступ к данным службы определения местоположения. Во время первоначального использования приложением базовая структура местоположения предлагает пользователю подтвердить, что использование службы определения местоположения является приемлемым. Если пользователь отклоняет запрос, объект CLLocationManager сообщает о соответствующей ошибке своему делегату во время будущих запросов. Вы также можете проверить явный статус авторизации приложения, используя метод authorizationStatus.

Поэтому, даже если существует какой-то хитрый способ избежать разрешения, вы будете отклонены на этапе проверки.


Каким другим способом вы предлагаете угадать, в какой стране находится пользователь?

Вы можете получить эту информацию, используя IP-адрес.


Swift 4 - Получить IP-адрес устройства:

Добавить #include<ifaddrs.h> в заголовок моста.

Это структура, необходимая для получения IP-адреса.

class func getIPAddress() -> String? {
        var address: String?
        var ifaddr: UnsafeMutablePointer<ifaddrs>? = nil
        if getifaddrs(&ifaddr) == 0 {
            var ptr = ifaddr
            while ptr != nil {
                defer { ptr = ptr?.pointee.ifa_next }

                let interface = ptr?.pointee
                let addrFamily = interface?.ifa_addr.pointee.sa_family
                if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {

                    if let name: String = String(cString: (interface?.ifa_name)!), name == "en0" {
                        var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
                        getnameinfo(interface?.ifa_addr, socklen_t((interface?.ifa_addr.pointee.sa_len)!), &hostname, socklen_t(hostname.count), nil, socklen_t(0), NI_NUMERICHOST)
                        address = String(cString: hostname)
                    }
                }
            }
            freeifaddrs(ifaddr)
        }
        return address
}

Получить страну, используя IP-адрес

Вы можете начать с попытки 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 вызывается в основном потоке, если вы будете использовать результат для обновления пользовательского интерфейса. Если нет, вы можете удалить DispatchQueue.main.async { }.

...