2013-10-04 56 views
9

在我目前的应用程序中,我必须让用户从不同的iOS设备登录到他们的帐户。目前我正在使用令牌值进行用户验证。但为了支持多设备登录,我必须找到另一种方式来做到这一点。如何唯一识别ios设备

因此,我想保存设备uuid以及用于验证+安全的令牌。然后,我开始知道我不能使用设备的uuid,而不得不使用identifierForVendor,这可能会或可能不会始终提供用户或设备信息。

那么,任何人都可以建议更好和适当的方式来实现这个多个设备登录功能为相同的用户帐户在ios?

回答

7

正如你已经知道这使用设备的UUID不但是,您可以生成自己的UUID并将其存储在设备的UserDefaults中。

使用identifierForVendor不是100%可靠的,因为它只能在iOS6及更高版本上运行,并且用户可以选择不提供给您,这使得它不是一个好选择。

这里有一些代码我复制了互联网前段时间,直到今天仍然使用它,将尝试找到源并更新我的答案。 编辑:Source

这将产生和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,以便你能够知道哪些UUID链接到哪个用户。

这只是一个粗略的草图它应该如何工作

+0

看起来很熟悉:http://nshipster.com/uuid-udid-unique-identifier/ – Luke

+0

我会假设,如果用户重新安装应用程序,将创建一个新的UUID? – Rupert

+0

@Rupert是的,你是对的! –

0

您应该使用创建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); 
2

首先,苹果开发者指南禁止/劝阻使用IDFA的跟踪用户进行显示目标广告(和其他一些东西)的目的。准则明确允许开发人员使用IDFA来识别出于安全目的的设备。引述苹果的指导方针

advertisingTrackingEnabled

一个布尔值,指示用户是否已限制广告跟踪。(只读)

@财产(非原子,只读,吸气= isAdvertisingTrackingEnabled)BOOL advertisingTrackingEnabled

讨论

执行任何广告追踪前,请检查该属性的值。如果值为NO,则仅将广告标识符用于以下目的:频次上限,转化事件,估计唯一用户数量,安全和欺诈检测以及调试。

您可以将设备的IDFA用于多个设备登录。流将是有点像这样的:在使用装置A的服务器

  1. 用户登录,服务器发回其被存储在设备上在NSUserDefaults的令牌。该应用程序还将IDFA存储在设备上NSUserDefaults

  2. 此令牌将用于创建包含IDFA的加密字符串。 (使用令牌加密IDFA)加密的值将与每个请求一起传递到服务器以及原始IDFA。

  3. 然后,服务器将使用IDFA和与其关联的令牌(服务器当然会存储对应于每个令牌的IDFA),以获得IDFA的加密值并将其与接收到的加密值进行匹配请求。这样做的目的是确保没有人能够侵入您的服务器,因为除了应用程序之外,任何人都无法看到令牌(您甚至可以以加密格式存储令牌以提高安全级别)。

  4. 无论何时向服务器发送请求,存储在设备上的IDFA的值将在NSUserDefaults中与当前的IDFA进行比较。

  5. 如果不匹配,当前的IDFA会首先更新到服务器,然后在获得成功更新确认后,应用程序会将NSUserDefaults中存储在设备上的IDFA替换为当前IDFA(和业务然后照常运行)。

或者你能避免步3,4和NSUserDefaults,但在该设备上存储IDFA可以将用户将不得不重新登录到有关重设IDFA服务器。

只要确认,令牌到IDFA的映射将是多对一的。

希望这可以帮助,在任何不清楚/不满足用例的情况下评论。