Из документации 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 { }
.