Ich möchte die IP-Adresse meines iPad programmgesteuert erhalten. Wie kann ich das Netzwerksubsystem abfragen, um herauszufinden, wie meine IPv4- (und IPv6-) Adressen lauten?
PS: Kann ich IPv6 irgendwie deaktivieren?
ios
macos
ip-address
ipv6
Wilbur
quelle
quelle
Antworten:
Der folgende Code findet alle IPv4- und IPv6-Adressen auf einem iOS- oder OSX-Gerät. Die erste
getIPAddress
Methode fungiert mehr oder weniger als der ältere Code in dieser Antwort: Sie können entweder die eine oder die andere Typadresse bevorzugen, und sie bevorzugt immer WIFI gegenüber Mobilfunk (offensichtlich können Sie dies ändern).Interessanterweise kann ein Wörterbuch aller gefundenen Adressen zurückgegeben werden, wobei Adressen für
not up
Schnittstellen oder damit verbundene Adressen übersprungen werdenloopback
. Der vorherige Code sowie andere Lösungen zu diesem Thema dekodieren IPv6 nicht ordnungsgemäß (inet_ntoa kann sie nicht verarbeiten). Dies wurde mir von Jens Alfke in einem Apple-Forum mitgeteilt - die richtige Funktion ist inet_ntop (siehe Manpage, oder lesen Sie diesen Artikel von inet_ntop, der ebenfalls von Jens bereitgestellt wird.Die Wörterbuchschlüssel haben die Form "Schnittstelle" / "IPv4 oder IPv6".
EDIT1: Code aktualisiert am 16. Mai 2014 (Fehler von lhunath, siehe Kommentare). Loopback-Adressen werden jetzt zurückgegeben, aber Sie können den Test leicht auskommentieren, um sie selbst auszuschließen.
EDIT2: (von einer unbekannten Person): Weiter verbessert 13. März 2015: Wenn der Benutzer ein VPN verwendet (unabhängig von WLAN oder Mobilfunk), wäre der vorherige Code fehlgeschlagen. Jetzt funktioniert es sogar mit VPN-Verbindungen. VPN-Verbindungen haben Vorrang vor WLAN und Mobilfunk, da das Gerät so damit umgeht. Dies sollte sogar für Macs funktionieren, da die VPN-Verbindung auf einem Mac ebenfalls IF utun0 verwendet, jedoch nicht getestet wurde.
EDIT3: (08.09.2016) Angesichts der Probleme von @Qiulang (siehe Kommentare) mit dem VPN-Code (den jemand anderes hinzugefügt hat) habe ich ihn auskommentiert. Wenn jemand definitiv weiß, wie man ein Benutzer-VPN angibt, meldet sich bitte mit einem Kommentar.
quelle
addr
wird NULL? Meine Benutzer erhalten gelegentlich NULL. Weißt du was mögliche Gründe sind?AF_INET
, um zu überprüfen. könnte das sein?In Ihrer Implementierungsdatei .m,
quelle
Viele vorhandene Lösungen berücksichtigen nur drahtlose Schnittstellen, die für kabelgebundene Verbindungen über einen Ethernet-Adapter (dh kein WLAN oder 3G) nicht funktionieren. Sehen Sie sich diese neuere Lösung an, die IP-Adressen berücksichtigt, die auch über kabelgebundene Schnittstellen erhalten werden.
iPad: So erhalten Sie die IP-Adresse programmgesteuert VERDRAHTET (nicht über WLAN)
quelle
Holen Sie sich die IP-Adresse mit Swift 3:
quelle
Die aktuelle Lösung gibt das en0-Gerät unter OS X nicht zurück. Der folgende Code verwendet das System Configuration Framework, um die Schnittstellen abzurufen, und verwendet dann Standard-C-Funktionen, um die IP-Adresse abzurufen.
quelle
Diese Antwort wurde von der Antwort von @ DavidH inspiriert. Ich reparierte einige Probleme, ersetzt
inet_ntop
mitgetnameinfo
denen ermöglicht eine sauberere Ansatz. Beachten Sie, dass dies ein Wörterbuch ergibt, das einen Schnittstellennamen einem Array von IP-Adressen zuordnet (einer Schnittstelle können technisch gesehen mehrere IPv4- und IPv6-Adressen zugeordnet sein). Es wird nicht zwischen IPv4 und IPv6 unterschieden:quelle
strf
- ist das eine Hilfsfunktion, die Sie in Ihrem Code haben?err
undstrf
. Sie können einfach ersetzenstrf
mit-stringWithCString:encoding:
.err
ist einNSLog
Wrapper, der auch die Datei und die Zeile ausgibt. github.com/Lyndir/Pearl/blob/master/Pearl/…Die Antwort von @ DavidH funktioniert einwandfrei, bis ich dieses Ergebnis von einem 4G-Mobilfunknetz erhalten habe:
Ich benutze kein VPN, daher habe ich keine Ahnung, warum ich ein utun0 / ipv6 hatte.
--- Aktualisiert ---
Ich habe dieses Problem weiter behoben und festgestellt, dass ich auch in anderen 4G-Netzwerken eine gefälschte VPN-Adresse erhalten kann (ist das ein iOS-Fehler?).
Wenn ich VPN verwendet habe, bekomme ich Folgendes:
Es ist also utun1 NICHT utun0
Ohne herauszufinden, warum ich nur den VPN-Check fallen lassen muss :(
---- Update ----
Ich habe einen Fehler (28131847) bei Apple ausgelöst und geantwortet: "Nicht alle Utun-Schnittstellen sind für VPN. Es gibt andere Betriebssystemfunktionen, die Utun-Schnittstellen verwenden."
Als ich dann fragte, wie man eine gültige VPN-IP-Adresse erhält, war ihre Antwort ziemlich enttäuscht: "Sie können unter Einstellungen -> VPN Ihre VPN-Konfiguration überprüfen, um festzustellen, ob das VPN aktiv ist. In einigen Fällen können Sie die sehen Dort wurde auch die IP-Adresse zugewiesen. Wir schließen jetzt diesen Fehlerbericht. " :((
---- Update 2016/11/04 ----
Ich habe das Problem erneut festgestellt und muss die Antwort von @ DavidH weiter ändern, um es zu beheben:
Ich war im 4G-Netzwerk und habe folgende Adresse erhalten:
Mit seiner ursprünglichen Antwort erhalte ich die WLAN-IP fe80 :: 8dd: 7d92: 4159: 170e, die gefälscht war und die Verbindung fehlgeschlagen ist.
Also habe ich den Code so geändert, dass er gefällt.
quelle
Tolle Lösung für Swift in Diese Datei, die alle Details enthält.
In einer meiner Apps muss ich die WLAN-IP-Adresse abrufen. Ich habe die obigen Antworten in Swift 3 wie folgt verwendet:
In diesem Code stürzt es ab, weil ich
nil
in jeder Anweisung, mit der ich optional gearbeitet habe, nachsehen muss?
. Daher ist es für mich besser, eine bestimmte verknüpfte Datei in meiner Klasse zu verwenden. Es fällt mir jetzt leicht, Folgendes zu überprüfen:Ich habe eine Zeichenfolge analysiert,
"."
da die Schnittstellenklasse zwei Schnittstellen in meinem iPhone füren0
Adressen wie "fb00 ::" und Adressen wie "101.10.1.1" zurückgibt.quelle
Ich habe eine einfache Datei erstellt, um die IP-Adresse zu erhalten. Ich habe diese Lösung auf die Antworten von @ lundhjem, @ DavidH und @ Ihunath gestützt. Es werden Kabelverbindungen berücksichtigt. Ich habe VPN jedoch nicht in diese Lösung aufgenommen.
PCNetwork.h
PCNetwork.m
quelle
in iOS 13.4.1 funktioniert bei mir nicht. Ich benutze dieses Update.
quelle