安卓机器上获取mac地址的方式:
需要在AndroidManifest.xml文件中添加权限:
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地址进行比较, 如果能匹配上, 就说明这款游戏,是从这个渠道下载的。