如何唯一地识别ios设备
在我当前的应用程序中,我必须让用户从不同的iOS设备登录到他们的帐户。目前,我正在从令牌值进行用户身份验证。但为了支持多设备登录,我必须找到另一种方法来实现这一点 因此,我考虑将设备如何唯一地识别ios设备,ios,iphone,objective-c,security,authentication,Ios,Iphone,Objective C,Security,Authentication,在我当前的应用程序中,我必须让用户从不同的iOS设备登录到他们的帐户。目前,我正在从令牌值进行用户身份验证。但为了支持多设备登录,我必须找到另一种方法来实现这一点 因此,我考虑将设备uuid与令牌一起保存,以实现身份验证+安全性。然后,我知道我不能使用设备的uuid,而是必须使用供应商的标识,这些标识可能会或可能不会始终提供用户或设备信息 那么,有谁能为ios中的同一用户帐户提供更好、更合适的实现多设备登录功能的方法吗?您应该使用创建UUID的标准方法。苹果不希望你使用跟踪设备 To crea
uuid
与令牌一起保存,以实现身份验证+安全性。然后,我知道我不能使用设备的uuid
,而是必须使用供应商的标识,这些标识可能会或可能不会始终提供用户或设备信息
那么,有谁能为ios中的同一用户帐户提供更好、更合适的实现多设备登录功能的方法吗?您应该使用创建UUID的标准方法。苹果不希望你使用跟踪设备
To create a unique identifier specific to your app, you can call the CFUUIDCreate function to
create a UUID, and write it to the defaults database using the NSUserDefaults class. (Source)
如果您想为此使用库而不是滚动自己的库,您应该像这样使用此优秀库:
CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault);
NSString *uuidString = (NSString *)CFUUIDCreateString(NULL,uuidRef);
CFRelease(uuidRef);
正如您已经知道的,不允许使用设备的UUID,但是,您可以生成自己的UUID并将其存储在设备的UserDefault上
使用identifierForVendor并不是100%可靠的,因为它只适用于iOS6及以上版本,用户可以选择不将其提供给您,这使得它成为一个糟糕的选择
这里有一些代码是我以前从互联网上复制的,直到今天仍然在使用,我将尝试找到源代码并在一段时间内更新我的答案。
编辑:
这将在UserDefaults中为您生成并存储UUID:
- (NSString *)createUUID
{
CFUUIDRef theUUID = CFUUIDCreate(NULL);
CFStringRef string = CFUUIDCreateString(NULL, theUUID);
CFRelease(theUUID);
[[NSUserDefaults standardUserDefaults] setObject:(__bridge NSString *)string forKey:@"UUID"];
[[NSUSerDefaults standardUserDefaults] synchronize];
return (__bridge NSString *)string;
}
当您需要读取生成的UUID时:
- (NSString*)UUID
{
return [[NSUserDefaults standardUserDefaults] ObjectForKey:@"UUID"];
}
现在,您也可以选择将自己的用户ID附加到该ID,这样您就可以知道哪个UUID链接到哪个用户
这只是它应该如何工作的一个粗略概述首先,苹果开发者指南禁止/不鼓励使用IDFA跟踪用户以显示目标广告(以及其他一些事情)。该指南明确允许开发人员使用IDFA识别设备,以达到安全目的。引用苹果指南
广告跟踪功能
一个布尔值,指示用户是否具有有限的广告跟踪。(只读)
@属性(非原子、只读、getter=isAdvertisingTrackingEnabled)BOOL advertisingTrackingEnabled
讨论
在执行任何广告跟踪之前,请检查此属性的值。如果该值为否,则仅将广告标识符用于以下目的:频率上限、转换事件、估计唯一用户数、安全和欺诈检测以及调试
您可以使用设备的IDFA进行多个设备登录。流程有点像这样:
用户使用设备A登录到服务器,服务器发回一个令牌,该令牌存储在NSUserDefaults
中的设备上。应用程序还将IDFA存储在设备的NSUserDefaults
此令牌将用于创建包含IDFA的加密字符串。(使用令牌加密IDFA)加密值将在每个请求中与原始IDFA一起传递给服务器
然后,服务器将使用IDFA及其关联的令牌(服务器当然将存储与每个令牌对应的IDFA)来获取IDFA的加密值,并将其与请求中接收到的加密值相匹配。这样做的目的是确保没有人可以侵入您的服务器,因为除了应用程序之外,任何人都看不到令牌(您甚至可以以加密格式存储令牌,以提高安全级别)
无论何时向服务器发送请求,都会将设备上存储在NSUserDefaults
中的IDFA值与当前IDFA值进行比较
如果存在不匹配,将首先将当前IDFA更新到服务器,然后在获得成功更新的确认后,应用程序将使用当前IDFA替换存储在设备上的NSUserDefaults
(然后正常运行)
或者,您可以避免步骤3、4,并将IDFA存储在设备的NSUserDefaults
中,但在这种情况下,用户必须在重置IDFA时重新登录到服务器
仅需确认,令牌到IDFA的映射将是多对一的
希望这有帮助,如果有任何不清楚/不符合用例的地方,请发表评论。我假设如果用户重新安装应用程序,将创建一个新的UUID?这听起来没什么用处。如果id可以更改,人们希望信用卡公司如何将欺诈活动追溯到设备?@Sineauthm这不是此解决方案的范围,我不知道你的意思,但有十亿种方法可以在手机上跟踪活动,只是不向第三方开发者开放,我想它只能通过苹果访问,或国家安全局;),但如果你指的是设备的UDID,那永远不会改变!金融应用程序需要能够唯一地识别设备,并将该信息发送给处理器(如万事达卡)。苹果让UUID变得不可访问,如果用户卸载并重新安装应用程序,他们提供的ApplicationID替代方案可能会改变,就像应用程序生成自己的代码一样——所以它并没有真正识别任何设备,是吗?我不是好斗,我只是想解决这个问题。@我理解你的观点,但他们不仅依赖设备信息作为识别用户的唯一方式,记住他们必须在安装时注册设备,如果用户重新安装应用程序,这会将当前生成的UDID链接到他们的用户名/帐户,他们仍然需要再次注册并将新生成的UDID链接到新帐户,并且在他们的内部日志中,他们仍然拥有该客户机使用过的所有UDID的所有交易历史记录。。H