2012-11-09 8 views
5

以下の方法を使用し、99.5%の場合はうまく動作しますが、AppStoreのユーザーはごくわずかですが、MACアドレスを取得できません(はすべてのサーバー呼び出しを認証するために識別子を使用します)。iPhoneでMacアドレスの取得に失敗するケースはありますか?

失敗したケースは、IOSバージョン5.0.1のiPhone 4Sに基づいています。

、それは失敗します(低メモリ以外)、その場合のためにやあみんな、

あなたは知っていますか?どんなアイデアや議論にも感謝します。ありがとう。

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

ご協力いただきまして誠にありがとうございます。

+0

この問題の経験はありますか? – jianhua

+0

このエラーを再現できましたか?私はちょうどあなたのコードをiPhone 4s 5.1.1でテストしました。私は個人的に使う方法をお勧めできますが、それはあなたが持っているものにかなり似ています... –

+1

en0はWi-Fiインターフェイスだけですか? そのインターフェイスがデバイス上にある場合はどうなりますか? – jaseelder

答えて

0

iPhoneをiOS 5にアップグレードした後、このような状況に遭遇しました。この問題は悪名高いワイファイバグでした。あなたはこの答えが気に入らないだろうが、唯一の解決策は、デバイスをAppleに持ち帰り、新しいものを手に入れて正常に動作させることだった。 Macアドレスの検索に失敗したときにコードがクラッシュしないように変更することはできますが、REST呼び出しで一意の識別子が必要な場合は役に立ちません。開発者として、あなたは岩と堅い場所の間にこだわっています。

+0

はい、そうですが、この種の問題に時間を割く必要はありません。 – jianhua

関連する問題