安卓和ios App 标示机器的方式(mac地址 ,idfa)

来源:互联网 发布:淘宝联盟佣金是全店吗 编辑:程序博客网 时间:2024/06/05 13:27

安卓机器上获取mac地址的方式:

需要在AndroidManifest.xml文件中添加权限:

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


public static String getMacAddress() 
{  
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);  
        WifiInfo info = wifi.getConnectionInfo();  
        String macAddr = info.getMacAddress();  
        return macAddr;

}  



IOS设备上标示机器的方式:

1. 操作系统版本 < 7.0的话  可以直接通过如下方式获取:

string DeviceModule::getAddress()
{
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 = (char*)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:@"%02X:%02X:%02X:%02X:%02X:%02X",
                           *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), (*(ptr+5))];
    free(buf);
    return [outstring UTF8String];
}


2.操作系统大于等于7.0之后,苹果把这种方式屏蔽掉, 所以只能通过其他方式来处理, 我下面是用CFUUID 来实现的。

string DeviceModule::createCFUUID()
{
    
    CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);
    NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));
    return [cfuuidString UTF8String];
}


这样两种方式 生成的 串码, 存到 keychain(钥匙链)中,  及时卸载游戏 重装,这些数据也不会丢失。 所以可以作为很好的保存用户名和密码的 方式。


但是最好的方式,还不是上面提到的,把用户名存起来, 而是应该让玩家在刚开始注册账号的时候,强制玩家注册账号,而不是很多开发商搞的一键注册。


广告标示符(IDFA-identifierForIdentifier)
这是iOS 6中另外一个新的方法,advertisingIdentifier是新框架AdSupport.framework的一部分。ASIdentifierManager单例提供了一个方法advertisingIdentifier,通过调用该方法会返回一个上面提到的NSUUID实例。

NSString *adId = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

 

跟CFUUID和NSUUID不一样,广告标示符是由系统存储着的。不过即使这是由系统存储的,但是有几种情况下,会重新生成广告标示符。如果用户完全重置系统((设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。关于广告标示符的还原,有一点需要注意:如果程序在后台运行,此时用户“还原广告标示符”,然后再回到程序中,此时获取广告标示符并不会立即获得还原后的标示符。必须要终止程序,然后再重新启动程序,才能获得还原后的广告标示符。之所以会这样,我猜测是由于ASIdentifierManager是一个单例。


针对广告标示符用户有一个可控的开关“限制广告跟踪”。Nick Arnott的文章中已经指出了。将这个开关打开,实际上什么也没有做,不过这是希望限制你访问广告标示符。所以此时你获取的IDFA值 和先前没有打开“限制广告跟踪”的值不一样。


IDFA是推广要用的,一些开发商要推广他们的APP或者Game ,要把他们的推广链接(下载链接)给推广渠道, 如果玩家在该推广渠道中点击了该链接 , 推广渠道就会把 该玩家设备的IDFA 和Mac地址(这个不是必须,不过最后带上,因为玩家可以限制广告追踪,导致idfa不一致),发送给服务器,

服务器把从推广渠道获取的idfa和mac地址保存到数据库,  如果有玩家启动游戏,客户端会把idfa,mac地址发给服务器,服务器获取这些值之后,

会跟先前的从渠道获取的idfa 或者mac地址进行比较, 如果能匹配上, 就说明这款游戏,是从这个渠道下载的。



0 0
原创粉丝点击