31

我们的 iOS 应用程序适用于特定用户。因此,我们使用设备唯一标识符进行用户识别。这种方法在 iOS 6 之前都可以正常工作,因为我们每次都得到相同的值。

NSString *strUniqueIdentifier = [[UIDevice currentDevice] uniqueIdentifier];

在 iOS 7 中,上述方法返回不同的值,我们遇到了用户识别问题。iOS 7 提供了以下替代.

NSUUID *oNSUUID = [[UIDevice currentDevice] identifierForVendor];
[strApplicationUUID setString:[oNSUUID UUIDString]];

我们替换uniqueIdentifieridentifierForVendor,并创建了一个 Ad-hoc 构建。然后,我们在 iOS 7 和 iOS 6 设备上安装了构建。到目前为止,在 iOS 7 中,我们每次都获得相同的值,但 iOS 6每次删除和重新安装应用程序时都会给出不同的值。

4

7 回答 7

31

使用这个小助手方法在应用程序的安装/删除会话之间将标识符保留在 Keychain 中

-(NSString *)getUniqueDeviceIdentifierAsString
{
    NSString *appName=[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];

    NSString *strApplicationUUID = [SSKeychain passwordForService:appName account:@"incoding"];
    if (strApplicationUUID == nil)
    {
        strApplicationUUID  = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
        [SSKeychain setPassword:strApplicationUUID forService:appName account:@"incoding"];
    }

    return strApplicationUUID;
}

SSKeychain库添加到您的项目中,例如通过 Cocoapodspod 'SSKeychain'

于 2014-04-08T12:45:13.227 回答
8

UDID 用什么代替?

目前看来,Apple 计划用两种不同的标识符替换 UDID:供应商 ID 和广告 ID。

供应商 ID

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

广告 ID

设备独有。适用于所有应用程序;用于广告 — iAd 已从 iOS 6 及更高版本的 UDID 转换。使用“删除所有内容和设置”进行重置。


在大多数情况下,供应商 ID 将允许拥有多个应用程序的开发人员在他们的所有应用程序中将您识别为同一用户。这可以帮助开发人员更好地了解他们的受众并提供更好的服务。

广告 ID 仍会为设备创建唯一标识符,但与 UDID 不同的是,它可以关闭或重置,就像可以在台式机或笔记本电脑的浏览器中控制 cookie 一样。

随着本周早些时候 iOS7 的发布,Apple 采取了额外的措施,即关闭另一个唯一标识符——应用程序开发人员和广告公司可以使用的“MAC 地址”,而不是新的广告 ID。通过堵住这个漏洞,Apple 正在迈出很好的一步,迫使这些公司只使用用户可以控制的跨应用标识符。

还有待观察的是,目标公司是否会继续寻求绕过苹果授权的方法。其他技术,如“设备指纹识别”,已被开发用于在 Apple 框架之外唯一地识别您的设备。苹果是否会打击这些方法还有待观察。

于 2015-06-05T07:29:46.910 回答
2

来自UIDevice 类identifierForVendor参考:

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

于 2013-10-26T12:44:42.750 回答
2

iOS7 设备上是否安装了来自同一供应商的其他应用程序?根据文档

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

您是否通过 AppStore 提供应用程序?如果不:

如果应用程序不是从应用商店安装的(例如当应用程序仍在开发中时),供应商将根据应用程序的捆绑 ID 确定。捆绑 ID 假定为反向 DNS 格式,前两个组件用于生成供应商 ID。例如,com.example.app1 和 com.example.app2 似乎具有相同的供应商 ID。

于 2013-10-26T12:46:03.953 回答
1

如果设备上没有安装您签名的其他应用程序,则可以更改供应商标识符。此外,如果您通过不同的分发方法安装应用程序,供应商的标识符可能会发生变化,即。当通过 XCode 安装和通过 TestFlight 或 HockeyApp 分发时,应用程序可能没有相同的供应商标识符。

于 2013-10-26T12:44:25.283 回答
0

尝试清除计算机上的应用程序缓存,然后检查。可能是你的缓存问题

于 2013-10-26T13:53:28.413 回答
0

要为nerowolfe 的回答添加一些内容,有一个很棒的 Keychain Wrapper MCSMKeychainItem, 名为

[MCSMApplicationUUIDKeychainItem applicationUUID];

所以基本用法是这样的

+ (NSString *)deviceId {
  // load unique device ID or generate new one
  return [MCSMApplicationUUIDKeychainItem applicationUUID];
}

它基于 Keychain 工作,它存储曾经生成的唯一标识符(如 nerowolf 建议的那样)。它是开源的,你可以在 github 上下载它。

注意:我不是扩展的作者,我也不认识他/她。

于 2015-09-19T12:08:38.333 回答