UDID란? 다들 알다시피 아이폰이나 아이팟 아이패드의 고유 시리얼 넘버이다.
사실 이 UDID 자체로 기기 판별을 한다는게 그렇게 권장할만한 일은 아니지만 어플을 개발하다 보면 써야할수 밖에 없는 상황이 있을수가 있다. (중복 체크 라던지에 사용하는데 절대적 신뢰를 하면 안된다.)
그런데 애플이 IOS5 부터 UDID 를 얻는 API 만료시킨단다. -_-;
줬다가 뺏는건 무슨 심보인지 모르겠지만 아무튼 우리는 그게 중요한게 아니라. UDID를 대체할 수단을 찾아야 한다.
인터넷을 하기 위해서 랜카드(유선이든 무선이든)가 컴퓨터에 있어야 한다는건 다 아는 사실일 것이다.
TCP/IP 의 특성상 그 랜카드에는 MAC 어드레스라는 랜카드의 고유 넘버가 있다. 아니 있어야만 한다.
이 MAC 어드레스는 스마트폰에도 예외는 아니다. 스마트폰은 작은 컴퓨터나 마찬가지이고 그안에 들어가 있는 무선랜카드에는 맥주소가 엄연히 존재한다.
아이팟/아이폰/아이패드 마찬가지이다.
UDID 를 대체하기에 전혀 손색이 없다. 혹자는 맥주소는 변조가 되지 않냐고 하지만 그건 해킹폰에서나 가능한 이야기고 어차피 해킹폰에서는 마음먹으면 UDID도 변조 가능하므로 언급할 가치는 없어 보인다. 앞에서도 말했듯이 절대적인 신뢰 고유값으로 사용하기엔 UDID 나 맥주소나 무리이긴 마찬가지이다. 하지만 일례를 들어 전자쿠폰 발행에서 한기기에서 여러번 받을수 없게 한다던지. 기기별 통계자료를 모은다던지에 있어서 위의 두 고유값은 유용한 값이된다. 이 값들을 마치 ID 처럼 사용하는 개발자는 당연히 없으리라 믿는다.
구글을 검색해보면 몇가지 소스가 나오는데. 제대로 작동하는 소스는 없다.
제대로 작동 안한다기 보다는 약간 수정해줘야 확실히 동작한다.
왜냐하면 아이폰에는 en0 디바이스 가 있고 en1 이란 디바이스가 있는데 en0 가 wi-fi 를 담당하는 무선랜카드의 디바이스명이고
en1 은 3G를 담당하는 모듈이다. 헌데 구글 소스는 현재 IP 주소를 받아온 즉, 활성화된 디바이스의 맥주소를 가져오려고 시도하게 되므로
3G가 켜져있는 상태에선 맥주소를 못가져 온다. (3G 디바이스엔 맥주소가 없는모양 )
아무튼 그래서 우리는 딱 집어서! en0 디바이스의 맥주소를 가져와! 라고 해줘야 한다.
자그럼 아이폰에서 en0 의 mac 주소를 가져오는 소스를 공개하도록 하겠다.
--- MacAddress.h
char* getMacAddress(char* macAddress, char* ifName); //간단히 함수만 정의 해주면 된다.
--- MacAddress.c
#include <sys/types.h>#include <stdio.h>#include <string.h>#include <sys/socket.h>#include <net/if_dl.h>#include <ifaddrs.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) {if ( (cursor->ifa_addr->sa_family == AF_LINK)&& (((const struct sockaddr_dl *) cursor->ifa_addr)->sdl_type == 0x06) && 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;}
위의 두 파일을 프로젝트에 포함시키고.
사용하고자 하는 곳에서.
#import "MacAddress.h" //헤더파일 임포트~char* macAddressString= (char*)malloc(18);NSString *macAddress= [[NSString alloc] initWithCString:getMacAddress(macAddressString,"en0")encoding:NSMacOSRomanStringEncoding];NSLog(macAddress);
이렇게 사용해주시면 되겠다.