8. 検索 + 取得
var uuidString = ""
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword /* パスワードクラス */
query[kSecAttrService as String] = self.service as AnyObject? /* サービス名 */
query[kSecAttrAccount as String] = Identifier.IDENTIFIER_KEY as AnyObject? /* アカウント */
query[kSecMatchLimit as String] = kSecMatchLimitOne /* 取得する結果の最大件数を1検討する */
query[kSecReturnAttributes as String] = kCFBooleanTrue /* 結果を辞書で受け取る(属性値) */
query[kSecAttrSynchronizable as String] = kCFBooleanTrue /* iCloud同期 */
var result = noErr
/* 検索 */
var queryResult: AnyObject?
let status = withUnsafeMutablePointer(to: &queryResult) {
result = SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}
print("status[(status)]")
if result == noErr {
var valueQuery = queryResult as! [String : AnyObject]
valueQuery[kSecClass as String] = kSecClassGenericPassword
valueQuery[kSecReturnData as String] = kCFBooleanTrue /* 検索をデータで受け取る(パスワード) */
var valueQueryResult: AnyObject?
let valueStatus = withUnsafeMutablePointer(to: &valueQueryResult) {
result = SecItemCopyMatching(valueQuery as CFDictionary, UnsafeMutablePointer($0))
}
print("valueStatus[(valueStatus)]")
if result == noErr {
if let passwordData = valueQueryResult as? Data {
if let password = String(data: passwordData, encoding: String.Encoding.utf8) {
uuidString = password
}
}
}
}
検索条件
iCloudキーチェーン
取得
9. 登録
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword /* パスワードクラス */
query[kSecAttrService as String] = self.service as AnyObject? /* サービス名 */
query[kSecAttrAccount as String] = Identifier.IDENTIFIER_KEY as AnyObject? /* アカウント */
query[kSecAttrLabel as String] = "UUID" as AnyObject? /* ユーザへ表示する文字列 */
query[kSecAttrDescription as String] = "a universally unique identifier." as AnyObject? /* アイテムの説明 */
query[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock as AnyObject?
/* 再起動後最初のアンロック以降 次の再起動まで */
query[kSecValueData as String] = uuidString.data(using: String.Encoding.utf8) as AnyObject?
query[kSecAttrCreationDate as String] = Date() as AnyObject?
query[kSecAttrSynchronizable as String] = kCFBooleanTrue /* iCloud同期 */
/* 登録 */
let result = SecItemAdd(query as CFDictionary, nil)
if result != noErr {
print("[ERROR] Couldn't add the Keychain Item. result = (result) query = (query)")
}
10. 削除
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword /* パスワードクラス */
query[kSecAttrService as String] = self.service as AnyObject? /* サービス名 */
query[kSecAttrAccount as String] = Identifier.IDENTIFIER_KEY as AnyObject? /* アカウント */
query[kSecAttrSynchronizable as String] = kCFBooleanTrue /* iCloud同期 */
/* 削除 */
let result = SecItemDelete(query as CFDictionary)
if result == noErr {
print("[INFO][noErr] Unique Installation Identifier is successfully reset.")
}
else if result == errSecItemNotFound {
print("[INFO][errSecItemNotFound] Unique Installation Identifier is successfully reset.")
}
else {
print("[ERROR] Coudn't delete the Keychain Item. result = (result) query = (query)")
}
11. 検索 + 更新
var query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword /* パスワードクラス */
query[kSecAttrService as String] = self.service as AnyObject? /* サービス名 */
query[kSecAttrAccount as String] = Identifier.IDENTIFIER_KEY as AnyObject? /* アカウント */
query[kSecMatchLimit as String] = kSecMatchLimitOne /* 取得する結果の最大件数を1検討する */
query[kSecReturnAttributes as String] = kCFBooleanTrue /* 結果を辞書で受け取る(属性値) */
query[kSecAttrSynchronizable as String] = kCFBooleanTrue /* iCloud同期 */
var result = noErr
/* 検索 */
var queryResult: AnyObject?
let status = withUnsafeMutablePointer(to: &queryResult) {
result = SecItemCopyMatching(query as CFDictionary, UnsafeMutablePointer($0))
}
print("status[(status)]")
if result == noErr {
query = [String : AnyObject]()
query[kSecClass as String] = kSecClassGenericPassword /* パスワードクラス */
query[kSecAttrService as String] = self.service as AnyObject? /* サービス名 */
query[kSecAttrAccount as String] = Identifier.IDENTIFIER_KEY as AnyObject? /* アカウント */
query[kSecAttrSynchronizable as String] = kCFBooleanTrue /* iCloud同期 */
var attributesToUpdate = [String : AnyObject]()
attributesToUpdate[kSecValueData as String] = uuidString.data(using: String.Encoding.utf8) as AnyObject?
attributesToUpdate[kSecAttrCreationDate as String] = Date() as AnyObject?
/* 更新 */
result = SecItemUpdate(query as CFDictionary, attributesToUpdate as CFDictionary)
if result == noErr {
print("SecItemUpdate: noErr")
}
else {
print("SecItemUpdate: error((result))")
}
}