如何以编程方式从iOS7设备获取未更改的设备ID
如何以编程方式从iOS7设备获取未更改的设备ID
我需要获取唯一设备ID以填充数据库中的唯一用户ID。我使用以下代码来获取设备ID:
NSString *strApplicationUUID= [[[UIDevice currentDevice] identifierForVendor] UUIDString];
但是当我重新安装应用程序时,UUID会不断变化。但据我所知,设备ID永远不会改变。为此,我使用了以下代码与第三方库SSKeychain
一起保存和检索旧的UDID:
NSString *Appname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; NSString *strApplicationUUID = [SSKeychain passwordForService:Appname account:@"manab"]; if (strApplicationUUID == nil) { strApplicationUUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; [SSKeychain setPassword:strApplicationUUID forService:Appname account:@"manab"]; }
现在的问题是,当该应用程序的版本更改时,即从v1.0更改为v2.0时,UDID再次更改。因此,我清楚地知道,我并不总是获得唯一的UDID,我只是基于供应商或应用程序获取UDID。
如何通过编程获取它?还有其他方法可以获取它吗?请给我指出正确的方向。
如何在iOS7设备上以编程方式获取不变的设备ID
在iOS7设备上,开发者可以使用advertisingIdentifier来获取设备的唯一标识符。advertisingIdentifier是一个与每个设备唯一对应的字母数字字符串。尽管它通常用于提供广告,但我们可以将其作为设备的唯一标识符来使用。
以下是解决该问题的代码示例:
-(NSString*)UniqueAppId { NSString *Appname = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; NSString *strApplicationUUID = [SSKeychain passwordForService:Appname account:@"manab"]; if (strApplicationUUID == nil) { strApplicationUUID = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]; [SSKeychain setPassword:strApplicationUUID forService:Appname account:@"manab"]; } return strApplicationUUID; }
以上代码使用了SSKeychain来存储和获取设备的唯一标识符。首先,它尝试从Keychain中获取已存储的标识符。如果没有找到,则使用advertisingIdentifier来生成一个新的标识符,并将其存储到Keychain中。最后,返回该标识符。
当需要获取设备的唯一标识符时,只需要调用`[self UniqueAppId]`即可。
需要注意的是,如果你使用advertisingIdentifier但不显示任何iAD或iAD无法正常加载,苹果可能会拒绝你的应用程序。
问题出现的原因:
在iOS 7及以上版本中,获取设备唯一标识符的方法发生了变化。原先可以使用UDID(Unique Device Identifier),但由于UDID会暴露用户的隐私,苹果公司在iOS 7中将其废弃。因此,开发者需要寻找其他方法来获取设备的唯一标识符。
解决方法:
1. 首先,开发者可以自己创建一个唯一标识符,并将其保存在Keychain中。Keychain是iOS中用于存储敏感数据的安全容器,可以确保数据在设备上的安全存储。
2. 另一种方法是使用Vendor ID(供应商标识符)。Vendor ID是由苹果分配给开发者的一个唯一标识符,它可以用来识别同一供应商下的所有应用。需要注意的是,如果同一供应商下的所有应用都被从设备上移除,Vendor ID将会被重置。
以下是在Objective-C中获取设备唯一标识符的代码示例:
// 创建Keychain中的标识符 NSString *uniqueIdentifier = @"com.yourcompany.yourapp.uniqueIdentifier"; // 从Keychain中获取标识符 NSString *deviceID = [self loadIdentifierFromKeychain:uniqueIdentifier]; // 如果Keychain中不存在标识符,则创建一个新的并保存到Keychain中 if (!deviceID) { deviceID = [self createUniqueIdentifier]; [self saveIdentifierToKeychain:deviceID identifier:uniqueIdentifier]; } // 使用Vendor ID作为备用标识符 NSString *vendorID = [[UIDevice currentDevice] identifierForVendor].UUIDString;
从上述内容中,我们可以得出以下信息:
问题原因:在iOS 7设备上,如何以编程方式获取不变的设备ID。
解决方法:广告标识符(advertisingIdentifier)是一个不错的选择,因为它在应用程序更新或重新安装时不会更改。但是,当用户重置他们的设备时,它也会发生变化,因此您可能需要根据您的要求重新考虑它。在某些情况下,使用用户的电子邮件地址作为唯一ID可能更合适,这样只有用户自己更改了唯一标识才会无法获取其数据或在系统中识别。
相关链接:
- 如何在iOS 6和iOS 7中获取UDID的方法:[How to get the UDID in iOS 6 and iOS 7](https://stackoverflow.com/questions/13456996/13457044#13457044)
- CFUUID vs. advertisingIdentifier vs. identifierForVendor:[CFUUID Vs. advertisingIdentifier Vs. identifierForVendor](https://stackoverflow.com/questions/18312035)
在我的情况下,我更倾向于使用用户的电子邮件地址作为唯一ID,这样只有当用户自己更改了唯一标识时,他才无法在系统上获取他的数据或识别。
祝好!