1Password和LastPass都使用相同的方案(def convert_to_state(lati, long):
lat, lon = float(lati), float(long)
g = geocoder.google([lat, lon], method='reverse')
state_long, state_short = g.state_long, g.state
return state_long, state_short
)进行密码管理。这允许第三方应用程序使用onepassword-app-extension与任何这些密码管理器一起使用。
如果我想实现与此扩展兼容的自己的密码管理器,我需要做什么?
答案 0 :(得分:3)
实施密码管理器:
为项目添加新目标。选择“行动扩展”。
将org-appextension-feature-password-management
添加为您的应用支持的网址方案(CFBundleURLSchemes
)。
您可以在目标的“信息”标签中执行此操作。该计划是重要的部分。 identifier doesn't seem to be used。
这是必需的,以便-[OnePasswordExtension isAppExtensionAvailable]
将返回true。
在您的应用扩展程序目标中,将NSExtensionActivationRule
从TRUEPREDICATE
更改为以下内容:
SUBQUERY (
extensionItems,
$extensionItem,
SUBQUERY (
$extensionItem.attachments,
$attachment,
ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.appextension.find-login-action"
).@count == $extensionItem.attachments.@count
).@count == 1
这将确保仅在调用-[OnePasswordExtension findLoginForURLString:forViewController:sender:completion:]
方法时才会显示您的扩展程序。如果您想匹配多个这些UTI,请参阅Apple's more complex example here。
注意:此SUBQUERY与Apple's SUBQUERY example相同,常量已更改。如果您想知道语法或其工作原理,see this answer。
要阅读应填写的网址:
let inputItem = extensionContext!.inputItems[0] as! NSExtensionItem
let inputItemProvider = inputItem.attachments![0] as! NSItemProvider
inputItemProvider.loadItem(forTypeIdentifier: "org.appextension.find-login-action", options: nil) { (data, err) in
if let err = err { fatalError("\(err)") }
let urlString = (data as! NSDictionary)["url_string"] as! String
}
当您准备好将数据从分机发送回主机应用程序时:
let itemProvider = NSItemProvider(
item: ["username": "foo", "password": "123"],
typeIdentifier:kUTTypePropertyList as String) // TODO: import MobileCoreServices
let extensionItem = NSExtensionItem()
extensionItem.attachments = [itemProvider]
extensionContext!.completeRequestReturningItems([extensionItem], completionHandler: nil)
如果您想知道为什么可以注册这些方案,您可以read this article:
我们的品牌中立计划应该让用户和应用开发者都更轻松。因此,我们使用品牌中立方案的部分原因是鼓励尽可能多的应用开发者使用此方案。我们不会强迫应用开发者在1Password和某些竞争对手之间做出选择。相反,我们委托选择使用哪个密码管理器来选择所属的位置:你。