如何唯一识别ios设备
在我目前的应用程序中,我必须让用户从不同的iOS设备login到他们的帐户。 目前我正在做一个令牌值的用户身份validation。 但为了支持多个设备login,我必须find另一种方式来做到这一点。
因此,我想保存设备uuid
与令牌authentication+安全。 然后,我才知道我不能使用设备的uuid
,而是必须使用可能提供或不提供用户或设备信息的identifierForVendor
。
那么,有没有人可以提出更好和适当的方式来实现这个多个设备loginfunction为同一个用户帐户在IOS?
因为您已经知道使用设备的UUID是不允许的,但是您可以生成自己的UUID并将其存储在设备的UserDefaults中。
使用identifierForVendor并不是100%可靠的,因为它只能在iOS6及更高版本上运行,而且用户有权select不给予您,这是不好的select。
这里有一些代码我复制的互联网前不久,仍然使用它,直到今天,将尝试find来源,并更新我的答案了一下。 编辑: 来源
这将在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"]; }
现在你可以select追加你自己的用户ID,这样你就可以知道UUID与哪个用户链接了。
这只是它应该如何工作的粗略草图
首先,苹果开发者指南禁止/阻止使用IDFA跟踪用户以显示有针对性的广告(和其他一些事情)。 准则明确允许开发人员使用IDFA来识别设备用于安全目的。 引用苹果的指导方针
advertisingTrackingEnabled
一个布尔值,指示用户是否有限制的广告跟踪。 (只读)
@ 属性 (非primefaces,只读,getter = isAdvertisingTrackingEnabled)BOOL advertTrackingEnabled
讨论
在执行任何广告跟踪之前检查此属性的值。 如果值为NO,则仅将广告标识符用于以下目的:频次上限,转换事件,估计唯一用户数量,安全和欺诈检测以及debugging。
您可以使用设备的IDFA用于多个设备login。 stream程会有点像这样:
-
用户使用设备Alogin到服务器,服务器发送一个存储在
NSUserDefaults
设备中的NSUserDefaults
。 该应用程序还将IDFA存储在NSUserDefaults
的设备上 -
该令牌将用于创build一个包含IDFA的encryptionstring。 (使用令牌对IDFA进行encryption)每个请求中都会将encryption值与原始IDFA一起传递给服务器。
-
然后,服务器将使用IDFA和与其关联的令牌(服务器当然会存储对应于每个令牌的IDFA),以获得IDFA的encryption值,并将其与请求中接收到的encryption值进行匹配。 这样做的目的是确保没有人能侵入你的服务器,因为除了应用程序之外,任何人都不能看到令牌(你甚至可以以encryption的格式存储令牌以提高安全级别)。
-
无论何时向服务器发送请求,
NSUserDefaults
存储在设备上的IDFA的值将与当前的IDFA进行比较。 -
在不匹配的情况下,当前的IDFA将首先更新到服务器,然后在获得成功更新的确认之后,应用将用当前的
NSUserDefaults
replace存储在设备上的IDFA(然后业务像往常一样运行) 。
或者,您可以避免步骤3,4并在NSUserDefaults
IDFA存储在设备上,但在这种情况下,用户将不得不在重置IDFA时重新login到服务器。
只要确认,令牌到IDFA的映射将是多对一的。
希望这有助于在任何不清楚/不满足用例的情况下发表评论。
您应该使用创buildUUID的标准方法。 苹果不希望你跟踪设备。
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);