如何使用 Objective-c 为 iPhone/iPad 生成设备的唯一 ID
How to generate Unique ID of device for iPhone/iPad using Objective-c
我想知道 如何使用 Objective-c
为 iPhone/iPad 生成设备的唯一 ID
一旦应用程序安装在设备上,我们就应该跟踪该设备 ID
我已搜索检索 iPhone/iPad 的 IMEI,但在 objective-c.
中不允许这样做
然后我搜索生成 iPhone/iPad 的 UDID,但每次我在模拟器上启动它时都会生成不同的 ID。
您可以使用 UUID(通用用户标识)。以下 link 包含苹果文档
https://developer.apple.com/reference/uikit/uidevice/1620059-identifierforvendor
您可以将此代码用于 UUID:
//Objective-C
NSString * string = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
//Swift
let deviceID = UIDevice.currentDevice().identifierForVendor?.UUIDString
//Swift 3
let deviceID = UIDevice.current.identifierForVendor?.uuidString
使用以下代码获取 iOS 设备的 UDID
使用 KeychainItemWrapper Class 从 URL 下载
KeychainItemWrap
NSString *uuid;
KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"AC_APP_UUID" accessGroup:nil];
NSString *keychainUUID = [keychain objectForKey:(__bridge id)(kSecAttrAccount)];
NSString *appVersion = [NSString stringWithFormat:@"%@",@"1.0"];
[keychain setObject:appVersion forKey:(__bridge id)(kSecAttrDescription)];
if (keychainUUID==nil||[keychainUUID isKindOfClass:[NSNull class]]||keychainUUID.length==0) {
uuid = [[NSUUID UUID] UUIDString];
[keychain setObject:uuid forKey:(__bridge id)(kSecAttrAccount)];
}else{
uuid = [keychain objectForKey:(__bridge id)(kSecAttrAccount)];
}
是的,UDID 已弃用;出于用户隐私目的,我们不允许获取 UDID。 Apple不允许获取任何唯一标识设备的标识符,例如IMEI、MAC地址、UDID等
UUID 是目前最好的方法。但这对于每个供应商来说都是独一无二的。您不能保证每次获得 UUID 字符串时它都是唯一的。最好的办法是将 UUID 字符串存储到 phone 的 Keychain 并在需要时使用 catch 检索它。当您将 phone 恢复出厂设置时,钥匙串项目将被删除。应牢记此限制。
更新 - 在 IOS 10.3 测试版中:
Apple 似乎对钥匙串在 iOS 10.3+ 中的工作方式做了一些更改。卸载来自特定供应商的所有应用程序时,存储在钥匙串中的钥匙串项目将被删除。 Apple表示,即使应用程序从设备上消失后,该应用程序的敏感信息仍然存在可能会导致安全风险,因此他们决定禁止这种行为。
依赖钥匙串存储的开发人员即使在其应用程序卸载后也可以利用此 WORKAROUND 继续使用预期的功能。根据此解决方法,任何应用程序都可以访问存储在该特定钥匙串访问组中的信息,因此建议为您的数据添加额外的加密层,以更加安全地保护它,尽管默认情况下钥匙串会加密项目。
更新 - IOS 10.3.3(稳定):
似乎钥匙串项目删除是 iOS 10.3.3 早期测试版中的一个 BUG,后来在稳定版本中得到修复。这可能是在测试期间造成的,因为在那个阶段可能会发生奇怪的事情。以后用Keychain应该没问题
解决方案是:
您可以使用 DeviceToken
来完成。 DeviceToken 对所有手机都是唯一的。
代码在这里:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
return yes;
}
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString *AppDeviceToken=[[NSString alloc] initWithFormat:@"%@",deviceToken];
//NSLog(@"My token is: %@", self.AppDeviceToken);
AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@"<" withString:@""];
AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@">" withString:@""];
NSLog(@"%@'s Device Token is : %@",[[UIDevice currentDevice] name],AppDeviceToken);
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}
设备令牌对所有设备都是唯一的。
您不能获取 IMEI 和 phone 用户手机号码,Apple 只能获取这些唯一 ID。
您必须将 UDID 存储在钥匙串中。为此,您必须下载 keychainwrapper class 并存储上面代码生成的 UDID:
UIDevice *device = [[UIDevice alloc]init];
NSString *idForVend = [NSString stringWithFormat:@"%@", [device identifierForVendor]];
NSLog(@"Identifier For Vendor : %@",idForVend);
按照这个 link 肯定会解决您的问题:,iOS?
如果你使用这个如果你删除应用程序并重新安装它将保持相同的 DeviceID。
#import <AdSupport/AdSupport.h>
NSString* sClientID = [[[ASIdentifierManager sharedManager]advertisingIdentifier] UUIDString];
The Best UUID because:
- 它永远不会改变(*即使应用程序将被删除)
- Apple 批准。
任何来这里的人 post 2017 年,Apple 为此目的实施了 DeviceCheck。
https://developer.apple.com/documentation/devicecheck#overview
您可以使用 DeviceCheck 查看此特定设备是否安装或使用了您的特定应用。它不会为您提供 phone 的唯一 ID,但它确实允许您查看用户是否已经完成促销活动。
我想知道 如何使用 Objective-c
为 iPhone/iPad 生成设备的唯一 ID一旦应用程序安装在设备上,我们就应该跟踪该设备 ID
我已搜索检索 iPhone/iPad 的 IMEI,但在 objective-c.
中不允许这样做
然后我搜索生成 iPhone/iPad 的 UDID,但每次我在模拟器上启动它时都会生成不同的 ID。
您可以使用 UUID(通用用户标识)。以下 link 包含苹果文档
https://developer.apple.com/reference/uikit/uidevice/1620059-identifierforvendor
您可以将此代码用于 UUID:
//Objective-C
NSString * string = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
//Swift
let deviceID = UIDevice.currentDevice().identifierForVendor?.UUIDString
//Swift 3
let deviceID = UIDevice.current.identifierForVendor?.uuidString
使用以下代码获取 iOS 设备的 UDID 使用 KeychainItemWrapper Class 从 URL 下载 KeychainItemWrap
NSString *uuid;
KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"AC_APP_UUID" accessGroup:nil];
NSString *keychainUUID = [keychain objectForKey:(__bridge id)(kSecAttrAccount)];
NSString *appVersion = [NSString stringWithFormat:@"%@",@"1.0"];
[keychain setObject:appVersion forKey:(__bridge id)(kSecAttrDescription)];
if (keychainUUID==nil||[keychainUUID isKindOfClass:[NSNull class]]||keychainUUID.length==0) {
uuid = [[NSUUID UUID] UUIDString];
[keychain setObject:uuid forKey:(__bridge id)(kSecAttrAccount)];
}else{
uuid = [keychain objectForKey:(__bridge id)(kSecAttrAccount)];
}
是的,UDID 已弃用;出于用户隐私目的,我们不允许获取 UDID。 Apple不允许获取任何唯一标识设备的标识符,例如IMEI、MAC地址、UDID等
UUID 是目前最好的方法。但这对于每个供应商来说都是独一无二的。您不能保证每次获得 UUID 字符串时它都是唯一的。最好的办法是将 UUID 字符串存储到 phone 的 Keychain 并在需要时使用 catch 检索它。当您将 phone 恢复出厂设置时,钥匙串项目将被删除。应牢记此限制。
更新 - 在 IOS 10.3 测试版中:
Apple 似乎对钥匙串在 iOS 10.3+ 中的工作方式做了一些更改。卸载来自特定供应商的所有应用程序时,存储在钥匙串中的钥匙串项目将被删除。 Apple表示,即使应用程序从设备上消失后,该应用程序的敏感信息仍然存在可能会导致安全风险,因此他们决定禁止这种行为。
依赖钥匙串存储的开发人员即使在其应用程序卸载后也可以利用此 WORKAROUND 继续使用预期的功能。根据此解决方法,任何应用程序都可以访问存储在该特定钥匙串访问组中的信息,因此建议为您的数据添加额外的加密层,以更加安全地保护它,尽管默认情况下钥匙串会加密项目。
更新 - IOS 10.3.3(稳定):
似乎钥匙串项目删除是 iOS 10.3.3 早期测试版中的一个 BUG,后来在稳定版本中得到修复。这可能是在测试期间造成的,因为在那个阶段可能会发生奇怪的事情。以后用Keychain应该没问题
解决方案是:
您可以使用 DeviceToken
来完成。 DeviceToken 对所有手机都是唯一的。
代码在这里:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)])
{
[[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
[[UIApplication sharedApplication] registerForRemoteNotifications];
}
else
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
}
return yes;
}
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString *AppDeviceToken=[[NSString alloc] initWithFormat:@"%@",deviceToken];
//NSLog(@"My token is: %@", self.AppDeviceToken);
AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@"<" withString:@""];
AppDeviceToken = [self.AppDeviceToken stringByReplacingOccurrencesOfString:@">" withString:@""];
NSLog(@"%@'s Device Token is : %@",[[UIDevice currentDevice] name],AppDeviceToken);
}
- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@"Failed to get token, error: %@", error);
}
设备令牌对所有设备都是唯一的。
您不能获取 IMEI 和 phone 用户手机号码,Apple 只能获取这些唯一 ID。
您必须将 UDID 存储在钥匙串中。为此,您必须下载 keychainwrapper class 并存储上面代码生成的 UDID:
UIDevice *device = [[UIDevice alloc]init];
NSString *idForVend = [NSString stringWithFormat:@"%@", [device identifierForVendor]];
NSLog(@"Identifier For Vendor : %@",idForVend);
按照这个 link 肯定会解决您的问题:,iOS? 如果你使用这个如果你删除应用程序并重新安装它将保持相同的 DeviceID。
#import <AdSupport/AdSupport.h>
NSString* sClientID = [[[ASIdentifierManager sharedManager]advertisingIdentifier] UUIDString];
The Best UUID because:
- 它永远不会改变(*即使应用程序将被删除)
- Apple 批准。
任何来这里的人 post 2017 年,Apple 为此目的实施了 DeviceCheck。
https://developer.apple.com/documentation/devicecheck#overview
您可以使用 DeviceCheck 查看此特定设备是否安装或使用了您的特定应用。它不会为您提供 phone 的唯一 ID,但它确实允许您查看用户是否已经完成促销活动。