Je souhaite obtenir l'adresse IP de mon iPad par programmation. Comment puis-je interroger le sous-système réseau pour savoir quelles sont mes adresses IPv4 (et IPv6)?
PS: Puis-je désactiver IPv6 d'une manière ou d'une autre?
ios
macos
ip-address
ipv6
Wilbur
la source
la source
Réponses:
Le code suivant trouve toutes les adresses IPv4 et IPv6 sur un appareil iOS ou OSX. La première
getIPAddress
méthode agit plus ou moins comme l'ancien code dans cette réponse: vous pouvez préférer l'un ou l'autre type d'adresse, et elle préfère toujours le WIFI au cellulaire (vous pouvez évidemment changer cela).Plus intéressant encore, il peut renvoyer un dictionnaire de toutes les adresses trouvées, ignorer les adresses des
not up
interfaces ou les adresses associées àloopback
. Le code précédent ainsi que d'autres solutions sur ce sujet ne décoderont pas correctement IPv6 (inet_ntoa ne peut pas les gérer). Cela m'a été signalé par Jens Alfke sur un forum Apple - la fonction appropriée à utiliser est inet_ntop (regardez la page de manuel, et / ou référez-vous à cet article inet_ntop également fourni par Jens.Les clés du dictionnaire ont la forme "interface" "/" "ipv4 ou ipv6".
EDIT1: Code mis à jour le 16 mai 2014 (bug signalé par lhunath, voir commentaires). Les adresses de bouclage sont maintenant renvoyées, mais il est facile pour vous de décommenter le test pour les exclure vous-même.
EDIT2: (par une personne inconnue): Amélioration supplémentaire 13 mars 2015: Dans le cas où l'utilisateur utilise un VPN (indépendamment du WiFi ou du cellulaire), le code précédent aurait échoué. Maintenant, cela fonctionne même avec des connexions VPN. Les connexions VPN ont la priorité sur WiFi et Cell, car c'est ainsi que l'appareil le gère. Cela devrait même fonctionner pour les Mac car la connexion VPN sur un Mac utilise également IF utun0 mais n'a pas été testée.
EDIT3: (9/8/2016) Compte tenu des problèmes rencontrés par @Qiulang (voir les commentaires) avec le code VPN (que quelqu'un d'autre a ajouté), je l'ai commenté. Si quelqu'un sait définitivement comment spécifier un VPN utilisateur, veuillez ajouter un commentaire.
la source
addr
obtient NULL? mes utilisateurs obtiennent parfois NULL. savez-vous quelles sont les raisons possibles?AF_INET
pour vérifier. pourrait être ça?Dans votre fichier d'implémentation .m,
la source
De nombreuses solutions existantes ne prennent en compte que les interfaces sans fil, qui ne fonctionneront pas pour les connexions filaires via un adaptateur Ethernet (c'est-à-dire pas de Wifi ou 3G); voir cette solution plus récente qui prend également en compte les adresses IP obtenues via des interfaces filaires.
iPad: Comment obtenir une adresse IP par programmation WIRED (pas via sans fil)
la source
Obtenez une adresse IP en utilisant Swift 3:
la source
La solution actuelle ne renvoie pas le périphérique en0 sur OS X, le code suivant utilise le System Configuration Framework pour obtenir les interfaces, puis utilise les fonctions C standard pour obtenir l'adresse IP.
la source
Cette réponse a été inspirée par la réponse de @ DavidH. J'ai corrigé quelques problèmes, remplacé
inet_ntop
pargetnameinfo
ce qui permet une approche plus propre. Notez que cela produit un dictionnaire qui mappe un nom d'interface à un tableau d'adresses IP (une interface peut avoir plusieurs IPv4 et IPv6 associés, techniquement). Il ne fait pas la distinction entre IPv4 et IPv6:la source
strf
- est-ce une fonction d'assistance que vous avez dans votre code?err
etstrf
. Vous pouvez simplement remplacerstrf
par-stringWithCString:encoding:
.err
est unNSLog
wrapper qui produit également le fichier et la ligne. github.com/Lyndir/Pearl/blob/master/Pearl/…La réponse de @ DavidH fonctionne bien jusqu'à ce que j'obtienne ce résultat d'un réseau cellulaire 4G:
Je n'utilise pas vpn donc je n'ai aucune idée de pourquoi j'ai eu un utun0 / ipv6.
--- Actualisé ---
J'ai encore débogué ce problème et j'ai constaté que je pouvais obtenir une fausse adresse VPN même dans d'autres réseaux 4G (est-ce un bogue iOS ??),
Si j'ai utilisé vpn, j'obtiendrai ceci:
Donc c'est utun1 PAS utun0
Sans comprendre pourquoi je devrai simplement abandonner le vpn check :(
---- mettre à jour ----
J'ai signalé un bogue (28131847) à Apple et j'ai répondu: "Toutes les interfaces utun ne sont pas destinées au VPN. Il existe d'autres fonctionnalités du système d'exploitation qui utilisent des interfaces utun."
Mais quand j'ai demandé comment obtenir une adresse IP VPN valide, leur réponse a été plutôt déçue: "Vous pouvez aller dans Paramètres -> VPN et regarder votre configuration VPN pour voir si le VPN est actif. Dans certains cas, vous pouvez voir le adresse IP assignée là aussi. Nous fermons maintenant ce rapport de bogue. " :(
---- mise à jour 04/11/2016 ----
J'ai de nouveau touché le problème et je dois modifier davantage la réponse de @ DavidH pour le résoudre:
J'étais en réseau 4G et j'ai obtenu cette adresse:
Avec sa réponse originale, j'obtiendrai l'IP wifi fe80 :: 8dd: 7d92: 4159: 170e, qui était faux et la connexion a échoué.
J'ai donc modifié le code pour aimer,
la source
Excellente solution pour swift dans ce fichier qui sert tous les détails.
Dans l'une de mes applications, je dois récupérer l'adresse IP du wifi. J'ai utilisé les réponses ci-dessus, dans Swift 3 comme ceci:
Dans ce code, il plante parce que je dois vérifier
nil
dans chaque instruction que j'ai utilisée en option avec?
. Il est donc préférable pour moi d'utiliser un fichier lié donné dans ma classe. Il devient facile pour moi de vérifier maintenant comme:J'ai analysé la chaîne
"."
car la classe d'interface renvoie deux interfaces dans mon iPhone pour uneen0
adresse comme "fb00 ::" et une adresse comme "101.10.1.1"la source
J'ai créé un fichier simple pour obtenir l'adresse IP. J'ai basé cette solution sur les réponses de @ lundhjem, @ DavidH et @ Ihunath. Il considère les connexions filaires. Cependant, je n'ai pas inclus de VPN dans cette solution.
PCNetwork.h
PCNetwork.m
la source
dans iOS 13.4.1 ne fonctionne pas pour moi. J'utilise cette solution.
la source