Привет. Подскажите, кто-нибудь сталкивался с задачей получить IP адрес устройства?
Мне нужно получить IP устр с которого юзер подключается к серверу.
Все что удалось найти - либо не работает, либо работает некорректно…
Может у кого есть решения. Буду признателен.
Как получить IP Address?
У себя на бэкенде сделайте метод который будет отдавать ip адрес клиента. Это одна или несколько строк кода в зависимости от серверного языка. Или можете воспользоваться публичным сервисом, например https://api.ipify.org
Затем клиентом делаете к нему простой http запрос и ip у вас в ответе.
- На чем у вас бэкенд
- Что вы уже пробовали
У любого языка есть метод для получения IP клиента. Не работать тут просто не может.
@id0 для чего отдавать IP клиента, если его нужно получить? И для чего публичные сервисы? Зачем лишний геморой.
P.S. и вы учтите, что телефоны не имеют своего IP адреса, они отдают IP адрес точки подключения в случае с WiFi, либо IP адрес сотовой вышки или оператора (тут не уверен).
Получение ip устройства. Вдруг поможет?
class IPAddressManager {
//MARK: - Public
public var currentIpAddresses: String {
let firstAddress = self.localAddresses().first(where: { (item) -> Bool in
return NSPredicate.ipMask.evaluate(with: item)
})
return firstAddress ?? ""
}
//MARK: - Private
private func localAddresses() -> [String] {
var addresses = [String]()
var ifaddr: UnsafeMutablePointer<ifaddrs>?
guard getifaddrs(&ifaddr) == 0 else { return [] }
guard let firstAddr = ifaddr else { return [] }
for ptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
let flags = Int32(ptr.pointee.ifa_flags)
let addr = ptr.pointee.ifa_addr.pointee
if (flags & (IFF_UP|IFF_RUNNING|IFF_LOOPBACK)) == (IFF_UP|IFF_RUNNING) {
if addr.sa_family == UInt8(AF_INET) || addr.sa_family == UInt8(AF_INET6) {
var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
if (getnameinfo(ptr.pointee.ifa_addr, socklen_t(addr.sa_len), &hostname, socklen_t(hostname.count), nil, socklen_t(0), NI_NUMERICHOST) == 0) {
let address = String(cString: hostname)
if address.rangeOfCharacter(from: .letters) == nil {
addresses.append(address)
}
}
}
}
}
freeifaddrs(ifaddr)
return addresses
}
}
//....
print(IPAddressManager().currentIpAddresses)
А теперь спрашивается зачем на телефоне получать IP адрес.
Если нужно где-то на сервере его получить, так это делается средствами самого сервера куда проще.
По вопросу тс я понял, что ему нужен внешний ip адрес в интернете, а не в локальной сети. А встроенные методы языка отдают как раз локальный ip.
По поводу отдать/получить –– всё правильно, сервер его определяет и отдаёт клиенту, а клиент получает. Публичный сервис это так для примера, если тс не может или не хочет делать на своём сервере.
Как раз-таки сервера получают внешний IP адрес.
Локальные, которые определяются только внутри сети (192.168.0…), он им не нужен.
На девайсе делать что-то такого рода - это извращение.
Ну так может тс хочет показать пользователю его внешний ip адрес, о чём я изначально и подумал. Из его вопроса не очень понятно для каких целей он ему нужен, вот я и написал, что внешний ip определяется на стороне сервера, а потом его уже можно вернуть на клиент.
Всем спасибо за советы, делал как написал Tau, но на выходе был IP роутера. В итоге сделал через https://api.ipify.org .