zastanawiam się tylko, czy to różni się od ogólnego podejścia do OS X (pytam, ponieważ jestem mac n00b)
Tamas Czinege
2
@abc: Polecam zadać kolejne pytanie na ten temat. Lepiej będzie, jeśli pochowaj to w komentarzach pod innym pytaniem.
PyjamaSam
1
ale co z wywołaniem ether_ntoa? to jest prywatny interfejs API, prawda?
stigi
1
@NicTesla Nie mogę komentować na pewno, ale ponieważ wykonuje tylko podstawowe połączenia sieciowe, nie widzę problemu. Chociaż to powiedziawszy po usunięciu identyfikatora UDID z iOS5, uzyskaniu adresu mac i wykorzystaniu go do opracowania alternatywnego unikalnego identyfikatora, firma Apple może w pewnym momencie w przyszłości zbadać sprawę.
#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;}
zmień link na mobiledevelopertips zamiast iphonedevelopertips
SEG
Apple jest BARDZO prawdopodobne, że zepsuje to w iOS7 ... i nie moglibyśmy tego publicznie komentować, dopóki nie zostanie opublikowany, z wyjątkiem oficjalnych forów Apple Dev.
Gabe
3
To nie zadziałało na moim iPhonie5 z iOS7. Daje mi to: 02: 00: 00: 00: 00: 00, co nie jest w porządku.
Sjoerd Perfors
3
@Brenden Nie można już uzyskać sieciowego adresu MAC za pomocą PublicAPI na iOS7. Więc jeśli potrzebujesz unikalnego identyfikatora, powinieneś użyćIdentifierManager
ArtFeel
2
@SjoerdPerfors W systemie iOS 7 rzeczywiście zawsze otrzymasz ten sam adres, 02:00:00:00:00:00co zabezpieczenie prywatności firmy Apple.
Basil Bourque
31
Chciałem, żeby coś zwróciło adres, niezależnie od tego, czy włączone było wifi, czy nie, więc wybrane rozwiązanie nie zadziałało. Użyłem innego połączenia, które znalazłem na jakimś forum po pewnych poprawkach. Skończyło się na tym (przepraszam mój zardzewiały C):
Ten nie działa dla mnie ... mówi, że ifName nie jest zadeklarowana, podobnie jak zmienna macaddress.
bugfixr
Powyższy kod wywołujący wycieknie. wolne (macAddressString); przed powrotem z powyższej metody wywołania. Ponadto adres macAddress powinien być automatycznie udostępniany, jeśli powyższy kod wywołujący znajduje się w innej metodzie.
4
żeby było jasne, sam kod nie wycieknie, komentator mówił o fragmencie wywołującym na końcu, gdzie przydzielam dwa stringi bez ich zwalniania.
kapitan statku
1
Umieściłem to w ładnej metodzie obiektywnej c i sprawiłem,
wsidell
23
Począwszy od iOS 7, system zawsze zwraca wartość, 02:00:00:00:00:00gdy pytasz o adres MAC na dowolnym urządzeniu.
W systemie iOS 7 i nowszych, jeśli poprosisz o adres MAC urządzenia iOS, system zwróci wartość 02: 00: 00: 00: 00: 00. Jeśli chcesz zidentyfikować urządzenie, użyj zamiast tego właściwości identifierForVendor UIDevice. (Aplikacje, które potrzebują identyfikatora do własnych celów reklamowych, powinny zamiast tego rozważyć użycie właściwości advertisingIdentifier ASIdentifierManager) ”.
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!");}
Bardzo fajna i przydatna klasa! Dobra robota! Jednak przegapiłeś [super dealloc] na obu klasach i zapomniałeś dołączyć bibliotekę, co prowadzi do ostrzeżeń w xCode. Poprawioną wersję można znaleźć tutaj: raptor.hk/download/NICInfo_raptor_patched.zip
Raptor
uzyskiwanie tego wyniku Adres Mac: 02: 00: 00: 00: 00: 00
Korzystam z twojego rozwiązania, 99% przypadków działa zgodnie z oczekiwaniami, ale 1% stawki nie może uzyskać adresu MAC, zwrócić NULL, zgłoszone przez użytkowników w AppStore. Nadal nie można uzyskać powtarzalnych kroków, czy masz to? Dziękuję Ci.
jianhua
Nie zauważyłem jeszcze żadnych problemów, ale będę uważać!
Grantland Chew
W związku z komentarzem @ jianhua: właśnie otrzymaliśmy raporty od użytkownika, który w zasadzie nie może korzystać z aplikacji, ponieważ ten kod zwraca wartość null dla swojego urządzenia (używamy identyfikatora do uwierzytelniania każdego wywołania serwera).
samvermette
Nieudany przypadek znajduje się na iPhonie 4S z systemem IOS w wersji 5.0.1, oczywiście tylko przy niektórych specjalnych okazjach.
jianhua,
5
Teraz urządzenia iOS 7 - zawsze zwracają adres MAC 02: 00: 00: 00: 00: 00.
Więc lepiej użyj [UIDevice identifierForVendor].
więc lepiej wywołać tę metodę, aby uzyskać unikalny klucz specyficzny dla aplikacji
/* 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;}
Nie jest już możliwe na urządzeniach z systemem iOS 7.0 lub nowszym, dlatego nie można uzyskać adresu MAC w Swift.
Jak stwierdził Apple:
W systemie iOS 7 i nowszych, jeśli poprosisz o adres MAC urządzenia iOS, system zwróci wartość 02: 00: 00: 00: 00: 00. Jeśli chcesz zidentyfikować urządzenie, użyj zamiast tego właściwości identifierForVendor UIDevice. (Aplikacje, które potrzebują identyfikatora do własnych celów reklamowych, powinny zamiast tego rozważyć użycie właściwości advertisingIdentifier ASIdentifierManager).
W większości przypadków do jednoznacznej identyfikacji urządzenia potrzebny jest adres Mac. Zamiast tego możesz skorzystać z tego rozwiązania.
Denis Kutlubaev
0
Wiele z tych pytań dotyczy tylko adresu Mac. Jeśli potrzebujesz również adresu IP, który właśnie napisałem, może wymagać trochę pracy, ale wydaje się, że działa dobrze na moim komputerze ...
-(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
gdy pytasz o adres MAC na dowolnym urządzeniu. Sprawdź moją odpowiedź poniżej.Odpowiedzi:
UWAGA Od iOS7 nie można już pobierać adresów MAC urządzeń. Zwrócona zostanie stała wartość zamiast rzeczywistego adresu MAC
Coś, na co natknąłem się jakiś czas temu. Pierwotnie stąd trochę go zmodyfikowałem i uporządkowałem.
IPAddress.h
IPAddress.c
I użyć go
Nazwy adapterów różnią się w zależności od symulatora / urządzenia, a także sieci Wi-Fi lub komórki w urządzeniu.
źródło
ether_ntoa
ostrzeżenia, sprawdź: stackoverflow.com/a/13412265/88597Aktualizacja: to nie zadziała na iOS 7. Powinieneś użyć ASIdentifierManager .
Bardziej przejrzyste rozwiązanie na stronie MobileDeveloperTips:
źródło
IdentifierManager
02:00:00:00:00:00
co zabezpieczenie prywatności firmy Apple.Chciałem, żeby coś zwróciło adres, niezależnie od tego, czy włączone było wifi, czy nie, więc wybrane rozwiązanie nie zadziałało. Użyłem innego połączenia, które znalazłem na jakimś forum po pewnych poprawkach. Skończyło się na tym (przepraszam mój zardzewiały C):
A potem nazwałbym to prosząc o en0 w następujący sposób:
źródło
Począwszy od iOS 7, system zawsze zwraca wartość,
02:00:00:00:00:00
gdy pytasz o adres MAC na dowolnym urządzeniu.Odniesienie: releaseasenotes
źródło
Istnieje wiele rozwiązań w tej sprawie, ale nie mogłem znaleźć całości. Dlatego stworzyłem własne rozwiązanie dla:
nicinfo
Jak używać :
źródło
To wygląda na całkiem czyste rozwiązanie: UIDevice BIdentifier
źródło
Teraz urządzenia iOS 7 - zawsze zwracają adres MAC 02: 00: 00: 00: 00: 00.
Więc lepiej użyj [UIDevice identifierForVendor].
więc lepiej wywołać tę metodę, aby uzyskać unikalny klucz specyficzny dla aplikacji
Kategoria będzie bardziej odpowiednia
import „UIDevice + Identifier.h”
Teraz wywołaj powyższą metodę, aby uzyskać unikalny adres
źródło
@Grantland To "całkiem czyste rozwiązanie" wygląda podobnie do mojego własnego ulepszenia w stosunku do rozwiązania iPhoneDeveloperTips.
Możesz zobaczyć mój krok tutaj: https://gist.github.com/1409855/
źródło
Nie jest już możliwe na urządzeniach z systemem iOS 7.0 lub nowszym, dlatego nie można uzyskać adresu MAC w Swift.
Jak stwierdził Apple:
źródło
...
źródło
Aby utworzyć unikalny ciąg na podstawie unikalnego identyfikatora urządzenia w iOS 6:
źródło
Wiele z tych pytań dotyczy tylko adresu Mac. Jeśli potrzebujesz również adresu IP, który właśnie napisałem, może wymagać trochę pracy, ale wydaje się, że działa dobrze na moim komputerze ...
źródło