如果不使用“IPHONE UDID”,应该使用什么?(涉及IT技术)

9

哇...这一周在线上有很多关于使用iPhone的UDID的“恐慌故事”。

涉及到技术方面,请您谅解,如有不当之处请指出。
 [[UIDevice currentDevice] uniqueIdentifier]

我们应该使用什么替代品?

如果手机被卖给另一个用户......并且一个应用程序基于手机的UDID在远程服务器上存储了一些数据,那该怎么办?

(当然,我想避免应用商店的“加密限制”问题。)


2
我不知道本周的故事是什么。你应该把这个转化成一个具体的问题。你计划使用UDID做什么?肯定不是完全替代用户凭据吧? - marcc
提交应用程序到商店时,您是否遇到MD5(或任何)加密方面的大问题? - Patty
限制加密并不是苹果的想法 - 他们可能更愿意不必操心。美国法律禁止公司出口包含某些类型加密的产品。由于应用商店有效地将软件从美国出口到世界其他地方,因此有关加密的问题是不可避免的。 - Caleb
1
你本来就不应该使用UDID。苹果为什么一开始就向开发者提供它,这让我感到困惑。 - Sven
有几个很好的答案提供了。我建议你接受其中一个! - djskinner
显示剩余5条评论
7个回答

3

为什么不使用Mac地址,然后将其哈希化。

这里有一个优秀的UIDevice-Extension类别在这里

    - (NSString *) macaddress
{
    int                 mib[6];
    size_t              len;
    char                *buf;
    unsigned char       *ptr;
    struct if_msghdr    *ifm;
    struct sockaddr_dl  *sdl;

    mib[0] = CTL_NET;
    mib[1] = AF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_LINK;
    mib[4] = NET_RT_IFLIST;

    if ((mib[5] = if_nametoindex("en0")) == 0) {
        printf("Error: if_nametoindex error\n");
        return NULL;
    }

    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 1\n");
        return NULL;
    }

    if ((buf = malloc(len)) == NULL) {
        printf("Could not allocate memory. error!\n");
        return NULL;
    }

    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {
        printf("Error: sysctl, take 2");
        return NULL;
    }

    ifm = (struct if_msghdr *)buf;
    sdl = (struct sockaddr_dl *)(ifm + 1);
    ptr = (unsigned char *)LLADDR(sdl);
    NSString *outstring = [NSString stringWithFormat:@"%02X:%02X:%02X:%02X:%02X:%02X", 
                           *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    // NSString *outstring = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X", 
    //                       *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];
    free(buf);

    return outstring;
}

您可能可以使用模型对其进行哈希处理?

也许我误解了问题,或者你的回答,但这似乎是相反于所需的内容-即一个可以代表另一个用户的ID,而不是与该设备绑定(因此即使被擦除等情况也可以与手机一起出售)。 - Nicole
他确实要求提供一种替代UDID与设备绑定的东西! - Lee Armstrong
我在问题中没有看到那个。我看到的是一个要求唯一标识符的问题,然后根据我的理解,这个陈述表明OP不希望在手机被出售时将ID转移。 - Nicole

2

正如我在今天早上在这篇文章中提出的问题,有一些替代方案:

1- 首先,像Apple推荐的那样,按安装进行识别而不是按设备进行识别。 因此,您可以使用CFUUIDRef。例如:

NSString *uuid = nil;
CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
if (theUUID) {
  uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
  [uuid autorelease];
  CFRelease(theUUID);
}

2- 如果您关心一个全球唯一标识符,那么您可以将此标识符存储在iCloud上。

3- 最后,如果您真的需要一个在应用程序重新安装后仍然存在的标识符(这并不经常发生),您可以使用Keychains(苹果的keychain文档)。 但是,苹果团队会喜欢吗?


请参考此处的ARC: https://dev59.com/TWoy5IYBdhLWcg3wYc8l - djskinner

1

像这样:

@interface UIDevice (UIDeviceAppIdentifier)
@property (readonly) NSString *deviceApplicationIdentifier;
@end

@implementation UIDevice (UIDeviceAppIdentifier)
- (NSString *) deviceApplicationIdentifier
{ 
  static NSString     *name    = @"theDeviceApplicationIdentifier";
  NSUserDefaults  *defaults = [NSUserDefaults standardUserDefaults];  
  NSString              *value     = [defaults objectForKey: name];

  if (!value)
    {
      value = (NSString *) CFUUIDCreateString (NULL, CFUUIDCreate(NULL));    
      [defaults setObject: value forKey: name];
      [defaults synchronize];
  }
  return value;
}
@end

iOS文档或多或少地描述了使用CFUUIDCreate()来创建标识符,并建议使用UserDefaults来存储它。


1

UUID 已经被弃用,但它仍将存在一段时间。苹果公司尚未对此进行太多说明,我建议等待他们有更多的说法,或许他们会提供一些替代方案。


0

苹果的文档说:

“不要使用uniqueIdentifier属性。为了创建一个特定于您的应用程序的唯一标识符,您可以调用CFUUIDCreate函数来创建一个UUID,并使用NSUserDefaults类将其写入默认数据库。”

这是一个快速的代码片段:

CFUUIDRef udid = CFUUIDCreate(NULL);

NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid);

遗憾的是,应用程序安装后返回的UUID在不同的安装中不一致。(即删除应用程序,重新安装,将获得完全不同的UUID) - lorean
请看我的回复,它使用UserDefaults在创建时存储UUID。 - GoZoner

0

推荐的方法是使用UUID生成,并将其与用户自己愿意提供给应用程序的内容相关联。

然后,将这些数据存储在外部,以便可以再次检索。可能有其他更容易的方法来实现这一点,但这是推荐的方法。


问题在于,它在同一设备上重新安装相同应用程序后不会保持持久性。这就是设备UUID的目的。 - gcamp
将其与给定的用户ID关联起来。这不就是身份识别的目的吗?它应该基于用户同意。如果通过使用MAC地址和其他组合来解决问题,那么这与使用UDID没有什么区别。如果由于某些安全/隐私问题而禁止使用UDID,则他们也会阻止其他类型的硬件识别。 - Jesse Armand

0

一个解决方案是让应用程序发出免费的应用内购买。

这个购买将会是:

  1. 可追踪的,具有唯一的编号(购买)号码,仅对您的应用程序有意义。

  2. 可移动的,如果用户更换设备

  3. 可检索的,如果应用程序被删除(或手机被擦除和重新加载)- 应用内购买可以被恢复。


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