75034
今まで`SecKeychainAddGenericPassword`しか使ったことがないのですが、  
今回、`iCloudKeyChain`にGenericPassword(KeyChain Accessで見るとKindがapplication
password)を追加したく、以下のようなコードを書いてみました

```

    let token: String = "0123456789"
    let query: Dictionary<String, AnyObject> = [
        kSecClass as String: kSecClassGenericPassword,
        kSecReturnPersistentRef as String: kCFBooleanTrue,
        kSecAttrAccessible as String: kSecAttrAccessibleAlways,
        kSecAttrSynchronizable as String: kCFBooleanTrue,
        kSecAttrAccount as String: "Charleston" as NSString,
        kSecAttrService as String: "Charleston Safe Storage" as NSString
        kSecValueData as String: token as NSString
            ]
    var result: AnyObject?
    let resultCode: OSStatus = withUnsafeMutablePointer(to: &result) {
        SecItemAdd(query as CFDictionary, $0)
    }
    
```

が、`resultCode`が`-50`と

> errSecParam

と、パラメーターが間違っていると怒られてしまいます。  
どんな項目が不足しているかわかる方、お教え下さい。  
Sigining & Capabilitiesには`Keychain Shareing`を有効にしており、  
システム環境設定のiCloud→KeyChainはオンになっています。
CC BY-SA 4.0
2021-03-31T13:43:32.003
75006
2021-04-01T18:32:43.710
2021-03-31T23:24:18.063
14745
14745
question
swift macos swift5
iCloudKeyChainにアイテムを追加したい
まずNSStringやStringは直接Keychain APIに格納するデータとして渡せません。  
すべてNSDataとして渡す必要があります。

```

    kSecValueData as String: token.data(using: .utf8)! as NSData
    
```

なので、上記の行をこのように書き換えると、ひとまず現在のエラーは解消してKeychainへ書き込めるはずです。
CC BY-SA 4.0
2021-04-01T18:32:43.710
75034
2021-04-01T18:32:43.710
5519
75006
answer