如何制作兼容的密码扩展名?

时间:2016-08-08 00:48:49

标签: ios url-scheme ios-app-extension

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与任何这些密码管理器一起使用。

如果我想实现与此扩展兼容的自己的密码管理器,我需要做什么?

1 个答案:

答案 0 :(得分:3)

实施密码管理器:

  1. 为项目添加新目标。选择“行动扩展”。

  2. org-appextension-feature-password-management添加为您的应用支持的网址方案(CFBundleURLSchemes)。

    您可以在目标的“信息”标签中执行此操作。该计划是重要的部分。 identifier doesn't seem to be used

    这是必需的,以便-[OnePasswordExtension isAppExtensionAvailable]将返回true。

  3. 在您的应用扩展程序目标中,将NSExtensionActivationRuleTRUEPREDICATE更改为以下内容:

    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

  4. 要阅读应填写的网址:

    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
    }
    
  5. 当您准备好将数据从分机发送回主机应用程序时:

    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)
    
  6. 如果您想知道为什么可以注册这些方案,您可以read this article

      

    我们的品牌中立计划应该让用户和应用开发者都更轻松。因此,我们使用品牌中立方案的部分原因是鼓励尽可能多的应用开发者使用此方案。我们不会强迫应用开发者在1Password和某些竞争对手之间做出选择。相反,我们委托选择使用哪个密码管理器来选择所属的位置:你。