- (void)provideCredentialWithoutUserInteractionForIdentity:(ASPasswordCredentialIdentity *)credentialIdentity;
,但我无法像应该的那样工作。
在设置中启用了Autofill,并且还为我的应用程序启用了。 我已经阅读了文档,但这对我没有帮助。https://developer.apple.com/documentation/authenticationservices/ascredentialproviderviewcontroller/29777554-providecredecredentialwiteentialwiteentwithoutuserinte =objc
我尝试从
viewDidLoad
,prepareCredentialListForServiceIdentifiers
,..但这很愚蠢,绝对不会起作用。
- (void)provideCredentialWithoutUserInteractionForIdentity:(ASPasswordCredentialIdentity *)credentialIdentity {
ASPasswordCredential *credential = [[ASPasswordCredential alloc] initWithUser:@"theUsername" password:@"thePassword"];
[self.extensionContext completeRequestWithSelectedCredential:credential completionHandler:nil];
}
功能应显示键盘上方的凭据,但这不会发生。它只是显示默认的“密码”按钮。确保您在
ASPasswordCredentialIdentity
中有一些域/url。 (这些是带有一些独特的记录识别器的记录,这些记录不容纳密码,而是保留可以帮助您确定选择的密码的数据。)
当您打开一个网站时,iOS查找
ASCredentialIdentityStore
ASCredentialIdentityStore
provideCredentialWithoutUserInteraction
回调时才。您的任务是使用
ASPasswordCredentialIdentity
作为参数(它具有
recordIdentifier
ASPasswordCredential
并传递它时到
self.extensionContext.completeRequest
。另外,请确保在任何错误时致电ExtensionContext.CancelRequest。
这里是我的例子
override func provideCredentialWithoutUserInteraction(for credentialIdentity: ASPasswordCredentialIdentity) {
let databaseIsUnlocked = false
if (databaseIsUnlocked) {
// this function queries my custom keychain records by recordIdentifier (Generic Passwords) to find matching password
getItemForRecordId(identifier: credentialIdentity.recordIdentifier) { password, err in
guard password != nil else {
print("password was nil")
self.extensionContext.cancelRequest(withError: NSError(domain: ASExtensionErrorDomain, code:ASExtensionError.userInteractionRequired.rawValue))
return;
}
let passwordCredential = ASPasswordCredential(user: credentialIdentity.user, password: password as! String);
self.extensionContext.completeRequest(withSelectedCredential: passwordCredential, completionHandler: nil);
};
} else {
self.extensionContext.cancelRequest(withError: NSError(domain: ASExtensionErrorDomain, code:ASExtensionError.userInteractionRequired.rawValue))
}
}
让我添加到这个主题中,以防这仍然相关:首先,请确保您具有启用密码的功能:
Info.plist
NSExtension
NSExtensionAttributes
ASCredentialProviderExtensionCapabilities
ProvidesPasswords: Boolean -> YES
现在,在您的应用中,如上所述,您应该确保已将ASCredentialIdentityStore
中。 我为您提供一些示例代码:
func saveCredential(username: String, password: String) {
let serviceIdentifier = ASCredentialServiceIdentifier(identifier: "netflix.com", type: .domain)
let credential = ASPasswordCredentialIdentity(serviceIdentifier: serviceIdentifier, user: username, recordIdentifier: "record_id_in_your_database")
ASCredentialIdentityStore.shared.saveCredentialIdentities([credential]) { success, error in ... }
}
这将提示键盘显示可让您选择该凭据的文本,然后调用
provideCredentialWithoutUserInteractionForIdentity
,您可以创建多个多个
ASPasswordCredentialIdentities
并存储它们,并使用该方法
ASCredentialIdentityStore.shared.replaceCredentialIdentities(yourListOfIdentities)