2017-08-10 10 views
1

XCode8 + Swift3でiOSプロジェクトを開発しています。keychianに文字列の値が正常に格納されましたが、常に読み込みに失敗しました

boolean hasStored = storeString(value: "John") 
let readVal = readString() 
私は hasStoredtrueで得た

が、readVal:私は関数を呼び出す

var query: [String: Any] = [ 
    kSecClass as String: kSecClassGenericPassword, 
    kSecAttrService as String: "my service", 
    kSecAttrAccount as String: "my-key" 
] 

func storeString(value: String) -> Bool { 
    if let data = value.data(using: .utf8) { 
     // delete data if exist 
     SecItemDelete(query as CFDictionary) 

     // add value to query 
     query[kSecValueData as String] = data 

     // add to keychain 
     let status = SecItemAdd(query as CFDictionary, nil) 

     return status == noErr 
    } 
    return false 
} 

func readString() -> String? { 
    // update query 
    query[kSecReturnData as String] = kCFBooleanTrue 
    query[kSecMatchLimit as String] = kSecMatchLimit 

    var result: AnyObject? 
    // fetch items from keychain 
    let status: OSStatus = withUnsafeMutablePointer(to: &result) { 
     SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0)) 
    } 

    // I always get error -50 here 
    if status == noErr { 
     if let resultData = result as? Data { 
      if let strVal = String(data: resultData, encoding: .utf8) { 
       return strVal 
      } 
     } 
    } 
    return nil 

} 

:私は&をキーチェーンに格納する文字列に次の2つの関数を作成しました

は、バックキーチェーンからそれを読んで常にnilです。私は私の機能を調査した、私はいつもがリーダー機能(私の機能の私のコメントを見てください)のステータスコードとしてエラー-50を得るのを見る。

なぜですか?私はキーチェーンに格納された値を読み取ることができないのはなぜ(それが実際に格納されているかどうか私にはわからないが、私はいつもtrue機能storeString(value:)でretuns status == noErrを得るか)あなたのコードにタイプミスがあり

+0

'' kSecMatchLimit'の値を '' kSecMatchLimitOne'に設定するとどうなりますか? – Max

+0

@マックス、あなたは答えをしてください、私はそれを受け入れることができますか?これは 'kSecMatchLimitOne'に変更された後に動作します。なぜか、あなたが 'kSecMatchLimitOne'が(他の人たちを助けるために)問題を解決できると思う理由を説明することができればうれしいです:) –

答えて

2

query[kSecMatchLimit as String] = kSecMatchLimit 
//        ^~~~~~~~~~~~~~ 
は、

kSecMatchLimitはキーであり、有効な値ではありません。期待値はCFNumberまたはkSecMatchLimitOneまたはkSecMatchLimitAllである必要があります。 1つのアイテムが返されると予想される場合は、kSecMatchLimitOneを使用してください。 Search Attribute Keys and Valuesも参照してください。

関連する問題