AutoFill 凭据提供程序扩展(Credential Provider Extension)是 iOS 中的一个功能,允许开发者为应用程序提供自动填充凭据的功能,例如用户名和密码。这个功能特别适用于需要频繁输入凭据的应用场景,如网页登录、应用内认证等。
AutoFill 凭据提供程序扩展允许你的应用程序向系统的键盘建议凭据,以便用户可以快速填充表单。这个扩展通过使用 CKContainer
和 CKRecord
来存储和检索凭据。
AutoFill 凭据提供程序扩展主要有两种类型:
以下是一个简单的示例,展示如何在 iOS 11 和 Swift 4 中实现一个 AutoFill 凭据提供程序扩展。
在 Xcode 中,选择你的项目文件,然后点击 +
按钮添加一个新的扩展目标。选择 Credential Provider Extension
。
在扩展的 Info.plist
文件中,配置以下内容:
<key>CFBundleDisplayName</key>
<string>Credential Provider</string>
<key>CFBundleIdentifier</key>
<string>com.yourcompany.CredentialProvider</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).CredentialProviderViewController</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.identitylookup.message-filter</key>
创建一个新的 UIViewController
子类,例如 CredentialProviderViewController
,并实现以下方法:
import UIKit
import CloudKit
class CredentialProviderViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// 配置视图
}
// 实现 CKContainer 和 CKRecord 的存储和检索逻辑
}
使用 CloudKit 存储和检索凭据:
import CloudKit
func storeCredential(username: String, password: String) {
let container = CKContainer.default()
let privateDatabase = container.privateCloudDatabase
let record = CKRecord(recordType: "Credential")
record.setValue(username, forKey: "username")
record.setValue(password, forKey: "password")
privateDatabase.save(record) { (record, error) in
if let error = error {
print("Error saving credential: \(error.localizedDescription)")
} else {
print("Credential saved successfully")
}
}
}
func retrieveCredential(username: String) -> (username: String, password: String)? {
let container = CKContainer.default()
let privateDatabase = container.privateCloudDatabase
let predicate = NSPredicate(format: "username == %@", username)
let query = CKQuery(recordType: "Credential", predicate: predicate)
privateDatabase.perform(query, inZoneWith: nil) { (records, error) in
if let error = error {
print("Error retrieving credential: \(error.localizedDescription)")
} else if let record = records?.first {
let username = record.value(forKey: "username") as? String ?? ""
let password = record.value(forKey: "password") as? String ?? ""
return (username, password)
}
}
return nil
}
通过以上步骤,你可以实现一个基本的 AutoFill 凭据提供程序扩展。根据具体需求,你可以进一步扩展和优化这个功能。
领取专属 10元无门槛券
手把手带您无忧上云