2012-11-09 8 views
5

Sử dụng phương pháp sau và hoạt động tốt cho 99,5% trường hợp, nhưng rất ít người dùng trong báo cáo AppStore họ không thể lấy địa chỉ mac (chúng tôi sử dụng số số nhận dạng để xác thực mọi cuộc gọi máy chủ).iPhone trong trường hợp nào không thể nhận được địa chỉ mac thành công?

Trường hợp không thành công được dựa trên iPhone 4S với phiên bản iOS 5.0.1.

Xin chào các bạn,

Bạn có biết trường hợp nào (ngoài bộ nhớ thấp) không? Bất kỳ ý tưởng hoặc thảo luận sẽ được đánh giá cao. Cảm ơn.

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

Bất kỳ trợ giúp nào được đánh giá cao.

+0

Bất kỳ trải nghiệm nào về vấn đề này? – jianhua

+0

Bạn có thể tạo lại lỗi này không? Tôi vừa thử nghiệm mã của bạn trên iPhone 4s 5.1.1 (tất cả những gì tôi phải làm) và nó chỉ hoạt động dandy. Tôi có thể đề nghị các phương pháp tôi sử dụng cá nhân, nhưng nó khá giống với những gì bạn có ... –

+1

en0 chỉ là giao diện wifi phải không? Điều gì xảy ra nếu giao diện đó bị hỏng trên thiết bị? – jaseelder

Trả lời

0

Tôi gặp phải một tình huống như thế này sau khi nâng cấp iPhone lên iOS 5 vấn đề là lỗi wifi khét tiếng. Bạn sẽ không thích câu trả lời này, nhưng giải pháp duy nhất là đưa thiết bị trở lại Apple và nhận một thiết bị mới hoạt động tốt. Mã có thể được thay đổi để không sụp đổ khi tra cứu địa chỉ mac không thành công, nhưng điều đó không giúp ích khi các cuộc gọi REST yêu cầu một mã định danh duy nhất. Là một nhà phát triển, bạn đang mắc kẹt giữa một tảng đá và một nơi khó khăn.

+0

Có, bạn nói đúng, không cần phải tốn thời gian cho loại sự cố này. – jianhua