Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果没有,使用什么;iphoneudid;?_Iphone_Objective C_Xcode_Encryption_Udid - Fatal编程技术网

如果没有,使用什么;iphoneudid;?

如果没有,使用什么;iphoneudid;?,iphone,objective-c,xcode,encryption,udid,Iphone,Objective C,Xcode,Encryption,Udid,哇。。。看看本周网上所有关于使用iPhone的UDID的“恐慌故事” [[UIDevice currentDevice] uniqueIdentifier] 我们应该用什么来代替呢 如果手机卖给了其他用户怎么办。。。应用程序根据手机的UDID在远程服务器上存储了一些数据 (当然,我想避免应用商店的“加密限制”问题)推荐的方法是使用UUID生成,并将其与用户自己愿意向应用提供的内容关联起来 然后,将该数据存储在外部,以便再次检索。可能还有其他方法可以轻松做到这一点,但这是推荐的方法。为什么不使

哇。。。看看本周网上所有关于使用iPhone的UDID的“恐慌故事”

 [[UIDevice currentDevice] uniqueIdentifier]
我们应该用什么来代替呢

如果手机卖给了其他用户怎么办。。。应用程序根据手机的UDID在远程服务器上存储了一些数据


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

推荐的方法是使用UUID生成,并将其与用户自己愿意向应用提供的内容关联起来


然后,将该数据存储在外部,以便再次检索。可能还有其他方法可以轻松做到这一点,但这是推荐的方法。

为什么不使用Mac地址,然后可能将其散列

有一个很好的设备扩展类别

-(NSString*)macaddress
{
int-mib[6];
尺寸透镜;
char*buf;
无符号字符*ptr;
结构if_msghdr*ifm;
结构sockaddr_dl*sdl;
mib[0]=CTL_NET;
mib[1]=AF_路由;
mib[2]=0;
mib[3]=AF_链路;
mib[4]=净注册列表;
if((mib[5]=if_nametoindex(“en0”))==0){
printf(“错误:if_nametoindex Error\n”);
返回NULL;
}
if(sysctl(mib,6,NULL,&len,NULL,0)<0){
printf(“错误:sysctl,取1\n”);
返回NULL;
}
如果((buf=malloc(len))==NULL){
printf(“无法分配内存。错误!\n”);
返回NULL;
}
if(sysctl(mib,6,buf,&len,NULL,0)<0){
printf(“错误:sysctl,取2”);
返回NULL;
}
ifm=(结构if_msghdr*)buf;
sdl=(结构sockaddr_dl*)(ifm+1);
ptr=(无符号字符*)LLADDR(sdl);
NSString*outstring=[NSString stringWithFormat:@“%02X:%02X:%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)];
免费(buf);
回报突出;
}

你可以用这个模型来解释一下吗?

UUID刚刚贬值,所以会有一段时间,苹果还没有对这种贬值说太多,我会等到他们对此有更多的发言,也许他们会提供一些替代方案。

一个解决方案是让应用程序问题成为免费的应用程序内购买

这次购买将是:

  • 可跟踪,具有唯一编号(购买)编号,仅对您的应用程序有意义

  • 可移动,如果人员切换设备

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


  • 苹果的文件说:

    “不要使用uniqueIdentifier属性。要创建唯一的 特定于应用程序的标识符,您可以调用CFUUIDCreate 函数创建UUID,并使用 NSUserDefaults类。”

    下面是一个简短的片段:

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

    正如我今早在中所问的,有一些替代方案:

    1-首先,正如苹果公司建议的那样,识别每个安装,而不是识别每个设备。 因此,可以使用CFUUIDRef。例如:

    NSString *uuid = nil;
    CFUUIDRef theUUID = CFUUIDCreate(kCFAllocatorDefault);
    if (theUUID) {
      uuid = NSMakeCollectable(CFUUIDCreateString(kCFAllocatorDefault, theUUID));
      [uuid autorelease];
      CFRelease(theUUID);
    }
    
    2-如果您关心全球唯一标识符,那么您可以将该标识符存储在iCloud上

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

    像这样:

    @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来存储它。

    我不知道本周的故事是什么。你应该把这变成一个具体的问题。你打算用UDID做什么?当然不是完全的用户凭证替换?你想做什么?我使用一个咸md5ed版本的UDID来知道从哪个设备数据被同步到另一个设备。我想这没关系。我不会向我的服务器报告任何事情来查看人们在我的应用程序上做了什么。坏的不是udid的使用,坏的是那些“间谍”功能。那些家伙用UDID做的每件事都可以通过另一种方式实现。UDID被用来“识别唯一的设备或用户”。。。要“保存和检索数据”。。。我相信其中一些信息是非常隐私的。应该用什么来代替?某个用户不能假装是另一个用户。所有这些都没有检查电子邮件地址、用户名或密码。在向应用商店提交应用程序时,md5(或任何)类型的加密难道没有大问题吗?首先,你不应该使用UDID进行任何操作。我无法理解为什么苹果一开始就向开发者开放它。问题是,在同一台设备上重新安装同一个应用程序时,它不会持久。这就是设备UUID的目的。将其与给定的用户id关联。这不是标识的目的吗?它应该基于用户同意。如果它是通过使用MAC地址和它的其他组合来解决的,那么这和使用UDID没有什么区别。如果出于安全/隐私考虑,他们不允许UDID,那么他们也会阻止其他类型的硬件标识。遗憾的是,返回的UUID在应用程序的各个安装中并不一致。(即,删除应用程序,重新安装,您将获得一个完全不同的UUID)请参阅下面我的回答,该回答在创建时使用UserDefaults存储UUID。也许我误解了这个问题或您的答案,但这似乎与所需相反——这是一个可以表示未绑定到该设备的另一个用户的ID(因此,即使擦拭过手机,也会随手机一起出售,等等)。他确实要求更换绑定到de的UDID
    @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