Getting Optional(“”) when trying to get value from KeyChain

后端 未结 5 1443
自闭症患者
自闭症患者 2020-12-15 23:00

When I try to get my keyChain value, it return a string containing:

Optional(\"[thing in the KeyChain]\")

so, I tried to remove \"Optiona

5条回答
  •  情话喂你
    2020-12-15 23:12

    Here is a Swift 2 example implementation:

    import Security
    
    class ZLKeychainService: NSObject {
    
        var service = "Service"
        var keychainQuery :[NSString: AnyObject]! = nil
    
        func save(name name: NSString, value: NSString) -> OSStatus? {
            let statusAdd :OSStatus?
    
            guard let dataFromString: NSData = value.dataUsingEncoding(NSUTF8StringEncoding) else {
                return nil
            }
    
            keychainQuery = [
                kSecClass       : kSecClassGenericPassword,
                kSecAttrService : service,
                kSecAttrAccount : name,
                kSecValueData   : dataFromString]
            if keychainQuery == nil {
                return nil
            }
    
            SecItemDelete(keychainQuery as CFDictionaryRef)
    
            statusAdd = SecItemAdd(keychainQuery! as CFDictionaryRef, nil)
    
            return statusAdd;
        }
    
        func load(name name: NSString) -> String? {
            var contentsOfKeychain :String?
    
            keychainQuery = [
                kSecClass       : kSecClassGenericPassword,
                kSecAttrService : service,
                kSecAttrAccount : name,
                kSecReturnData  : kCFBooleanTrue,
                kSecMatchLimit  : kSecMatchLimitOne]
            if keychainQuery == nil {
                return nil
            }
    
            var dataTypeRef: AnyObject?
            let status: OSStatus = SecItemCopyMatching(keychainQuery, &dataTypeRef)
    
            if (status == errSecSuccess) {
                let retrievedData: NSData? = dataTypeRef as? NSData
                if let result = NSString(data: retrievedData!, encoding: NSUTF8StringEncoding) {
                    contentsOfKeychain = result as String
                }
            }
            else {
                print("Nothing was retrieved from the keychain. Status code \(status)")
            }
    
            return contentsOfKeychain
        }
    }
    
    //Test:
    let userName = "TestUser"
    let userValue: NSString = "TestValue"
    print("userName: '\(userName)'")
    print("userValue: '\(userValue)'")
    
    let kcs = ZLKeychainService()
    
    kcs.save(name:userName, value: userValue)
    print("Keychain Query \(kcs.keychainQuery)")
    
    if let recoveredToken = kcs.load(name:userName) {
        print("Recovered Value: '\(recoveredToken)'")
    }
    

    Output:

    userName: 'TestUser'
    userValue: 'TestValue'
    Keychain Query [acct: TestUser, v_Data: <54657374 56616c75 65>, svce: Service, class: genp]
    Recovered Value: 'TestValue'

提交回复
热议问题