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

本文介绍了如何在Android和iOS应用中获取设备的唯一标识,包括MAC地址和IMEI。提供了具体的代码片段,适用于统计客户端下载量等数据统计需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值