Ich möchte MAC-Adresse und IP-Adresse programmgesteuert in einer iPhone-Anwendung erhalten.
Wifi MAC-Adresse? oder BlueTooth? Es gibt viele Mac-Adressen.
mskw
11
Ab iOS 7 gibt das System den Wert immer zurück, 02:00:00:00:00:00wenn Sie auf einem Gerät nach der MAC-Adresse fragen. Überprüfen Sie meine Antwort unten.
Ich frage mich nur, ob dies etwas anderes ist als ein generischer OS X-Ansatz (ich frage, weil ich ein Mac n00b bin)
Tamas Czinege
2
@abc: Ich empfehle dir eine weitere Frage dazu zu stellen. Sei besser, als es in Kommentaren für eine andere Frage zu vergraben.
PyjamaSam
1
aber was ist mit dem Aufruf von ether_ntoa? Das ist eine private API, nicht wahr?
Stigi
1
@NicTesla Ich kann nicht sicher kommentieren, aber da es nur grundlegende Netzwerkanrufe macht, kann ich kein Problem sehen. Obwohl das Entfernen der UDID von iOS5, wenn die Mac-Adresse abgerufen und zur Entwicklung einer alternativen eindeutigen Kennung verwendet wird, möglicherweise irgendwann in der Zukunft von Apple überprüft wird.
#include<sys/socket.h>#include<sys/sysctl.h>#include<net/if.h>#include<net/if_dl.h>...-(NSString*)getMacAddress
{int mgmtInfoBase[6];char*msgBuffer = NULL;size_t length;unsignedchar macAddress[6];struct if_msghdr *interfaceMsgStruct;struct sockaddr_dl *socketStruct;NSString*errorFlag = NULL;// Setup the management Information Base (mib)
mgmtInfoBase[0]= CTL_NET;// Request network subsystem
mgmtInfoBase[1]= AF_ROUTE;// Routing table info
mgmtInfoBase[2]=0;
mgmtInfoBase[3]= AF_LINK;// Request link layer information
mgmtInfoBase[4]= NET_RT_IFLIST;// Request all configured interfaces// With all configured interfaces requested, get handle indexif((mgmtInfoBase[5]= if_nametoindex("en0"))==0)
errorFlag =@"if_nametoindex failure";else{// Get the size of the data available (store in len)if(sysctl(mgmtInfoBase,6, NULL,&length, NULL,0)<0)
errorFlag =@"sysctl mgmtInfoBase failure";else{// Alloc memory based on above callif((msgBuffer = malloc(length))== NULL)
errorFlag =@"buffer allocation failure";else{// Get system information, store in bufferif(sysctl(mgmtInfoBase,6, msgBuffer,&length, NULL,0)<0)
errorFlag =@"sysctl msgBuffer failure";}}}// Befor going any further...if(errorFlag != NULL){NSLog(@"Error: %@", errorFlag);return errorFlag;}// Map msgbuffer to interface message structure
interfaceMsgStruct =(struct if_msghdr *) msgBuffer;// Map to link-level socket structure
socketStruct =(struct sockaddr_dl *)(interfaceMsgStruct +1);// Copy link layer address data in socket structure to an array
memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen,6);// Read from char array into a string object, into traditional Mac address formatNSString*macAddressString =[NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
macAddress[0], macAddress[1], macAddress[2],
macAddress[3], macAddress[4], macAddress[5]];NSLog(@"Mac Address: %@", macAddressString);// Release the buffer memory
free(msgBuffer);return macAddressString;}
Ändern Sie den Link zu mobiledevelopertips anstelle von iphonedevelopertips
SEG
Apple wird dies in iOS7 SEHR wahrscheinlich brechen ... und wir könnten dies erst öffentlich kommentieren, wenn es ausgeliefert wird, außer in den offiziellen Apple Dev-Foren.
Gabe
3
Dies funktionierte auf meinem iPhone5 mit iOS7 nicht. Es gibt mir: 02: 00: 00: 00: 00: 00, was nicht richtig ist.
Sjoerd Perfors
3
@Brenden Mit PublicAPI unter iOS7 können Sie keine Netzwerk-MAC-Adresse mehr abrufen. Wenn Sie also eine eindeutige ID benötigen, sollten SieIdentifierManager
ArtFeel
2
@SjoerdPerfors Unter iOS 7 erhalten Sie in der Tat immer die gleiche Adresse 02:00:00:00:00:00wie eine Datenschutzmaßnahme von Apple.
Basil Bourque
31
Ich wollte, dass etwas die Adresse zurückgibt, unabhängig davon, ob WLAN aktiviert ist oder nicht, daher funktionierte die gewählte Lösung für mich nicht. Ich habe einen anderen Anruf verwendet, den ich nach einigen Optimierungen in einem Forum gefunden habe. Am Ende hatte ich Folgendes (entschuldigen Sie mein rostiges C):
Dieser funktioniert bei mir nicht ... sagt, dass ifName nicht so deklariert ist wie die Variable macaddress.
Bugfixr
Der obige Aufrufcode leckt. kostenlos (macAddressString); bevor Sie von der obigen aufrufenden Methode zurückkehren. Außerdem sollte macAddress automatisch freigegeben werden, wenn sich der obige Aufrufcode in einer anderen Methode befindet.
4
Um klar zu sein, der Code selbst wird nicht auslaufen. Der Kommentator hat am Ende über das aufrufende Snippet gesprochen, bei dem ich zwei Zeichenfolgen zugewiesen habe, ohne sie freizugeben.
Schiffsführer
1
Ich habe dies in eine nette Objective-C-Methode eingefügt
wsidell
23
Ab iOS 7 gibt das System den Wert immer zurück, 02:00:00:00:00:00wenn Sie auf einem Gerät nach der MAC-Adresse fragen.
Wenn Sie in iOS 7 und höher nach der MAC-Adresse eines iOS-Geräts fragen, gibt das System den Wert 02: 00: 00: 00: 00: 00 zurück. Wenn Sie das Gerät identifizieren müssen, verwenden Sie stattdessen die Eigenschaft identifierForVendor von UIDevice. (Apps, die eine Kennung für ihre eigenen Werbezwecke benötigen, sollten stattdessen die Eigenschaft "AdvertisingIdentifier" von ASIdentifierManager verwenden.) "
NICInfoSummary* summary =[[[NICInfoSummary alloc] init] autorelease];// en0 is for WiFi NICInfo* wifi_info =[summary findNICInfo:@"en0"];// you can get mac address in 'XX-XX-XX-XX-XX-XX' formNSString* mac_address =[wifi_info getMacAddressWithSeparator:@"-"];// ip can be multipleif(wifi_info.nicIPInfos.count >0){NICIPInfo* ip_info =[wifi_info.nicIPInfos objectAtIndex:0];NSString* ip = ip_info.ip;NSString* netmask = ip_info.netmask;NSString* broadcast_ip = ip_info.broadcastIP;}else{NSLog(@"WiFi not connected!");}
Sehr schöne und nützliche Klasse! Gute Arbeit! Sie haben jedoch beide Klassen [super dealloc] verpasst und vergessen, eine Bibliothek einzuschließen, was zu Warnungen in xCode führt. Die gepatchte Version finden Sie hier: raptor.hk/download/NICInfo_raptor_patched.zip
Raptor
Erhalten dieses Ergebnisses Mac-Adresse: 02: 00: 00: 00: 00: 00
Ich verwende Ihre Lösung. 99% der Fälle funktionieren wie erwartet, aber 1% kann die Mac-Adresse nicht abrufen. Geben Sie NULL zurück, wie von den Benutzern im AppStore gemeldet. Immer noch keine reproduzierbaren Schritte, hast du es? Danke dir.
Jianhua
Ich habe noch keine Probleme bemerkt, aber ich werde aufpassen!
Grantland Chew
Weiterverfolgung des Kommentars von @ jianhua: Wir haben gerade Berichte von einem Benutzer erhalten, der die App grundsätzlich nicht verwenden kann, da dieser Code für sein Gerät null zurückgibt (wir verwenden die Kennung, um jeden Serveranruf zu authentifizieren).
Samvermette
Der fehlgeschlagene Fall ist auf dem iPhone 4S mit IOS Version 5.0.1, natürlich nur zu besonderen Anlässen.
Jianhua
5
Jetzt geben iOS 7-Geräte - immer eine MAC-Adresse von 02: 00: 00: 00: 00: 00 zurück.
Verwenden Sie daher besser [UIDevice identifierForVendor].
Rufen Sie diese Methode besser auf, um einen app-spezifischen eindeutigen Schlüssel zu erhalten
/* Original source code courtesy John from iOSDeveloperTips.com */#include<sys/socket.h>#include<sys/sysctl.h>#include<net/if.h>#include<net/if_dl.h>+(NSString*)getMacAddress
{int mgmtInfoBase[6];char*msgBuffer = NULL;NSString*errorFlag = NULL;size_t length;// Setup the management Information Base (mib)
mgmtInfoBase[0]= CTL_NET;// Request network subsystem
mgmtInfoBase[1]= AF_ROUTE;// Routing table info
mgmtInfoBase[2]=0;
mgmtInfoBase[3]= AF_LINK;// Request link layer information
mgmtInfoBase[4]= NET_RT_IFLIST;// Request all configured interfaces// With all configured interfaces requested, get handle indexif((mgmtInfoBase[5]= if_nametoindex("en0"))==0)
errorFlag =@"if_nametoindex failure";// Get the size of the data available (store in len)elseif(sysctl(mgmtInfoBase,6, NULL,&length, NULL,0)<0)
errorFlag =@"sysctl mgmtInfoBase failure";// Alloc memory based on above callelseif((msgBuffer = malloc(length))== NULL)
errorFlag =@"buffer allocation failure";// Get system information, store in bufferelseif(sysctl(mgmtInfoBase,6, msgBuffer,&length, NULL,0)<0){
free(msgBuffer);
errorFlag =@"sysctl msgBuffer failure";}else{// Map msgbuffer to interface message structurestruct if_msghdr *interfaceMsgStruct =(struct if_msghdr *) msgBuffer;// Map to link-level socket structurestruct sockaddr_dl *socketStruct =(struct sockaddr_dl *)(interfaceMsgStruct +1);// Copy link layer address data in socket structure to an arrayunsignedchar macAddress[6];
memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen,6);// Read from char array into a string object, into traditional Mac address formatNSString*macAddressString =[NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X",
macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]];NSLog(@"Mac Address: %@", macAddressString);// Release the buffer memory
free(msgBuffer);return macAddressString;}// Error...NSLog(@"Error: %@", errorFlag);return nil;}
und ich verstehe nicht, warum ich Kommentare für meine eigenen Antworten hinzufügen kann, aber nicht für die Antworten anderer? : /
Cœur
1
Weil dein Ruf nicht hoch genug ist.
Honus
Vielen Dank, es sieht so aus, als hätten sich einige Leute ihre eigenen Varianten dieser Lösung ausgedacht
josh-fuggle
1
Auf Geräten mit iOS 7.0 oder höher ist dies nicht mehr möglich. Daher ist es nicht möglich , die MAC-Adresse in Swift abzurufen.
Wie Apple sagte:
Wenn Sie in iOS 7 und höher nach der MAC-Adresse eines iOS-Geräts fragen, gibt das System den Wert 02: 00: 00: 00: 00: 00 zurück. Wenn Sie das Gerät identifizieren müssen, verwenden Sie stattdessen die Eigenschaft identifierForVendor von UIDevice. (Apps, die eine Kennung für ihre eigenen Werbezwecke benötigen, sollten stattdessen die Eigenschaft "AdvertisingIdentifier" von ASIdentifierManager verwenden.)
In den meisten Fällen wird eine Mac-Adresse benötigt, um das Gerät eindeutig zu identifizieren. Stattdessen können Sie diese Lösung verwenden.
Denis Kutlubaev
0
Viele dieser Fragen beziehen sich nur auf die Mac-Adresse. Wenn Sie auch die IP-Adresse benötigen, die ich gerade geschrieben habe, müssen Sie möglicherweise etwas arbeiten, scheinen aber auf meinem Computer gut zu funktionieren ...
-(NSString*)getLocalIPAddress
{NSArray*ipAddresses =[[NSHost currentHost] addresses];NSArray*sortedIPAddresses =[ipAddresses sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];NSNumberFormatter*numberFormatter =[[NSNumberFormatter alloc] init];
numberFormatter.allowsFloats = NO;for(NSString*potentialIPAddress in sortedIPAddresses){if([potentialIPAddress isEqualToString:@"127.0.0.1"]){continue;}NSArray*ipParts =[potentialIPAddress componentsSeparatedByString:@"."];
BOOL isMatch = YES;for(NSString*ipPart in ipParts){if(![numberFormatter numberFromString:ipPart]){
isMatch = NO;break;}}if(isMatch){return potentialIPAddress;}}// No IP foundreturn@"?.?.?.?";}
02:00:00:00:00:00
wenn Sie auf einem Gerät nach der MAC-Adresse fragen. Überprüfen Sie meine Antwort unten.Antworten:
HINWEIS Ab iOS7 können Sie keine Geräte-MAC-Adressen mehr abrufen. Es wird ein fester Wert anstelle des tatsächlichen MAC zurückgegeben
Etwas, über das ich vor einiger Zeit gestolpert bin. Ursprünglich von hier aus habe ich es ein wenig modifiziert und aufgeräumt.
IPAddress.h
IPAddress.c
Und um es zu benutzen
Die Adapternamen variieren je nach Simulator / Gerät sowie WLAN oder Zelle auf dem Gerät.
quelle
ether_ntoa
Warnung Besuche: stackoverflow.com/a/13412265/88597Update: Dies funktioniert nicht unter iOS 7. Sie sollten ASIdentifierManager verwenden .
Sauberere Lösung auf der MobileDeveloperTips-Website:
quelle
IdentifierManager
02:00:00:00:00:00
wie eine Datenschutzmaßnahme von Apple.Ich wollte, dass etwas die Adresse zurückgibt, unabhängig davon, ob WLAN aktiviert ist oder nicht, daher funktionierte die gewählte Lösung für mich nicht. Ich habe einen anderen Anruf verwendet, den ich nach einigen Optimierungen in einem Forum gefunden habe. Am Ende hatte ich Folgendes (entschuldigen Sie mein rostiges C):
Und dann würde ich es so nennen und nach en0 fragen :
quelle
Ab iOS 7 gibt das System den Wert immer zurück,
02:00:00:00:00:00
wenn Sie auf einem Gerät nach der MAC-Adresse fragen.Referenz: Releasenoten
quelle
Es gibt verschiedene Lösungen dafür, aber ich konnte keine ganze Sache finden. Also habe ich meine eigene Lösung gemacht für:
nicinfo
Wie benutzt man :
quelle
Dies sieht nach einer ziemlich sauberen Lösung aus: UIDevice BIdentifier
quelle
Jetzt geben iOS 7-Geräte - immer eine MAC-Adresse von 02: 00: 00: 00: 00: 00 zurück.
Verwenden Sie daher besser [UIDevice identifierForVendor].
Rufen Sie diese Methode besser auf, um einen app-spezifischen eindeutigen Schlüssel zu erhalten
Kategorie wird besser geeignet
importiere "UIDevice + Identifier.h"
Rufen Sie nun die obige Methode auf, um eine eindeutige Adresse zu erhalten
quelle
@Grantland Diese "ziemlich saubere Lösung" ähnelt meiner eigenen Verbesserung gegenüber der iPhoneDeveloperTips-Lösung.
Sie können meinen Schritt hier sehen: https://gist.github.com/1409855/
quelle
Auf Geräten mit iOS 7.0 oder höher ist dies nicht mehr möglich. Daher ist es nicht möglich , die MAC-Adresse in Swift abzurufen.
Wie Apple sagte:
quelle
...
quelle
So erstellen Sie einen uniqueString basierend auf der eindeutigen Kennung des Geräts in iOS 6:
quelle
Viele dieser Fragen beziehen sich nur auf die Mac-Adresse. Wenn Sie auch die IP-Adresse benötigen, die ich gerade geschrieben habe, müssen Sie möglicherweise etwas arbeiten, scheinen aber auf meinem Computer gut zu funktionieren ...
quelle