privacy - iOS6 UDID-identifierForVendor具有优于identifierForAdvertising的优势吗?




(9)

Apple正在更改其iOS6的隐私设置并且不赞成使用设备UUID(UDID)。 根据WWDC演示文稿和文档, UIDevice类中有两个UDID替换项:

-identifierForVendor

  • 来自同一开发人员的应用程序之间的ID相同。
  • 删除该团队ID的最后一个应用后删除。
  • 备份。

-identifierForAdvertising

  • 设备的独特之处。
  • 适用于所有应用程序; 用于广告 - iAd已从iOS 6及更高版本的UDID转换而来。
  • 使用“清除所有内容和设置”进行重置。
  • 备份。

在我看来, -identifierForVendor不如-identifierForAdvertising因为它将在最后一次从供应商卸载应用程序时被重置,并被“清除所有内容和设置”。

-identifierForVendor具有over -identifierForAdvertising优点吗?


Answers

要根据iOS 6中设备的唯一标识符创建uniqueString:

#import <AdSupport/ASIdentifierManager.h>

NSString *uniqueString = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
NSLog(@"uniqueString: %@", uniqueString);

这些API的设计非常糟糕,很明显,苹果不希望我们识别用户设备。

只要看看identifierForVendor的描述。

如果用户从同一供应商清除所有应用程序,则会被删除。 :(这是不可靠的 - 可以返回零(文档建议“等待”一段时间,如果发生这种情况。:(

他们没有使用明显的解决方案,该解决方案随时可用,不依赖于安装/删除 - 返回与团队ID级联的内部硬件设备ID的SHA-1(或任何其他散列)。



它们是两个不同的ID,用于两个不同的目的。 我认为identifierForVendor可以用来做需要应用程序链接到特定用户/设备的事物,例如提供推送通知和更新用户的应用程序数据服务器端(比如他们的分数或任何其他数据被存储为他们)。
identifierForAdvertising应该用于诸如有针对性的广告之类的事情,并且还要检查特定广告活动的有效性(检查由于特定广告而知道哪些设备安装了应用程序)。


重要的是要知道,identifierForVendor的备份只能恢复到同一个设备。 如果备份恢复到差异设备,标识符将被清除。


我怀疑,如果您将identifierForAdvertising用于与广告无关的任何事情(例如,如果您将identifierForAdvertising ForAdvertising发送到您自己的服务器(即使您不是广告网络),或者如果您将identifierForAdvertising与其他数据相同的请求可能会识别个人)。

如果我的怀疑是正确的,那么identifierForVendor优于identifierForAdvertising的优点是它不会让您的应用程序被拒绝。


重要提示

苹果刚刚发布了iOS 6.0,并且NDA已经取消。

对于预先包含引用的代码的开发人员

[[UIDevice currentDevice] identifierForAdvertising]

此方法并未包含在iOS 6中。如果您使用上述方法,您的应用程序将(最可能)崩溃并被拒绝!

相反,Apple创建了一个新类ASIdentifierManager ,其中包含方法advertisingIdentifier 。 这里是苹果的文档


用户可以限制在手机上使用广告跟踪。 请参阅设置>常规>关于>广告下关于选择退出机制的文章

新的ASIdentifierManager类有一个属性ASIdentifierManager ,根据用户是否有限的广告跟踪,该属性返回true或false。 即使设备的广告标识符由advertisingIdentifier属性返回,而不管退出,但如果用户选择退出,则不应使用该标识符。

因此,identifierForVendor的优势在于,无论用户选择加入还是退出广告跟踪,您都可以随时访问并有权使用此ID。


Swift版本

func UUID() -> String {

    let bundleName = NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String
    let accountName = "incoding"

    var applicationUUID = SAMKeychain.passwordForService(bundleName, account: accountName)

    if applicationUUID == nil {

        applicationUUID = UIDevice.currentDevice().identifierForVendor!.UUIDString

        // Save applicationUUID in keychain without synchronization
        let query = SAMKeychainQuery()
        query.service = bundleName
        query.account = accountName
        query.password = applicationUUID
        query.synchronizationMode = SAMKeychainQuerySynchronizationMode.No

        do {
            try query.save()
        } catch let error as NSError {
            print("SAMKeychainQuery Exception: \(error)")
        }
    }

    return applicationUUID
}




ios privacy udid ios6