IOS7.0唯一“设备ID”的获取方法

针对iOS 7.0及以上版本,介绍了如何通过苹果Keychain机制为设备生成并保存唯一ID的方法。利用苹果官方提供的KeychainItemWrapper类,在首次安装应用时生成唯一ID,并将其保存在Keychain中,即使应用被卸载重装也能保持该ID不变。

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

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 > 0) {
      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文件。

转载于:https://www.cnblogs.com/kumbayaco/p/3765809.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值