关于UUID的那些事

2017-05-03  本文已影响0人  夏天的风_song

参考:NSUUID /CFUUIDRef /UIDevice -unique​Identifier /-identifier​For​Vendor

在iOS5之前,应用程序甚至是夸应用程序启动的时候,获取唯一标识一直都是小事情,简单的请求UIDevice -uniqueIdentifier就完事了。

然而,UIDevice -uniqueIdentifier 在 iOS 5 就被废弃了,以下是注释:

可酌情使用 [UIDevice] 的 identifierForVendor 属性 或 ASIdentifierManager 类的 advertisingIdentifier 代替,或使用 NSUUID 类的 UUID 方法来创建一个 UUID 并写入到用户的默认数据库。

从2013年的5月1日起,苹果公司开始强制所有新提交的应用程序不能再使用这个废弃的 API,即使是针对早期版本 iOS 的应用程序也一样。任何使用 uniqueIdentifier 的二进制文件都将立即被拒。

就像版权和盗版有语音和概念上的相似性一样,设备标识符,无论是 UUID / GUID,UDID,或其他方式都是相当容易混淆的:

顺便说一句,所有在说明中列出的可以替代 UIDevice -uniqueIdentifier 的建议都会返回 UUID,不论是自动从 UIDevice -identifierForVendor 和 ASIdentifierManager -advertisingIdentifier 创建或从 NSUUID (或 CFUUIDCreate) 手动创建。

供应商标识

对于来自同一设备上运行的同一供应商的应用程序,此属性的值相同。对于来自不同供应商的同一设备上的应用以及不同设备上的应用,无论供应商如何,都会返回不同的值。

通常,供应商由App Store提供的数据确定。如果应用程序没有从应用商店安装(如企业应用程序和仍在开发中的应用程序),则会根据应用程序的包ID计算供应商标识。捆绑ID被认为是反向DNS格式。

在很多情况下,这才应该是其正确使用方法。应用程序开发者现在仍然找办法来确认设备的唯一标识,即使是从出自同样开发者的其他应用程序,而不把这种任务交给设备的 UDID。

image.png

例如,并且似乎具有相同的供应商ID。com.example.app1com.example.app2

如果值为nil,稍后再等一下。例如,在设备重新启动之后,但在用户解锁设备之前,会发生这种情况。

在iOS设备上安装应用程序(或同一供应商的其他应用程序)时,该属性的值保持不变。当用户从设备中删除所有供应商的应用程序并随后重新安装一个或多个应用程序时,该值会发生变化。当使用Xcode安装测试版本或使用ad-hoc分发在设备上安装应用程序时,该值也可能会发生变化。因此,如果您的应用程序在任何地方存储此属性的值,则应优雅地处理标识符更改的情况。

对于大多数应用来说,查找 uniqueIdentifier 并将其替换为 identifierForVendor 就足够了。

在实施用于投放广告的系统时,请使用该属性的值
而不是此属性。

使用该属性需要您遵循课堂讨论中列出的准则,以正确使用该标识符。有关更多信息,请参阅。advertisingIdentifier
ASIdentifierManagerASIdentifierManager

广告标识

每个设备的唯一的字母数字字符串,仅用于投放广告。

@property(nonatomic, readonly) NSUUID *advertisingIdentifier;

同一个设备,不同的供应商,将返回相同的值。此标识符可能会更改,例如,当用户erase的时候,所以你不应该缓存它。identifierForVendor

重要
在iOS 10.0及更高版本中,当用户的广告跟踪有限时,所有值都为零。advertisingIdentifier

如果值为nil,稍后再等一下。例如,在设备重新启动之后,但在用户解锁设备之前,会发生这种情况。

用户可以在 设置页面来选择限制广告跟踪,位置在 :** 设置 > 隐私 > 广告 **:


Limit Ad Tracking

NSUUID & CFUUIDRef

在 iOS 6 中被加到 Foundation 的 NSUUID 可以用来轻松地创建的 UUID。有多容易呢?

 NSString *uuid=[[NSUUID UUID]UUIDString];

对那些基于基础 SDK 而没有使用运营商或广告标识 API 的应用程序来说,使用弃用说明里推荐的方法就可以达到类似的效果,使用 NSUserDefaults
:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//    // Override point for customization after application launch.
    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    
    NSString *uuid = [userDefault objectForKey:@"ApplicationUniqueIdentifier"];
    if (uuid == nil) {
        uuid = [[NSUUID UUID]UUIDString];
        [userDefault setObject:uuid forKey:@"ApplicationUniqueIdentifier"];
        [userDefault synchronize];
    }
    NSLog(@"%@",uuid);
    
  
    
    return YES;
}

以此方式,一个 UUID 会在应用程序启动的第一时间被生成,然后存储在 NSUserDefaults 以便随后每次应用程序的启动所调用。不同于广告或运营商标识的是,这些标识不会同其他应用程序共享,但对于大多数的意图和目的来说,这已经足够达到目的了。

上一篇下一篇

猜你喜欢

热点阅读