如果不是“IPHONE UDID”,该怎么用?

时间:2010-10-05 04:00:19

标签: iphone objective-c xcode encryption udid

哇...本周在线观看关于使用iPhone的UDID的所有“恐慌故事”。

 [[UIDevice currentDevice] uniqueIdentifier]

我们正在使用的应该

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

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

7 个答案:

答案 0 :(得分:3)

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

有一个优秀的UIDevice-Extension Category here

    - (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;
}

您可以使用模型对此进行哈希处理吗?

答案 1 :(得分:2)

正如我今天早上在this post中提到的那样,有一些选择:

首先,正如Apple推荐的那样,确定每次安装而不是识别每台设备。 因此,您可以使用CFUUIDRef。示例:

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

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

3-最后,如果你真的需要一个在重新安装app之后仍然存在的标识符(不经常发生),你可以使用Keychains(Apple's keychain doc)。 但苹果团队会喜欢吗?

答案 2 :(得分:1)

UUID刚刚折旧,因此将会出现一段时间,Apple还没有多说这种折旧,我会等到他们对此有更多的说法,也许会提供一些替代方案。

答案 3 :(得分: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来存储它。

答案 4 :(得分:0)

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

然后,将此数据存储在外部,然后再次检索。可能还有其他方法可以轻松完成,但这是推荐的方式。

答案 5 :(得分:0)

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

此次购买将是:

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

  2. 如果此人切换设备,则可移动

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

答案 6 :(得分:0)

Apple的文档说:

  

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

这是一个快速摘录:

CFUUIDRef udid = CFUUIDCreate(NULL);

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