Ios Swit-我想获取存储在钥匙链中的值

Ios Swit-我想获取存储在钥匙链中的值,ios,swift,keychain,Ios,Swift,Keychain,我想得到这些值​​(组、ID、密码)存储在钥匙链中 我只能得到密码。我想获取组和ID Get方法是getKeyChain import Foundation // キーチェーンの保存・取得を管理する extension ViewController { // 保存 func saveKeyChain() { // group let grp = "AA" // ID let id = "0001"

我想得到这些值​​(组、ID、密码)存储在钥匙链中

我只能得到密码。我想获取组和ID

Get方法是
getKeyChain

import Foundation

// キーチェーンの保存・取得を管理する
extension ViewController {

    // 保存
    func saveKeyChain() {

        // group
        let grp = "AA"

        // ID
        let id = "0001"

        // password
        let str = "test"
        let data = str.data(using: .utf8)



        guard let _data = data else {
            return
        }

        // APIを実行する際の引数設定
        // これをSecItemCopyMatching の第一引数に渡すと結果を受け取ることができる
        let dic: [String: Any] = [kSecClass as String: kSecClassGenericPassword, // パスワードクラス
            kSecAttrGeneric as String: grp,                // 自由項目(グループとする)
            kSecAttrAccount as String: id,                 // アカウント(ログインID)
            kSecValueData as String: _data,                // パスワード本体
            kSecAttrService as String: "test"]            // サービス名

        print(dic)

        var itemAddStatus: OSStatus?
        // 保存データが存在するかの確認
        let matchingStatus = SecItemCopyMatching(dic as CFDictionary, nil)
        if matchingStatus == errSecItemNotFound {
            // 保存
            itemAddStatus = SecItemAdd(dic as CFDictionary, nil)
        } else if matchingStatus == errSecSuccess {
            // 更新
            itemAddStatus = SecItemUpdate(dic as CFDictionary,[kSecAttrGeneric as String: _data] as CFDictionary)
            itemAddStatus = SecItemUpdate(dic as CFDictionary,[kSecAttrAccount as String: _data] as CFDictionary)
            itemAddStatus = SecItemUpdate(dic as CFDictionary,[kSecValueData as String: _data] as CFDictionary)
        } else {
            print("保存失敗")
        }
        // 保存・更新ステータス確認
        if itemAddStatus == errSecSuccess {
            print("正常終了")
        } else {
            print("保存失敗")
        }
    }

    // 取得
    func getKeyChain(key: String) -> String? {

        let dic: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                  kSecAttrService as String: key,
                                  kSecReturnData as String: kCFBooleanTrue as Any,
                                  kSecMatchLimit as String  : kSecMatchLimitOne]as [String : Any]

        var data: AnyObject?

        // ポインタ:変数のメモリ上の位置(番地)を格納している
        // 変数をポインタに変換してポインタ経由でアクセスする
        let matchingStatus = withUnsafeMutablePointer(to: &data){
            SecItemCopyMatching(dic as CFDictionary, UnsafeMutablePointer($0))
        }


        if matchingStatus == errSecSuccess {
            print("取得成功")
            if let getData = data as? Data,
                let getStr = String(data: getData, encoding: .utf8) {
                return getStr
            }
            print("取得失敗: Dataが不正")
            return nil
        } else {
            print("取得失敗")
            return nil
        }
    }

    // 削除
    func deleteKeyChain() {
        // 削除するqueryを設定
        let dic: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
                                  kSecAttrService as String: "test"]            // サービス名

        if SecItemDelete(dic as CFDictionary) == errSecSuccess {
            print("削除成功")
        } else {
            print("削除失敗")
        }
    }
}

您更新的方法没有意义,您的
get
方法没有
帐户
。如何获取帐户?这是您在
save
方法中使用的
id
。您的
save
get
方法必须使用相同的请求。相同的服务和相同的帐户。不可能获取“kSecAttrService”作为密钥吗?我想获取所有密钥。。。