Мне просто интересно, если это отличается от общего подхода OS X (я спрашиваю, потому что я Mac N00B)
Тамас Чинеге
2
@abc: Я рекомендую опубликовать еще один вопрос по этому поводу. Лучше спрятать его в комментариях к другому вопросу.
PyjamaSam
1
а как насчет вызова ether_ntoa? это частный API не так ли?
Стиги
1
@NicTesla Я не могу комментировать наверняка, но, поскольку он просто выполняет базовые сетевые вызовы, я не вижу проблемы. Хотя, как говорится, после удаления UDID из iOS5, получения mac-адреса и использования его для разработки какого-то альтернативного уникального идентификатора, Apple может в будущем стать объектом пристального внимания.
#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;}
изменить ссылку на мобильные разработчики вместо iphonedevelopertips
SEG
Apple, очень вероятно, сломает это в iOS7 ... и мы не сможем комментировать это публично, пока она не поступит в продажу, кроме как на официальных форумах Apple Dev.
Гейб
3
Это не сработало на моем iPhone5 с iOS7. Это дает мне: 02: 00: 00: 00: 00: 00, что не правильно.
Sjoerd представляет
3
@Brenden Вы больше не можете получить сетевой MAC-адрес, используя PublicAPI на iOS7. Итак, если вам нужен уникальный идентификатор, вы должны использоватьIdentifierManager
ArtFeel
2
@SjoerdPerfors В iOS 7 вы действительно всегда получите один и тот же адрес, 02:00:00:00:00:00что и меры предосторожности для конфиденциальности Apple.
Василий Бурк
31
Я хотел что-то, чтобы вернуть адрес независимо от того, был ли включен Wi-Fi, поэтому выбранное решение не работает для меня. Я использовал другой звонок, который нашел на каком-то форуме после некоторой настройки. Я закончил со следующим (извините мой ржавый C):
Этот не работает для меня ... говорит, что ifName не объявлен так же, как переменная macaddress.
bugfixr
Выше код вызова будет утечка. бесплатно (macAddressString); перед возвратом из вышеупомянутого вызывающего метода. Кроме того, macAddress должен быть автоматически освобожден, если указанный выше код вызова находится в другом методе.
4
чтобы быть понятным, сам код не будет просачиваться, комментатор говорил о вызывающем фрагменте в конце, где я выделяю две строки, не освобождая их.
Начиная с iOS 7, система всегда возвращает значение, 02:00:00:00:00:00когда вы запрашиваете MAC-адрес на любом устройстве.
В iOS 7 и более поздних версиях, если вы запрашиваете MAC-адрес устройства iOS, система возвращает значение 02: 00: 00: 00: 00: 00. Если вам нужно идентифицировать устройство, используйте вместо него свойство identifierForVendor UIDevice. (Приложения, которым нужен идентификатор для собственных рекламных целей, должны рассмотреть возможность использования свойства advertisingIdentifier ASIdentifierManager.) "
Что действительно приятно в этом устаревании в API, так это то, что он все еще работает на симуляторе правильно, и только на аппаратном уровне в данный момент.
Джон Най
12
Есть разные решения по этому поводу, но я не мог найти целую вещь. Поэтому я сделал свое собственное решение для:
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!");}
Очень хороший и полезный класс! Хорошая работа! Однако вы пропустили [super dealloc] в обоих классах и забыли включить библиотеку, которая приводит к предупреждениям в xCode. Исправленную версию можно найти здесь: raptor.hk/download/NICInfo_raptor_patched.zip
Raptor
получаю этот результат Mac Адрес: 02: 00: 00: 00: 00: 00
Я использую ваше решение, 99% случаев работают хорошо, как и ожидалось, но 1% пользователей не могут получить MAC-адрес, возвращают NULL, сообщают пользователи в AppStore. Все еще не получить воспроизводимые шаги, у вас есть это? Спасибо.
Цзяньхуа
Я еще не заметил никаких проблем, но я буду следить!
Grantland Chew
В продолжение комментария @ jianhua: мы только что получили отчеты от пользователя, который в принципе не может использовать приложение, потому что этот код возвращает нуль для его устройства (мы используем идентификатор для проверки подлинности при каждом вызове сервера).
Самверметт
Неудачный случай - на iPhone 4S с версией IOS 5.0.1, конечно, это только в некоторых особых случаях.
Цзяньхуа
5
Теперь устройства iOS 7 - всегда возвращают MAC-адрес 02: 00: 00: 00: 00: 00.
Так что лучше используйте [UIDevice identifierForVendor].
поэтому лучше вызывать этот метод, чтобы получить уникальный ключ приложения
/* 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;}
Это больше невозможно на устройствах под управлением iOS 7.0 или новее, поэтому невозможно получить MAC-адрес в Swift.
Как заявило Apple:
В iOS 7 и более поздних версиях, если вы запрашиваете MAC-адрес устройства iOS, система возвращает значение 02: 00: 00: 00: 00: 00. Если вам нужно идентифицировать устройство, используйте вместо него свойство identifierForVendor UIDevice. (Приложения, которым нужен идентификатор для собственных рекламных целей, должны рассмотреть возможность использования свойства advertisingIdentifier ASIdentifierManager.)
Mac-адрес необходим для уникальной идентификации устройства в большинстве случаев. Вместо этого вы можете использовать это решение.
Денис Кутлубаев
0
Многие из этих вопросов касаются только адреса Mac. Если вам также требуется IP-адрес, который я только что написал, может потребоваться некоторая работа, но, похоже, он хорошо работает на моей машине ...
-(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
когда вы запрашиваете MAC-адрес на любом устройстве. Проверьте мой ответ ниже.Ответы:
ПРИМЕЧАНИЕ. Начиная с iOS7, вы больше не можете получать MAC-адреса устройства. Будет возвращено фиксированное значение, а не фактический MAC
Что-то я наткнулся некоторое время назад. Первоначально отсюда я немного изменил его и вычистил.
IPAddress.h
IPAddress.c
И использовать это
Названия адаптеров различаются в зависимости от симулятора / устройства, а также от Wi-Fi или сотового устройства.
источник
ether_ntoa
предупреждения, проверьте: stackoverflow.com/a/13412265/88597Обновление: это не будет работать на iOS 7. Вы должны использовать ASIdentifierManager .
Более чистое решение на сайте MobileDeveloperTips:
источник
IdentifierManager
02:00:00:00:00:00
что и меры предосторожности для конфиденциальности Apple.Я хотел что-то, чтобы вернуть адрес независимо от того, был ли включен Wi-Fi, поэтому выбранное решение не работает для меня. Я использовал другой звонок, который нашел на каком-то форуме после некоторой настройки. Я закончил со следующим (извините мой ржавый C):
И тогда я бы назвал это запросом en0 следующим образом:
источник
Начиная с iOS 7, система всегда возвращает значение,
02:00:00:00:00:00
когда вы запрашиваете MAC-адрес на любом устройстве.Ссылка: Releasenotes
источник
Есть разные решения по этому поводу, но я не мог найти целую вещь. Поэтому я сделал свое собственное решение для:
nicinfo
Как пользоваться :
источник
Это выглядит как довольно чистое решение: UIDevice BIdentifier
источник
Теперь устройства iOS 7 - всегда возвращают MAC-адрес 02: 00: 00: 00: 00: 00.
Так что лучше используйте [UIDevice identifierForVendor].
поэтому лучше вызывать этот метод, чтобы получить уникальный ключ приложения
Категория будет более подходящей
импорт "UIDevice + Identifier.h"
Теперь вызовите метод выше, чтобы получить уникальный адрес
источник
@Grantland Это «довольно чистое решение» похоже на мое собственное улучшение по сравнению с решением iPhoneDeveloperTips.
Вы можете увидеть мой шаг здесь: https://gist.github.com/1409855/
источник
Это больше невозможно на устройствах под управлением iOS 7.0 или новее, поэтому невозможно получить MAC-адрес в Swift.
Как заявило Apple:
источник
...
источник
Чтобы создать uniqueString на основе уникального идентификатора устройства в iOS 6:
источник
Многие из этих вопросов касаются только адреса Mac. Если вам также требуется IP-адрес, который я только что написал, может потребоваться некоторая работа, но, похоже, он хорошо работает на моей машине ...
источник