Come posso ottenere l’indirizzo MAC di un iphone a livello di programmazione

Qualcuno sa come ottenere automaticamente l’indirizzo MAC e l’indirizzo IP di un iPhone?


NOTA A partire da iOS7, non è più ansible recuperare gli indirizzi MAC del dispositivo. Verrà restituito un valore fisso anziché il MAC effettivo


Qualcosa in cui mi sono imbattuto poco fa. Originariamente da qui ho modificato un po ‘e pulito le cose.

IPAddress.h
IPAddress.c

E usarlo

 InitAddresses(); GetIPAddresses(); GetHWAddresses(); int i; NSString *deviceIP = nil; for (i=0; i 

I nomi degli adattatori variano a seconda del simulatore / dispositivo, nonché del wifi o della cella sul dispositivo.

Aggiornamento: non funzionerà su iOS 7. Dovresti usare ASIdentifierManager .


Più soluzione pulita sul sito Web MobileDeveloperTips:

 #include  #include  #include  #include  ... - (NSString *)getMacAddress { int mgmtInfoBase[6]; char *msgBuffer = NULL; size_t length; unsigned char 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 index if ((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 call if ((msgBuffer = malloc(length)) == NULL) errorFlag = @"buffer allocation failure"; else { // Get system information, store in buffer if (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 format NSString *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; } 

Volevo che qualcosa restituisse l’indirizzo indipendentemente dal fatto che il wifi fosse abilitato, quindi la soluzione scelta non funzionava per me. Ho usato un’altra chiamata che ho trovato su alcuni forum dopo alcuni ritocchi. Ho finito con il seguente (scusate il mio arrugginito C):

 #include  #include  #include  #include  #include  #include  char* getMacAddress(char* macAddress, char* ifName) { int success; struct ifaddrs * addrs; struct ifaddrs * cursor; const struct sockaddr_dl * dlAddr; const unsigned char* base; int i; success = getifaddrs(&addrs) == 0; if (success) { cursor = addrs; while (cursor != 0) { if ( (cursor->ifa_addr->sa_family == AF_LINK) && (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type == IFT_ETHER) && strcmp(ifName, cursor->ifa_name)==0 ) { dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr; base = (const unsigned char*) &dlAddr->sdl_data[dlAddr->sdl_nlen]; strcpy(macAddress, ""); for (i = 0; i < dlAddr->sdl_alen; i++) { if (i != 0) { strcat(macAddress, ":"); } char partialAddr[3]; sprintf(partialAddr, "%02X", base[i]); strcat(macAddress, partialAddr); } } cursor = cursor->ifa_next; } freeifaddrs(addrs); } return macAddress; } 

E poi lo chiamerei chiedendo en0 , come segue:

 char* macAddressString= (char*)malloc(18); NSString* macAddress= [[NSString alloc] initWithCString:getMacAddress(macAddressString, "en0") encoding:NSMacOSRomanStringEncoding]; free(macAddressString); 

A partire da iOS 7, il sistema restituisce sempre il valore 02:00:00:00:00:00 quando si richiede l’indirizzo MAC su qualsiasi dispositivo.

In iOS 7 e versioni successive, se si richiede l’indirizzo MAC di un dispositivo iOS, il sistema restituisce il valore 02: 00: 00: 00: 00: 00. Se è necessario identificare il dispositivo, utilizzare invece la proprietà identifierForVendor di UIDevice. (Le app che necessitano di un identificatore per i propri scopi pubblicitari dovrebbero prendere in considerazione l’utilizzo della proprietà advertisingIdentifier di ASIdentifierManager). ”

Riferimento: rilasci

Ci sono varie soluzioni a riguardo, ma non sono riuscito a trovare una cosa intera. Quindi ho creato la mia soluzione per:

nicinfo

Come usare :

 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' form NSString* mac_address = [wifi_info getMacAddressWithSeparator:@"-"]; // ip can be multiple if(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!"); } 

Sembra una soluzione piuttosto pulita: UIDevice BIdentifier

 // Return the local MAC addy // Courtesy of FreeBSD hackers email list // Accidentally munged during previous update. Fixed thanks to erica sadun & mlamb. - (NSString *) macaddress{ int mib[6]; size_t len; char *buf; unsigned char *ptr; struct if_msghdr *ifm; struct sockaddr_dl *sdl; mib[0] = CTL_NET; mib[1] = AF_ROUTE; mib[2] = 0; mib[3] = AF_LINK; mib[4] = NET_RT_IFLIST; if ((mib[5] = if_nametoindex("en0")) == 0) { printf("Error: if_nametoindex error\n"); return NULL; } if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) { printf("Error: sysctl, take 1\n"); return NULL; } if ((buf = malloc(len)) == NULL) { printf("Could not allocate memory. error!\n"); return NULL; } if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) { printf("Error: sysctl, take 2"); free(buf); return NULL; } ifm = (struct if_msghdr *)buf; sdl = (struct sockaddr_dl *)(ifm + 1); ptr = (unsigned char *)LLADDR(sdl); NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)]; free(buf); return outstring; } 

Ora i dispositivi iOS 7 restituiscono sempre un indirizzo MAC di 02: 00: 00: 00: 00: 00.

Quindi meglio usare [UIDevice identifierForVendor].

quindi è meglio chiamare questo metodo per ottenere una chiave univoca specifica per l’app

La categoria sarà più adatta

importare “UIDevice + Identifier.h”

 - (NSString *) identifierForVendor1 { if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { return [[[UIDevice currentDevice] identifierForVendor] UUIDString]; } return @""; } 

Ora chiama il metodo precedente per ottenere un indirizzo univoco

 NSString *like_UDID=[NSString stringWithFormat:@"%@", [[UIDevice currentDevice] identifierForVendor1]]; NSLog(@"%@",like_UDID); 

@Grantland Questa “soluzione abbastanza pulita” sembra simile al mio miglioramento rispetto alla soluzione iPhoneDeveloperTips.

Puoi vedere il mio passaggio qui: https://gist.github.com/1409855/

 /* Original source code courtesy John from iOSDeveloperTips.com */ #include  #include  #include  #include  + (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 index if ((mgmtInfoBase[5] = if_nametoindex("en0")) == 0) errorFlag = @"if_nametoindex failure"; // Get the size of the data available (store in len) else if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0) errorFlag = @"sysctl mgmtInfoBase failure"; // Alloc memory based on above call else if ((msgBuffer = malloc(length)) == NULL) errorFlag = @"buffer allocation failure"; // Get system information, store in buffer else if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0) { free(msgBuffer); errorFlag = @"sysctl msgBuffer failure"; } else { // Map msgbuffer to interface message structure struct if_msghdr *interfaceMsgStruct = (struct if_msghdr *) msgBuffer; // Map to link-level socket structure struct sockaddr_dl *socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1); // Copy link layer address data in socket structure to an array unsigned char macAddress[6]; memcpy(&macAddress, socketStruct->sdl_data + socketStruct->sdl_nlen, 6); // Read from char array into a string object, into traditional Mac address format NSString *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; } 
 #import  #import  #import  #import  #define IFT_ETHER 0x6 

 - (NSString*)macAddress { NSString* result = nil; char* macAddressString = (char*)malloc(18); if (macAddressString != NULL) { strcpy(macAddressString, ""); struct ifaddrs* addrs = NULL; struct ifaddrs* cursor; if (getifaddrs(&addrs) == 0) { cursor = addrs; while (cursor != NULL) { if ((cursor->ifa_addr->sa_family == AF_LINK) && (((const struct sockaddr_dl*)cursor->ifa_addr)->sdl_type == IFT_ETHER) && strcmp("en0", cursor->ifa_name) == 0) { const struct sockaddr_dl* dlAddr = (const struct sockaddr_dl*) cursor->ifa_addr; const unsigned char* base = (const unsigned char*)&dlAddr->sdl_data[dlAddr->sdl_nlen]; for (NSInteger index = 0; index < dlAddr->sdl_alen; index++) { char partialAddr[3]; sprintf(partialAddr, "%02X", base[index]); strcat(macAddressString, partialAddr); } } cursor = cursor->ifa_next; } } result = [[[NSString alloc] initWithUTF8String:macAddressString] autorelease]; free(macAddressString); } return result; } 

Per creare una stringa unica basata sull’identificatore univoco del dispositivo in iOS 6:

 #import  NSString *uniqueString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; NSLog(@"uniqueString: %@", uniqueString); 

Molte di queste domande riguardano solo l’indirizzo Mac. Se richiedi anche l’indirizzo IP che ho appena scritto, potrebbe essere necessario un po ‘di lavoro, ma sembra funzionare bene sulla mia macchina …

 - (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 found return @"?.?.?.?"; } 

Non è più ansible su dispositivi con iOS 7.0 o versioni successive, quindi non disponibili per ottenere l’indirizzo MAC in Swift.

Come affermato da Apple:

In iOS 7 e versioni successive, se si richiede l’indirizzo MAC di un dispositivo iOS, il sistema restituisce il valore 02: 00: 00: 00: 00: 00. Se è necessario identificare il dispositivo, utilizzare invece la proprietà identifierForVendor di UIDevice. (Le app che necessitano di un identificatore per i propri scopi pubblicitari dovrebbero prendere in considerazione l’utilizzo della proprietà advertisingIdentifier di ASIdentifierManager).