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

标签 ios swift credential-manager security-framework quicktypebar

长期以来,我一直致力于 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/

相关文章:

ios - iOS7:将设置保存到文件在设备上不起作用

powershell - 从 PowerShell 访问 Windows 凭据管理器

ios - 访问 UIKit 或 CoreText 中的 OpenType 功能

ios - Xcode 和标签搜索

ios - 在 UITableViewCell 中重新加载 collectionview 时应用程序崩溃

ios - 在 SWIFT 中解析 JSON

ios in app购买总是失败

credential-manager - FIDO2 硬件上架了,但它带来了哪些限制?

mobile-website - 为什么我应该通过 Chrome 的凭据管理 API 使用一键登录

ios - 找不到框架头文件(iOS pop 框架)