获取手机(ios,android)的设备唯一码(mac地址, IMEI)

app中总会用到客户端下载量数据统计,一般都是用的设备的唯一码作为标示,以下是获取mac地址的代码片段,记录备份。


android 获取mac地址


1. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE">

2. private String getLocalMacAddress(){

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE);

WifiInfo info = wifi.getConnectionInfo();

return info.getMacAddress();

}


android 获取IMEI数据


public static String getIMEI(Context context) {

return ((TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();

}


ios 获得mac地址


+(NSString *)getLocalMacAddress

{

int                    mib[6];

size_t                len;

char                *buf;

unsigned char        *ptr;

struct if_msghdr    *ifm;

struct sockaddr_dl    *sdl;

mib[0] = CTL_NET;

mib[1] = AF_ROUTE;

mib[2] = 0;

mib[3] = AF_LINK;

mib[4] = NET_RT_IFLIST;

if ((mib[5] = if_nametoindex("en0")) == 0) {

//printf("Error: if_nametoindex error/n");

return NULL;

}

if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {

//printf("Error: sysctl, take 1/n");

return NULL;

}

if ((buf = malloc(len)) == NULL) {

//printf("Could not allocate memory. error!/n");

return NULL;

}

if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {

//printf("Error: sysctl, take 2");

return NULL;

}

ifm = (struct if_msghdr *)buf;

sdl = (struct sockaddr_dl *)(ifm + 1);

ptr = (unsigned char *)LLADDR(sdl);

// NSString *outstring = [NSString stringWithFormat:@"%02x:%02x:%02x:%02x:%02x:%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];

NSString *outstring = [NSString stringWithFormat:@"%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];

free(buf);

return [outstring uppercaseString];

}


ios获取时候所需包含的头文件


#include<sys/socket.h> 


#include<sys/sysctl.h> 
#include<net/if.h> 
#include <net/if_dl.h>

- (NSString *) macaddress{
     
      int                                mib[6];
      size_t                          len;
      char                              *buf;
      unsignedchar            *ptr;
      structif_msghdr      *ifm;
      structsockaddr_dl  *sdl;
     
      mib[0] =CTL_NET;
      mib[1] =AF_ROUTE;
      mib[2] =0;
      mib[3] =AF_LINK;
      mib[4] =NET_RT_IFLIST;
     
      if ((mib[5]= if_nametoindex("en0")) == 0) {
              printf("Error: if_nametoindex errorn");
              return NULL;
      }
     
      if(sysctl(mib, 6, NULL, &len, NULL, 0)< 0) {
              printf("Error: sysctl, take 1n");
              return NULL;
      }
     
      if ((buf =malloc(len)) == NULL) {
              printf("Could not allocate memory. error!n");
              return NULL;
      }
     
      if(sysctl(mib, 6, buf, &len, NULL, 0)< 0) {
              printf("Error: sysctl, take 2");
              free(buf);
              return NULL;
      }
     
      ifm =(struct if_msghdr *)buf;
      sdl =(struct sockaddr_dl *)(ifm + 1);
      ptr =(unsigned char *)LLADDR(sdl);
      NSString*outstring = [NSString stringWithFormat:@"X:X:X:X:X:X",
                                                    *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
      free(buf);
     
      returnoutstring;
}
- (NSString *)getMacAddress 

      int                                mgmtInfoBase[6]; 
      char                              *msgBuffer = NULL; 
      size_t                          length; 
      unsignedchar            macAddress[6]; 
      structif_msghdr      *interfaceMsgStruct; 
      structsockaddr_dl  *socketStruct; 
      NSString                      *errorFlag = NULL; 
     
      // Setup themanagement 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 allconfigured interfaces 
     
      // With allconfigured interfaces requested, get handleindex 
      if((mgmtInfoBase[5] = if_nametoindex("en0")) ==0)   
              errorFlag = @"if_nametoindex failure"; 
      else 
      { 
              // Get the size of the data available (store inlen) 
              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"; 
                      } 
              } 
      } 
     
      // Beforgoing any further... 
      if(errorFlag != NULL) 
      { 
              NSLog(@"Error: %@", errorFlag); 
              return errorFlag; 
      } 
     
      // Mapmsgbuffer to interface message structure 
      interfaceMsgStruct = (struct if_msghdr *)msgBuffer; 
     
      // Map tolink-level socket structure 
      socketStruct= (struct sockaddr_dl *) (interfaceMsgStruct +1); 
     
      // Copy linklayer address data in socket structure to anarray 
      memcpy(&macAddress,socketStruct->sdl_data +socketStruct->sdl_nlen, 6); 
     
      // Read fromchar array into a string object, into traditional Mac addressformat 
      NSString*macAddressString = [NSStringstringWithFormat:@"X:X:X:X:X:X",   
                                                                  macAddress[0], macAddress[1],macAddress[2],   
                                                                  macAddress[3], macAddress[4],macAddress[5]]; 
      NSLog(@"MacAddress: %@", macAddressString); 
     
      // Releasethe buffer memory 
      free(msgBuffer); 
     
      returnmacAddressString; 
}

在这儿有两个概念UUID与UDID.

UUID是Universally Unique Identifier 通用唯一标识码

UDID是Unique Device Identifier 设备唯一标识码

UDID只是UUID的一个子集而已。

  1. -(NSString*)uuid  
  2. {  
  3. CFUUIDRef puuid = CFUUIDCreate( nil );  
  4. CFStringRef uuidString = CFUUIDCreateString( nil, puuid );  
  5. NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);  
  6. CFRelease(puuid);  
  7. CFRelease(uuidString);  
  8. return [result autorelease];  
  9. }

- (NSString *)uuid
{
    CFUUIDReftheUUID = CFUUIDCreate(NULL);
    CFStringRefstring = CFUUIDCreateString(NULL, theUUID);
   NSMakeCollectable(theUUID);
    return(NSString *)string;
}



你可能感兴趣的:(获取手机(ios,android)的设备唯一码(mac地址, IMEI))