2012-04-05 3 views
3

Я действительно надеюсь, что кто-то объяснит это мне. Я пишу приложение, которое использует его MAC-адрес устройства, и этот код отлично работает на симуляторе, но не работает на устройстве.Почему этот код работает на симуляторе Xcode, но не работает на устройстве?

Я получил этот код от вопроса Get router mac (without system call for ARP) in Objective-C

#include <stdio.h> 

#include <sys/types.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/socket.h> 
#include <net/if_dl.h> 
#include <ifaddrs.h> 
#include <net/if_types.h> 

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) 
     { 
      const struct sockaddr_dl *socAddr = 
      (const struct sockaddr_dl *)cursor->ifa_addr; 
      _Bool afLinkFamily = (cursor->ifa_addr->sa_family == AF_LINK); 
      /* Ethernet CSMA/CD */ 
      _Bool sdlIFTEther = (socAddr->sdl_type == IFT_ETHER); 

      if ((afLinkFamily) && 
       sdlIFTEther && 
       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; 
} 

ошибка это дает мне:

'net/if_types.h' file not found 

поэтому мой вопрос, почему это происходит, в чем разница между работает на тренажере и устройство? Спасибо заранее.

+0

У вас есть решение, стоящее перед той же проблемой. – Nikunj

ответ

1

Файл заголовка просто отсутствует в SDK устройства iOS. Apple не хочет, чтобы вы использовали его по любой причине. Если вы просто хотите код для работы, вы можете попытаться извлечь требуемое определение:

#define IFT_ETHER 0x6  /* Ethernet CSMACD */ 

и удалить линии

#include <net/if_types.h> 

полностью. Хотя это нарушает совместимость с платформами, где эта константа может быть определена для какого-либо другого значения.

+0

* «... хотя это нарушает совместимость с платформами, где эта константа может быть определена каким-то другим значением» * - Ну, grepping в '/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/ SDK/iPhoneOS6.1.sdk' показывает, что он не определен вообще. Таким образом, он находится между камнем и твердым местом. Он мог бы просто перебирать возможные значения (например, от 0 до 10) и ждать, пока он получит хороший ответ. Как только он получит хороший ответ, проверьте свойства интерфейса, чтобы обеспечить предпочтительность носителя. – jww