8.4. Updating Existing Values in the Keychain
Problem
You have already stored a value in the keychain but now want to update it to a new value.
Solution
Given that you have been able to find the value in the keychain
(see Recipe 8.3), you can issue
the SecItemUpdate
function with your
query dictionary as its first parameter and a dictionary describing the
change that you want to make to the existing value as its second
parameter. Usually this update dictionary (the second parameter to the
method) contains just one key (kSecValueData
) and the value of this
dictionary key is the data to set for the existing key in the
keychain.
Discussion
Let’s assume that, following the advice given in Recipe 8.2, you have stored the string
Steve Jobs
with the key of Full
Name
in your app’s keychain but want to update that value
now. The first thing that you have to do is find out whether the
existing value is already in the keychain. For that, construct a simple
query, as we have seen earlier in this chapter:
NSString
*
keyToSearchFor
=
@"Full Name"
;
NSString
*
service
=
[[
NSBundle
mainBundle
]
bundleIdentifier
];
NSDictionary
*
query
=
@
{
(
__bridge
id
)
kSecClass
:
(
__bridge
id
)
kSecClassGenericPassword
,
(
__bridge
id
)
kSecAttrService
:
service
,
(
__bridge
id
)
kSecAttrAccount
:
keyToSearchFor
,
};
Then query for that dictionary and see whether you can find the existing item in the keychain:
OSStatus
found
=
SecItemCopyMatching
((
__bridge
CFDictionaryRef
)
query
,
NULL
);
Note
You don’t necessarily have to check for an existing ...
Get iOS 7 Programming Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.