如何实现 AutoFill Credential Provider Extensions - iOS 11, swift4
Posted
技术标签:
【中文标题】如何实现 AutoFill Credential Provider Extensions - iOS 11, swift4【英文标题】:How to implement AutoFill Credential Provider Extensions - iOS 11, swift4 【发布时间】:2019-03-29 07:24:45 【问题描述】:很长一段时间以来,我一直在从事 ios 自动填充凭据扩展工作。我查看了很多 iOS 文章和视频。但是我无法在快速类型栏上显示凭据,重置的东西已成功集成。谁能给我快速帮助?
使用从苹果分享的这个视频和网址: https://developer.apple.com/videos/play/wwdc2018/721 https://developer.apple.com/documentation/authenticationservices 我正在使用以下代码将凭据保存到特定域的钥匙串。
let keychain = Keychain(server: "instagram.com", protocolType: .https, authenticationType: .htmlForm)
keychain["emailAddress"] = "Password"
并使用此代码保存域:
func savedomain(domain: String, account: String, password: String, completion: ((Bool, SharedWebCredentialsManagerError?) -> Void)? = nil)
SecAddSharedWebCredential(domain as CFString, account as CFString, password as CFString?) error in
guard let error = error else
completion?(true, nil)
return
let errorDescription = CFErrorCopyDescription(error) as String
let saveFailedError = SharedWebCredentialsManagerError.saveFailed(errorDescription)
completion?(false, saveFailedError)
我已创建自动填充扩展程序并获取保存的凭据,但无法在 safari for instagram.com 的快速输入栏上显示凭据
【问题讨论】:
你找到解决方案了吗? 【参考方案1】:我已经为所有社交网站实现了自动填充扩展,分享我的源代码以保存 emailID-Password 与域。
class func save(key: String, data: Data) -> OSStatus
let query = [
kSecClass as String : kSecClassGenericPassword as String,
kSecAttrAccount as String : key,
kSecValueData as String : data ] as [String : Any]
SecItemDelete(query as CFDictionary)
return SecItemAdd(query as CFDictionary, nil)
在我的自定义 KeyChainManager 类中编写的“保存”功能之上,我还在 KeyChainManager 类中添加了以下代码,如下所示。
extension Data
init<T>(from value: T)
var value = value
self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))
func to<T>(type: T.Type) -> T
return self.withUnsafeBytes $0.load(as: T.self)
我正在通过调用我们的 KeyChainManager 类从 VC 中保存我的数据,如下所示:
let email = (txtEmail?.text ?? "").trimmingCharacters(in: .whitespacesAndNewlines)
let password = (txtPassword?.text ?? "").trimmingCharacters(in: .whitespacesAndNewlines)
let domain = (txtDomain?.text ?? "").lowercased().trimmingCharacters(in: .whitespacesAndNewlines)
let user = User(email: email, password: password, key: self.key, domain: domain, identifier: self.keyIdentifier)
let data = (try? JSONEncoder().encode(user)) ?? Data()
let _ = KeyChain.save(key: "\(self.keyIdentifier)", data: data)
这一切都是为了保存我们的凭据,现在重点是如何在我们扩展的 CredentialProviderViewController.swift 中列出所有保存的凭据。
为此,我在 KeyChainManager 类中添加了以下方法:
class func load(key: String) -> Data?
let query = [
kSecClass as String : kSecClassGenericPassword,
kSecAttrAccount as String : key,
kSecReturnData as String : kCFBooleanTrue!,
kSecMatchLimit as String : kSecMatchLimitOne ] as [String : Any]
var dataTypeRef: AnyObject? = nil
let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
if status == noErr
return dataTypeRef as! Data?
else
return nil
并从扩展的 CredentialProviderViewController.swift 中调用此函数,如下所示:
users.removeAll()
for i in 0..<1000000
if let encodedData = KeyChain.load(key: "\(i)")
let user = try! JSONDecoder().decode(User.self, from: encodedData)
if user.key == key && ((serviceIdentifier.contains(user.domain ?? "")) )
users.append(user)
else
break
我希望这些内容对您有所帮助,因为我花了很多天时间才创建了一个演示 :) :) 在下面评论,如果它对你有帮助:) :)
谢谢, 安贾利。
【讨论】:
【参考方案2】:您需要填充 ASCredentialIdentityStore 才能使快速输入栏工作。见ASCredentialProviderViewController的描述:
可以选择将 ASPasswordCredentialIdentity 实例添加到共享的 ASCredentialIdentityStore 以使身份直接在 QuickType 栏中可用。
您参考的 WWDC 演示文稿中也对此进行了描述。
【讨论】:
知道如何填充 ASCredentialIdentityStore 吗?我试过: let store = ASCredentialIdentityStore.shared let passwordIdentity = ASPasswordCredentialIdentity(serviceIdentifier: ASCredentialServiceIdentifier(identifier: "chase.com", type: .URL), user: "jbrantl8", recordIdentifier: nil) store.saveCredentialIdentities(identities) (成功,错误)在 错误:源文件中的编辑器占位符和错误:无法将类型“APasswordCredentialIdentity”的值转换为预期的参数类型“[ASPasswordCredentialIdentity]”以上是关于如何实现 AutoFill Credential Provider Extensions - iOS 11, swift4的主要内容,如果未能解决你的问题,请参考以下文章
如何在连接多个网站的应用程序中集成 iOS 12 Autofill(以浏览器为例)?
如何隐藏 Safari 中 input 标签的 autofill 图标
Android Autofill 仅适用于来自 onFillRequest 而不是来自身份验证活动的响应
input:-webkit-autofill使输入框变成黄色