2013-10-04 123 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的映射將是多對一的。

希望這可以幫助,在任何不清楚/不滿足用例的情況下評論。