MCSMKeychainItem(或更具体的是 MCSMGenericKeychainItem)允许您使用相同的简单 Objective C API 在 iOS 和 OS X 上从 Keychain 创建、查找和删除 Keychain 项。
通用 Keychain 项允许您存储特定 服务 的 账号(通常是用户名)和 密码。使用 MCSMGenericKeychainItem 做这一点很容易
// First Check to see if a Generic Keychain Item for the Service and Username already exists
MCSMGenericKeychainItem *genericKeychainItem = nil;
genericKeychainItem = [MCSMGenericKeychainItem genericKeychainItemForService:service
account:account
attributes:attributes
error:NULL];
// If a Generic Keychain Item already exists remove it to prevent duplicates
if(genericKeychainItem)
{
[genericKeychainItem removeFromKeychainWithError:NULL];
}
//Add the new Generic Keychain Item
[MCSMGenericKeychainItem genericKeychainItemWithService:service
account:account
attributes:attributes
password:password
error:NULL];
当您想要查找 服务 和 账号 的通用 Keychain 项时,需要做的是
MCSMGenericKeychainItem *genericKeychainItem = [MCSMGenericKeychainItem genericKeychainItemForService:service
account:account
attributes:attributes
error:NULL];
然后您可以使用密码属性获取密码
NSString *password = genericKeychainItem.password;
要将其从 Keychain 中删除,只需调用 removeFromKeychainWithError
[genericKeychainItem removeFromKeychainWithError:NULL];
MCSMInternetKeychainItem 允许您使用相同的简单 Objective C API 在 iOS 和 OS X 上创建、查找和删除 Internet Keychain 项。
Internet Keychain 项允许您存储 服务器、安全域、账号(通常是用户名)、路径、端口、协议、身份验证类型 和 密码。
协议 和 身份验证类型 定义在 Security/SecItem.h
中,当前列表如下
kSecAttrProtocolFTP
kSecAttrProtocolFTPAccount
kSecAttrProtocolHTTP
kSecAttrProtocolIRC
kSecAttrProtocolNNTP
kSecAttrProtocolPOP3
kSecAttrProtocolSMTP
kSecAttrProtocolSOCKS
kSecAttrProtocolIMAP
kSecAttrProtocolLDAP
kSecAttrProtocolAppleTalk
kSecAttrProtocolAFP
kSecAttrProtocolTelnet
kSecAttrProtocolSSH
kSecAttrProtocolFTPS
kSecAttrProtocolHTTPS
kSecAttrProtocolHTTPProxy
kSecAttrProtocolHTTPSProxy
kSecAttrProtocolFTPProxy
kSecAttrProtocolSMB
kSecAttrProtocolRTSP
kSecAttrProtocolRTSPProxy
kSecAttrProtocolDAAP
kSecAttrProtocolEPPC
kSecAttrProtocolIPP
kSecAttrProtocolNNTPS
kSecAttrProtocolLDAPS
kSecAttrProtocolTelnetS
kSecAttrProtocolIMAPS
kSecAttrProtocolIRCS
kSecAttrProtocolPOP3S
kSecAttrAuthenticationTypeNTLM
kSecAttrAuthenticationTypeMSN
kSecAttrAuthenticationTypeDPA
kSecAttrAuthenticationTypeRPA
kSecAttrAuthenticationTypeHTTPBasic
kSecAttrAuthenticationTypeHTTPDigest
kSecAttrAuthenticationTypeHTMLForm
kSecAttrAuthenticationTypeDefault
创建 MCSMInternetKeychainItem 的推荐方法是
// Fetch existing Keychain Item
MCSMInternetKeychainItem *internetKeychainItem = nil;
internetKeychainItem = [MCSMInternetKeychainItem internetKeychainItemForServer:server
securityDomain:securityDomain
account:account
path:path
port:port
protocol:protocol
authenticationType:authenticationType
attributes:attributes
error:NULL];
// If a Internet Keychain Item already exists remove it to prevent duplicates
if(internetKeychainItem)
{
[internetKeychainItem removeFromKeychainWithError:NULL];
}
//Add the new Internet Keychain Item
[MCSMInternetKeychainItem internetKeychainItemForServer:server
securityDomain:securityDomain
account:account
path:path
port:port
protocol:protocol
authenticationType:authenticationType
attributes:attributes
password:password
error:NULL];
当您要查找 Internet Keychain 项时,需要做的是
MCSMInternetKeychainItem *internetKeychainItem = nil;
internetKeychainItem = [MCSMInternetKeychainItem internetKeychainItemForServer:server
securityDomain:securityDomain
account:account
path:path
port:port
protocol:protocol
authenticationType:authenticationType
attributes:attributes
error:NULL];
然后您可以使用密码属性获取密码
NSString *password = internetKeychainItem.password;
要将其从 Keychain 中删除,只需调用 removeFromKeychainWithError
[internetKeychainItem removeFromKeychainWithError:NULL];
Apple 已在 iOS 5.0 中弃用了返回设备 UDID 的唯一标识符 API。
但您可以使用 CoreFoundation 的 CFUUIDCreateString
API 生成一个 UUID。
关于 CFUUIDCreateString
重要的是要知道(按设计)每次调用它时都生成一个不同的 UUID。这意味着您不能通过简单地将 [UIDevice uniqueIdentifier]
替换为 CFUUIDCreateString
来唯一地识别一个设备。
MCSMApplicationUUIDKeychainItem 的方法是,在第一次调用 API 时生成一个 UUID,然后将其存储在设备的 keychain 中。这意味着 UUID 在应用程序启动之间不会更改,将其存储在 keychain 中的意思是在应用程序重新安装后它们仍将保持持久。但是,如果用户恢复他们的设备,则将删除该 UUID 以及所有其他 keychain 项。
如果您只需要替换UIDevice的 uniqueIdentifier
API,那么只需用MCSMApplicationUUIDKeychainItem的 applicationUUID
API进行替换即可。
NSString *UUID = [MCSMApplicationUUIDKeychainItem applicationUUID];
第一次调用applicationUUID
时,将生成一个UUID并将其存储在密钥链中。之后的调用将返回之前生成的UUID。
如果您需要更多控制,可以使用以下方法检索应用程序UUID密钥链项:
MCSMApplicationUUIDKeychainItem *applicationUUIDKeychainItem = [MCSMApplicationUUIDKeychainItem applicationUUIDKeychainItem];
然后您可以通过UUID属性获取UUID。
NSString *UUID = applicationUUIDKeychainItem.UUID
如果不存在,可以生成一个。
MCSMApplicationUUIDKeychainItem *applicationUUIDKeychainItem = [MCSMApplicationUUIDKeychainItem generateApplicationUUIDKeychainItem];
您可以使用removeFromKeychainWithError
移除它。
[applicationUUIDKeychainItem removeFromKeychainWithError:NULL];