XCode8 + Swift3でiOSプロジェクトを開発しています。keychianに文字列の値が正常に格納されましたが、常に読み込みに失敗しました
boolean hasStored = storeString(value: "John")
let readVal = readString()
私は
hasStored
が
true
で得た
が、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
を得るか)あなたのコードにタイプミスがあり
'' kSecMatchLimit'の値を '' kSecMatchLimitOne'に設定するとどうなりますか? – Max
@マックス、あなたは答えをしてください、私はそれを受け入れることができますか?これは 'kSecMatchLimitOne'に変更された後に動作します。なぜか、あなたが 'kSecMatchLimitOne'が(他の人たちを助けるために)問題を解決できると思う理由を説明することができればうれしいです:) –