2014-09-23 139 views
0

我正在iPad上開發針對特定業務需求的企業應用程序。 此應用程序旨在用於由管理員預定義的特定數量的設備。在iOS中唯一標識設備

但是我還需要應用程序拒絕任何登錄請求,即使它來自授權用戶,當他或她使用未由管理員定義的設備時。

編輯:

說我有2臺設備,我有我的憑據登錄到應用程序,而我需要的是,限制從設備登錄這是不是我的。 爲此,我必須確定登錄請求是否來自我的設備。

以前我們可以使用設備UDID來做到這一點,但現在它已被棄用。

任何人都可以請建議一種方法來實現這個?

+0

你有沒有auth服務器?它提供Api的註冊/註銷?在這種情況下,我將分享我們在B2B企業APP中使用的方法。 – bllakjakk 2014-09-23 11:55:44

+0

對不起,我沒有任何auth服務器。我們只有一個應用程序與之通信的服務器。我們計劃使用此服務器驗證設備。 – 2014-09-23 12:06:38

+0

我添加了刪除auth服務器相關部分的方法。請檢查您的使用案例。 – bllakjakk 2014-09-23 12:19:21

回答

0

如何使用蘋果的企業分銷系統?這將允許您將應用程序部署到公司,並擁有嚴格的訪問控制。

https://developer.apple.com/programs/ios/enterprise/

+0

Hi Nailer, 謝謝。 實際上,該應用程序目前在應用程序商店中可用(未使用企業許可證構建),因此需要通過包含此功能來更新相同的應用程序。 – 2014-09-23 11:45:56

+0

好的。從你的問題,它似乎是一個可行的解決方案:) – Nailer 2014-09-23 13:23:20

+0

建議的想法是足夠好,但我的應用程序已經在應用程序商店,並閱讀我們不能將應用程序發佈到應用程序商店,如果我們正在使用蘋果的企業分佈式系統。 – 2014-09-25 06:43:47

1

試試這個。更多信息檢查UIDevice

// IOS 6+ 
    NSString *uniqueIdentifier = [[NSString alloc] initWithString:[[[UIDevice currentDevice] identifierForVendor] UUIDString]]; 
+0

identifierForVendor僅在運行時生成,這意味着我們只在應用程序安裝完成後才能獲取該標識符。 但在我的情況下,我需要明確定義通信服務器中的設備列表。這樣我可以檢查它是否是授權設備。 – 2014-09-23 11:54:39

+0

然後Nailer答案是正確的。您需要使用Apple的企業分銷系統。 – Deepak 2014-09-23 11:58:11

0

只是絕招:

可以實現APNS碼到您的項目並獲取設備令牌。

設備令牌是唯一的。但用戶必須允許APNS。

注意:APNS設備令牌更改爲以下原因。

  1. 更改捆綁ID。
  2. 轉變發展模式(沙盒/生產部)
0

我已經實現了整整您的問題,最好的解決方案的解決方案(和蘋果推薦的路線)是創建一個UUID專屬於您的應用程序是這樣的:

NSString *uuidString = nil; 
    CFUUIDRef uuid = CFUUIDCreate(NULL); 
    if (uuid) { 
     uuidString = (NSString *)CFBridgingRelease(CFUUIDCreateString(NULL, uuid)); 
     CFRelease(uuid); 
    } 

