2012-11-09 9 views
5

Użyj następującej metody i działaj dobrze w 99,5% przypadków, ale bardzo niewielu użytkowników w AppStore zgłasza, że ​​nie może uzyskać adresu mac (używamy identyfikatora do uwierzytelnienia każdego połączenia z serwerem).iPhone, dla których przypadków nie można uzyskać sukcesu adresu mac?

Nieudany przypadek jest oparty na telefonie iPhone 4S z wersją 5.0.1 systemu IOS.

Hej chłopaki,

Czy wiesz, dla których sprawa (oprócz małej ilości pamięci) nie powiedzie? Każdy pomysł lub dyskusja zostanie doceniona. Dzięki.

/* 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 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 errorFlag; 
} 

Każda pomoc jest bardzo doceniana.

+0

Jakieś doświadczenie w tej kwestii? – jianhua

+0

Czy udało Ci się odtworzyć ten błąd? Właśnie przetestowałem twój kod na iPhone 4s 5.1.1 (wszystko co miałem pod ręką) i działa po prostu świetnie. Mogę polecić metody, których używam osobiście, ale to jest bardzo podobne do tego, co masz ... –

+1

en0 to tylko interfejs Wi-Fi, prawda? Co się stanie, jeśli ten interfejs nie działa na urządzeniu? – jaseelder

Odpowiedz

0

Wpadłem na taką sytuację po uaktualnieniu iPhone'a do iOS 5, ale problemem był niesławny błąd Wi-Fi. Nie spodoba ci się ta odpowiedź, ale jedynym rozwiązaniem było odesłanie urządzenia do Apple i uzyskanie nowego, które działało poprawnie. Kod można zmienić tak, aby nie zawiewał się podczas wyszukiwania adresu MAC, ale to nie pomaga, gdy wywołania REST wymagają unikalnego identyfikatora. Jako programista utknąłeś między kamieniem a twardym miejscem.

+0

Tak, masz rację, nie musisz tracić czasu na tego typu problemy. – jianhua

Powiązane problemy