“ ProvideCredentialWithOutUserInteractionForidentity:”不起作用

问题描述 投票:0回答:2
- (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
ios objective-c autofill
2个回答
0
投票
ASCredentialIdentityStore
    ,并显示一个大按钮,以便在匹配的记录时快速登录。如果您点击按钮 - 仅在执行
  1. provideCredentialWithoutUserInteraction
    回调时才。您的任务是使用
    ASPasswordCredentialIdentity
    作为参数(它具有
    recordIdentifier
  2. 字段)并在拥有密码时找到匹配的密码(在数据库/键链/等) - 创建
  3. 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))
            }
        }
    
    
    
    
    让我添加到这个主题中,以防这仍然相关:
    首先,请确保您具有启用密码的功能:
go到您的自动填充扩展目标:

Info.plist NSExtension NSExtensionAttributes ASCredentialProviderExtensionCapabilities ProvidesPasswords: Boolean -> YES
现在,在您的应用中,如上所述,您应该确保已将

0
投票
列表存储到

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)


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.