IOS7中的UDID替代方案

14

是否有UDID的替代方案?我的应用程序将不会在App Store中发布,因为我使用企业发布。因此,是否有任何替代方案?我尝试过广告标识符、OpenUDID、UIID和SecureUDID。但是如果手机被重置,那么我将得到一个新的UDID。非常感谢任何帮助。


尝试获取设备令牌。 - Tendulkar
@Tendulkar 当设备被擦除或设备内容被删除时,它会发生变化。 - Avinash
你无法在iOS 7中创建UDID,请查看苹果文档:https://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html#//apple_ref/occ/instp/UIDevice/identifierForVendor - Sandeep Khade
@user2739931 我也很感兴趣,因为我需要确定哪款智能手机正在访问我的企业应用程序。 - noircc
@ZuzooVn 广告标识符是UDID的最佳替代品。不足之处在于,如果用户重置设置(这非常不可能发生),它是最佳的替代方案。 - Avinash
显示剩余2条评论
7个回答

16

如果您的iOS版本高于6.0,您可以使用identifierForVendor或者CFUUIDRef

-(NSString*)uniqID
{
    NSString* uniqueIdentifier = nil;
    if( [UIDevice instancesRespondToSelector:@selector(identifierForVendor)] ) {
        // iOS 6+
        uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    } else {
        // before iOS 6, so just generate an identifier and store it
        uniqueIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"identifierForVendor"];
        if( !uniqueIdentifier ) {
            CFUUIDRef uuid = CFUUIDCreate(NULL);
            uniqueIdentifier = ( NSString*)CFUUIDCreateString(NULL, uuid);
            CFRelease(uuid);
            [[NSUserDefaults standardUserDefaults] setObject:uniqueIdentifier forKey:@"identifierForVendor"];
        }
    }
return uniqueIdentifier;
}//

更新

Leon Lucardie所评论,他是正确的。

identifierForVendor在应用程序卸载/重新安装后将更改。参见此处。在iOS设备上安装应用程序(或来自同一供应商的另一个应用程序)时,此属性中的值保持不变。当用户从设备中删除该供应商的所有应用程序并随后重新安装其中一个或多个应用程序时,该值会更改。


7
identifierForVendor在应用卸载/重新安装后会更改。请参见此处当该应用程序(或同一供应商的另一个应用程序)安装在iOS设备上时,该属性中的值保持不变。但是,如果用户删除该供应商的所有应用程序,然后随后重新安装其中一个或多个应用程序,则该值将更改。 - Leon Lucardie
使用上述代码对我有效,这就是为什么我将其作为答案并在卸载/重新安装后测试它的原因。 - Nitin Gohel
这可能可行,但前提是您必须有来自同一供应商的其他应用程序来保留设备上的标识符。如果用户只有一个特定供应商的应用程序,则在重新安装后标识符将更改。考虑到在大多数情况下都是后者的情况,它并不是UDID的非常可靠的替代品。 - Leon Lucardie
@所有人:即使应用程序被卸载并重新安装,广告标识符仍将保持不变。但是当手机内容被擦除时,我会失去它。即使使用UIID也是如此。还有其他建议吗?或者这个问题没有替代方案。我甚至尝试了Mac地址,但在IOS7中也已被删除。 - Avinash
@Nitin,你可以将uniqueIdentifier存储在钥匙串中,而不是用户默认设置中。 - fyasar
显示剩余2条评论

3

您需要创建供应商ID,然后使用钥匙串将其保存,并在重置手机时获取它,使用日期时间。

请查看此链接:iOS7的UUID和UDID


3

尝试了所有可能的替代方案后,广告标识符是最好的选择。我测试过,即使手机重置,它仍然保持不变。如果用户在设置中关闭它,那么我们会得到一个空值。除了这个小问题,这是迄今为止最好的替代方案。如果我找到其他更好的替代方案,我会更新的。


2
错误的决定,苹果将拒绝您的应用。您不能将广告标识符用于此目的,它只允许用于广告服务目的。 - Saurabh Passolia
1
我已经在问题部分提到了我要进行企业级分发。 - Avinash

2

非常简单,只需要使用以下代码:

-(NSString *)getUID{
    if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) {
    // This is will run if it is iOS6 and above
        return [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    } else {
    // This is will run before iOS6 and you can use openUDID or other
    // method to generate an identifier
        return [OpenUDID value];  
    }  
}

如您所知,如果您计划支持iOS 5,则应使用OpenUDID(即使在iOS 5上,Apple也限制读取UDID)。 有些答案可能会被苹果拒绝(我的代码已获得多款应用的批准)。

请注意,如果用户删除了该应用程序(或所有供应商应用程序(如果有多个))并重新安装,则identifierForVendor将更改。


@所有人 广告标识符即使在应用程序被卸载和重新安装时仍将保持不变。但是当手机内容被擦除时,我会失去它。即使使用UIID也是一样的。还有其他建议吗?或者这个问题没有替代方案。我甚至尝试了Mac地址,但在IOS7中也已被删除。 - Avinash

1
我使用APNS令牌和vendorId的组合。两者都被检查以验证手机身份,并在其中一个更改时相应地在手机和服务器上更新它们。
当应用程序被卸载和/或重置并存储几个月后,仍然可能会导致两者都更改。
这将导致下一次手机安装该应用程序时,它将被识别为新设备。
除此之外,我在服务器上运行一个进程,标记任何未连接到服务器超过两个月的设备为已删除。
在这种情况下,需要进行用户身份验证,并将手机重新添加到客户设备池中。
我只有一个应用程序,但是一旦我有第二个应用程序,我可能会包括advertisingId。

0

您可以在iOS 6+上使用Swift 2.2版本。

var uniqueIdentifier: NSString!
uniqueIdentifier = UIDevice.currentDevice().identifierForVendor?.UUIDString

0

@all 广告标识符在应用被卸载和重新安装后仍然保持不变。但当手机内容被清除时,该标识符将丢失。即使使用UIID也是如此。还有其他建议吗?或者这个问题没有替代方案。我甚至尝试过Mac地址,在iOS7中也被删除了。 - Avinash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接