如何使用 Objective-c 为 iPhone/iPad 生成设备的唯一 ID

How to generate Unique ID of device for iPhone/iPad using Objective-c

我想知道 如何使用 Objective-c

为 iPhone/iPad 生成设备的唯一 ID

一旦应用程序安装在设备上,我们就应该跟踪该设备 ID

您可以使用 UUID(通用用户标识)。以下 link 包含苹果文档

https://developer.apple.com/reference/uikit/uidevice/1620059-identifierforvendor

https://developer.apple.com/library/content/releasenotes/General/WhatsNewIniOS/Articles/iOS7.html#//apple_ref/doc/uid/TP40013162-SW1

您可以将此代码用于 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:

  1. 它永远不会改变(*即使应用程序将被删除)
  2. Apple 批准。

任何来这里的人 post 2017 年,Apple 为此目的实施了 DeviceCheck。

https://developer.apple.com/documentation/devicecheck#overview

您可以使用 DeviceCheck 查看此特定设备是否安装或使用了您的特定应用。它不会为您提供 phone 的唯一 ID,但它确实允许您查看用户是否已经完成促销活动。