ios7.0 以后通过sysctl获得的mac地址已经失效,所有设备均为020000000000.

可以通过苹果的keychain机制,实现设备的唯一ID标示。

具体过程:在app第一次安装时,生成一个唯一的ID,将该ID保存到keychain中。keychain内的id并不会因为app的卸载而失效,下次安装或者更新仍然可以取到这个唯一的ID,从而可以找到这个设备对应的账号。
注:唯一ID的生成,可以通过程序自己的算法如guid,或者用苹果自带的IDFV([[UIDevice currentDevice]] identifierForVendor]]).

以下是具体代码:

static KeychainItemWrapper * s_pWrapper = Nil;

// 获取开发者的ID
NSString * getAppID() {
NSDictionary *query = [NSDictionary dictionaryWithObjectsAndKeys:
(id)kSecClassGenericPassword, kSecClass,
@"bundleSeedID", kSecAttrAccount,
@"", kSecAttrService,
(id)kCFBooleanTrue, kSecReturnAttributes,
nil];
CFDictionaryRef result = nil;
OSStatus status = SecItemCopyMatching((CFDictionaryRef)query, (CFTypeRef *)&result);
if (status == errSecItemNotFound)
status = SecItemAdd((CFDictionaryRef)query, (CFTypeRef *)&result);
if (status != errSecSuccess)
return nil;
NSString *accessGroup = [(NSDictionary *)result objectForKey:(id)kSecAttrAccessGroup];
NSArray *components = [accessGroup componentsSeparatedByString:@"."];
NSString *bundleSeedID = [[components objectEnumerator] nextObject];
CFRelease(result);
return bundleSeedID;
} // 获取设备唯一ID
std::string getUniqueID()
{
if (s_pWrapper == Nil) {
#if TARGET_IPHONE_SIMULATOR
s_pWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAPP"
accessGroup:Nil];
#else
NSString* boundSeedID = getAppID();
NSString* appID = @".com.YourCompany.YourAPP";
NSString* groupID = [boundSeedID stringByAppendingString:appID];
s_pWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"YourAPP"
accessGroup:groupID];
#endif
// [s_pWrapper resetKeychainItem];
} // 是否已注册过
NSString *key = [s_pWrapper objectForKey:(id)kSecValueData];
if (key != Nil && key.length > ) {
return [key UTF8String];
} // 7.0系统取IDFV作为唯一标示
NSUUID* uuid = [[UIDevice currentDevice] identifierForVendor];
key = [uuid UUIDString]; // 注册到keychain中
[s_pWrapper setObject:(id)key forKey:(id)kSecAttrAccount];
[s_pWrapper setObject:(id)key forKey:(id)kSecAttrService];
[s_pWrapper setObject:(id)key forKey:(id)kSecValueData]; return [key UTF8String];
}

注:

1、KeychainItemWrapper为apple官方提供的一个sample里面的代码,链接https://developer.apple.com/library/ios/samplecode/GenericKeychain/Listings/Classes_KeychainItemWrapper_m.html
2、在项目的Capabilities属性下,将Keychain sharing改成Enable。项目中会自动添加一个entitlements文件。

最新文章

  1. js立即执行函数
  2. 项目新的需求,网页的自适应交付/响应式交付 Responsive/Adaptive Delivery
  3. Web3D编程入门总结——面向对象的基础Web3D框架
  4. Maven学习总结(四)——Maven核心概念--转载
  5. 【BZOJ】【2753】【SCOI2012】滑雪与时间胶囊
  6. range与xrange之间的差异(转)
  7. TDirectory.CreateDirectory 完整、严谨的创建一个目录
  8. java写文件时,输出不完整的原因以及解决方法close()或flush()
  9. Ion-affix & Ion-stick 仿IOS悬浮列表插件
  10. 【Unity Shaders】概述及Diffuse Shading介绍
  11. 定时器Timer的使用
  12. LVS结合keepalive
  13. 给vs2015添加EF
  14. 可遇不可求的Question之INSERT … ON DUPLICATE KEY UPDATE 语法篇
  15. python全栈开发day59-Django基础
  16. Spring Boot事务管理(中)
  17. shell中wait命令详解
  18. MVC 之 初识(一)
  19. uglifyjs-webpack-plugin 插件,drop_console 默认为 false(不清除 console 语句),drop_debugger 默认为 true(清除 debugger 语句)
  20. LeetCode(16):最接近的三数之和

热门文章

  1. 大话Spark(9)-源码之TaskScheduler
  2. Ubuntu系统 apt-get update失败解决办法
  3. BeanUtils.copyProperties的用法
  4. BZOJ 2039人员雇佣
  5. Managing Network Usage
  6. restapi(1)- 文件上传下载服务
  7. ThreadGroup详细讲解
  8. MLlib特征变换方法
  9. SQL SERVER 活动监视-sys.dm_exec_requests
  10. SSAS Tabular 表格模型建模(关系)及部署