[[UIDevice currentDevice] uniqueIdentifier]
我们正在使用的应该?
如果手机被卖给另一个用户......并且应用程序已根据手机的UDID在远程服务器上存储了一些数据,该怎么办?
(当然,我想避免应用商店的“加密限制”问题。)
答案 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)
一种解决方案是让应用程序发布免费的应用内购买。
此次购买将是:
可跟踪,具有唯一编号(购买)编号,仅对您的应用有意义。
如果此人切换设备,则可移动
可检索,如果应用程序被删除(或手机被擦除并重新加载) - 可以恢复应用内购买。
答案 6 :(得分:0)
Apple的文档说:
“不要使用uniqueIdentifier属性。要创建唯一的 特定于您的应用的标识符,您可以调用CFUUIDCreate 函数创建一个UUID,并使用它将其写入默认数据库 NSUserDefaults类。“
这是一个快速摘录:
CFUUIDRef udid = CFUUIDCreate(NULL);
NSString *udidString = (NSString *) CFUUIDCreateString(NULL, udid);