然後,這是關鍵,你可以存儲到iOS的鑰匙串(手持類在這裏:https://github.com/lukef/IXKeychain)和值在iOS的鑰匙串,當用戶卸載應用程序不會被刪除,所以你可以堅持你的通過應用程序安裝擁有UUID,這是管理特定數量設備的關鍵部分 用戶帳號。

+0

我很抱歉,這不會解決我的問題。 說我有2臺設備,我有我的憑據登錄到應用程序, 而我需要的是,限制從設備登錄這是不是我的。 爲此我實現了一種機制來識別登錄請求是否來自我的設備。以前我們可以使用設備UDID來做到這一點,但現在它已被棄用。 – 2014-09-23 12:07:41

+1

好吧,我明白了,所以您在安裝應用程序之前正在尋找基於唯一標識符的設備?如果是這樣,你將無法做到這一點。 – Sammio2 2014-09-23 12:18:40

+0

除非您按照其他答案所建議的方式進行企業分銷路線。 – Sammio2 2014-09-23 12:19:49

0

此方法將爲每個設備返回一個字符串。由於每次都會改變單個設備 ,因此我們將它存儲在鑰匙串中,並且可以在需要時將其引用。

+ (NSString *) uniqueDeviceIdentifier 
    { 

    NSString *deviceUUID = [[SGKeyChain defaultKeyChain] stringForKey:@"uniqueId"]; 

     if (!deviceUUID) { 

      if (!deviceUUID.length) { 

     NSString *deviceUUID = @""; 

     CFUUIDRef uuidRef = CFUUIDCreate(NULL); 

     CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef); 

     CFRelease(uuidRef); 

     deviceUUID = [NSString stringWithFormat:@"%@",[NSString stringWithString:(__bridge_transfer NSString *)uuidStringRef]]; 

    [[SGKeyChain defaultKeyChain] setObject:deviceUUID forKey:@"uniqueId" accessibleAttribute:kSecAttrAccessibleAlways]; 

     } 
    }  
     return deviceUUID; 
    } 

喲可以參考這個倉庫...... https://github.com/sgup77/SGKeyChainWrapper爲SGKeyChain實施

0

好吧,我將分享我們遵循一個B2B的企業應用程序的方法。 。

每個用戶都有登錄ID和密碼。

1.因此,用戶使用deviceReg API將服務器註冊到服務器,該API使用clientDeviceId作爲參數(客戶端生成的uuid)以及用戶名和密碼。

2.服務器返回服務器生成的唯一標識符,供應用程序在該特定設備上使用。

結束 -通過這種方式,您可以限制用戶使用某個設備。

您可以使用以下方法來生成設備專用客戶端UUID

- (NSString *)getUuid 
{ 
    CFUUIDRef uuidRef = CFUUIDCreate(NULL); 
    CFStringRef uuidStringRef = CFUUIDCreateString(NULL, uuidRef); 
    CFRelease(uuidRef); 
    NSString *uuid = [NSString stringWithString:(__bridge NSString *)uuidStringRef]; 
    CFRelease(uuidStringRef); 
    return uuid; 
} 

請注意: 我刪除有關使用AUTHKEY,的accessToken和其他人,我們使用安全的目的,你不使用任何的解釋auth服務器。

我希望它有幫助。

更新1

既然你有一個企業應用程序,所以我相信你會是具有至少應用戶的電子郵件標識。

因此,客戶經理應該比第一次向所有活動賬戶發送帶有一次性令牌的電子郵件。

註冊設備併發送給服務器進行驗證時,該令牌可以由應用程序請求。

此外,服務器還會使令牌失效,以避免誤用。

應該有一個migrAtion API,如果用戶遷移設備,它將使用服務器生成的設備ID和遷移標記。

+0

感謝您分享這個想法。但我認爲,有可能由知道用戶憑證的人註冊不需要的設備。我對嗎 ? – 2014-09-23 13:06:11

+0

雖然可以有很多解決方案來處理這種情況。但是您可以使用您的服務器將令牌發送到短信網關服務器,該服務器會向預先註冊的手機號碼發送消息。短信服務器發送的短信令牌將與客戶端生成的DeviceID一起使用,以驗證用戶。 – bllakjakk 2014-09-23 13:25:58

+0

我們無法將設備鏈接到手機號碼,因爲我們沒有收集用戶的手機號碼,並且所有的iPad都可能沒有SIM卡支持:( – 2014-09-25 06:41:15

0

您可以使用iCloud的這裏是因爲UUID已被棄用,廠商ID是潮頭,但如果你卸載應用程序並安裝它agian可能會改變,

所以我建議的iCloud將更加安全,你在應用程序啓動時,您可以生成一個唯一的令牌,並將其與用戶憑據一起保存到您的iCloud數據存儲中,

因此,從下次開始用戶嘗試登錄時,您可以檢查它與iCloud。