2016-10-25 65 views
2

我有一個系統,每個用戶只允許爲兩個設備安裝應用程序。當用戶在同一設備上卸載並重新安裝時,會發生此問題。因此,它會生成新的UUID,並在應用程序檢查到Web服務時生成新的UUID。當用戶卸載並重新安裝時,設備UUID不唯一

應用程序將發送UUID和登錄ID,以檢查具有該登錄ID的用戶是否已安裝在兩個以上的設備中。我使用真正的iPhone和iPad設備,而不是使用模擬器。我不確定生產環境。目前,這些應用程序是使用AppStore分發配置文件使用Apple TestFlight分發的。

我生成使用此

let uuid = UIDevice.currentDevice().identifierForVendor!.UUIDString 

感謝UUID。

+1

這是'identifierForVendor'的預期行爲。它是*不是*終身獨特的設備標識符。您可以將自己的價值存儲在鑰匙串中,但您也應該爲用戶提供一個設施來刪除過時的設備;他們可能會因升級或保修更換而更換手機,或者直接擦除設備,這會清除鑰匙扣 – Paulw11

+0

Thanks @ Paulw11。如果用戶在兩臺設備上使用相同的iCloud帳戶。這兩個設備在鑰匙串中是否有相同的設備ID(唯一ID)? – xmhafiz

+0

您可以選擇是否將鑰匙串項目添加到iCloud鑰匙串中,或者將它保存在設備的本地 – Paulw11

回答

4

您需要使用鑰匙串:(爲了能夠匹配JNKeychain,您需要在您的pod文件pod 'JNKeychain'中輸入一個新字符串)。這將保證,如果你不改變你的包標識符,你將永遠有一個uniq設備ID(即使在刪除你的應用程序後也會保持不變)。我曾經在用戶被永久禁止在我們的應用程序中使用過,即使在刪除應用程序後,即使使用不同的帳戶,他也無法進入該應用程序。

import UIKit 
import JNKeychain 

class KeychainManager: NSObject { 
    static let sharedInstance = KeychainManager() 

    func getDeviceIdentifierFromKeychain() -> String { 

     // try to get value from keychain 
     var deviceUDID = self.keychain_valueForKey("keychainDeviceUDID") as? String 
     if deviceUDID == nil { 
      deviceUDID = UIDevice.current.identifierForVendor!.uuidString 
      // save new value in keychain 
      self.keychain_setObject(deviceUDID! as AnyObject, forKey: "keychainDeviceUDID") 
     } 
     return deviceUDID! 
    } 

    // MARK: - Keychain 

    func keychain_setObject(_ object: AnyObject, forKey: String) { 
     let result = JNKeychain.saveValue(object, forKey: forKey) 
     if !result { 
      print("keychain saving: smth went wrong") 
     } 
    } 

    func keychain_deleteObjectForKey(_ key: String) -> Bool { 
     let result = JNKeychain.deleteValue(forKey: key) 
     return result 
    } 

    func keychain_valueForKey(_ key: String) -> AnyObject? { 
     let value = JNKeychain.loadValue(forKey: key) 
     return value as AnyObject? 
    } 
} 
+0

這工作。感謝'KeychainManager'類 – xmhafiz

+0

雅工作.. –

1

這是預期的結果。如果你想使用相同的UUID,你需要將它保存到keyChain。我已經做了simmiler我的應用程序的使用KeyChainWrapper

所以這裏的東西是一個採樣區塊爲您

let deviceId = UIDevice.currentDevice().identifierForVendor?.UUIDString ?? "" 
// Saving Id in keyChain 
KeychainWrapper.defaultKeychainWrapper().setString(deviceId, forKey: "CurrentDeviceId") 

然後就是從鑰匙扣每次獲得ID您想使用它。

let previousDeviceId = KeychainWrapper.defaultKeychainWrapper().stringForKey("CurrentDeviceId") 
+0

這也適用於我,但我更喜歡@Paul解決方案。謝謝 – xmhafiz

+0

當然,選擇是你的。 –

相關問題