gpt4 book ai didi

ios - 如何实现自动填充凭据提供程序扩展 - iOS 11,swift4

转载 作者:行者123 更新时间:2023-12-01 15:49:36 25 4
gpt4 key购买 nike

长期以来,我一直致力于 iOS 自动填充凭据扩展。我检查了很多 iOS 文章和视频。但我无法在快速输入栏上显示凭据,重置内容已成功集成。任何人都可以给我快速帮助吗?

使用苹果分享的这个视频和网址: https://developer.apple.com/videos/play/wwdc2018/721 https://developer.apple.com/documentation/authenticationservices
我正在使用以下代码将凭据保存到特定域的钥匙串(keychain)。

    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 的快速类型栏上显示凭据

最佳答案

我已经为所有社交网站实现了自动填充扩展,共享我的源代码以使用域保存电子邮件 ID-密码。

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
}
}

我希望此内容对您有所帮助,因为我花了很多天来创建一个演示 :) :)如果对您有帮助,请在下方评论:) :)

谢谢,安贾莉。

关于ios - 如何实现自动填充凭据提供程序扩展 - iOS 11,swift4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55412380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com