iOS5中的UUID

來源:互聯網
上載者:User

在ios5中,UDID已不再被推薦使用,在將來的版本中,這個功能可能會消失。所以我們得探尋它的取代方法,能唯一標識裝置的東西。往往硬體上有唯一標識,所以我們可以用硬體上的資訊來取代UDID, 硬體上的MAC地址就能達到這樣的目的。

下面的函數就可以返回XX:XX:XX:XX:XX:XX類型的字串(12個16進位數)

#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;  size_t              length;  unsigned char       macAddress[6];  struct if_msghdr    *interfaceMsgStruct;  struct sockaddr_dl  *socketStruct;  NSString            *errorFlag = NULL;   // 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";  else  {    // Get the size of the data available (store in len)    if (sysctl(mgmtInfoBase, 6, NULL, &length, NULL, 0) < 0)       errorFlag = @"sysctl mgmtInfoBase failure";    else    {      // Alloc memory based on above call      if ((msgBuffer = malloc(length)) == NULL)        errorFlag = @"buffer allocation failure";      else      {        // Get system information, store in buffer        if (sysctl(mgmtInfoBase, 6, msgBuffer, &length, NULL, 0) < 0)          errorFlag = @"sysctl msgBuffer failure";      }    }  }   // Befor going any further...  if (errorFlag != NULL)  {    NSLog(@"Error: %@", errorFlag);    return errorFlag;  }   // Map msgbuffer to interface message structure  interfaceMsgStruct = (struct if_msghdr *) msgBuffer;   // Map to link-level socket structure  socketStruct = (struct sockaddr_dl *) (interfaceMsgStruct + 1);   // Copy link layer address data in socket structure to an array  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;}

源碼來自:http://iphonedevelopertips.com/device/determine-mac-address.html

系統SKD也提供了一種方法得到標識字串即UDID,如下:

[[UIDevice currentDevice] uniqueIdentifier]

但開啟UIDevice.h中你會發現這樣的定義與注釋

@property(nonatomic,readonly,retain) NSString    *uniqueIdentifier  __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_NA,__MAC_NA,__IPHONE_2_0,__IPHONE_5_0);  // a string unique to each device based on various hardware info.

說明蘋果將逐漸淘汰這個屬性。

UUID在iOS4中也可以用,但不能保證在以後的系統升級後(iOS6 , 7)還能用。ios5中我還沒有測試過,因為現在手裡沒裝置了(測了的朋友給我說說結果)。

在此也隨便把得到UUID的方法以寫出來:

-(NSString*) uuid{CFUUIDRef puuid = CFUUIDCreate( nil );CFStringRef uuidString = CFUUIDCreateString( nil, puuid );NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);CFRelease(puuid);CFRelease(uuidString);return [result autorelease];}

在這兒有兩個概念UUID與UDID.

UUID是Universally Unique Identifier 通用唯一標識碼

UDID是Unique Device Identifier 裝置唯一標識碼

UDID只是UUID的一個了集而已。

目前我知道的就是用這些方法來唯一標識裝置,如果你有更好的方法,也希望你能與大家分享。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.