【问题标题】:How to get attachment's (NSItemProvider) file path in Swift 'Share App Extension'?如何在 Swift 'Share App Extension' 中获取附件的(NSItemProvider)文件路径?
【发布时间】:2019-04-22 21:22:17
【问题描述】:

注意:我对 Swift 编程非常新(仅 2 天),我正在编写这段代码作为ElectronJS 项目。所以请不要介意我对语言基础的无知。谢谢。

我创建了一个包含 Share App Extension 的 Swift 应用程序。

要求:

  1. Share App Extension 应该能够将共享文件的absolute file path 发送到容器应用程序,即如果用户在 Finder 中选择a file (abc.txt) from Desktop 并共享到我的应用程序,那么共享应用程序扩展应该能够获取文件路径为

    /users/userName/Desktop/abc.txt
    

    我在这里苦苦挣扎的是如何获取与 Share App Extension 共享的文件的文件路径。获取NSExtensionItem 中附件的文件路径的方法是什么?Share App Extension 可以使用它还是可以从其他对象获得?

    (我能够成功使用App Groups 在Share App Extension 和Application 之间共享数据)

  2. 在最终项目中,Share App Extension 成为前面提到的ElectronJS 项目的一部分。

    是否有一种标准方法可以将上述信息(附件的文件路径)从 Share App Extension 共享到 Electron 应用程序的主/渲染器进程。

【问题讨论】:

    标签: swift macos electron


    【解决方案1】:

    我正在分享以下解决方案。请记住,这些可能不是最好的解决方案,我愿意接受建议。

    第 1 点的解决方案:

    Briefing:如果选择的extension context与应用程序的extension context匹配,则用户通过在操作系统中注册的应用程序的Share App Extension从Finder中选择要共享的文件Share App Extension。这样做后,Share App Extension 会收到 extension context 和 NSExtensionItem。 NSExtensionItem 对象包含 NSItemProvider 对象,这是您为通过 Share App Extension 共享的所有文件(附件)获取的对象。

    现在,对于您通过Share App Extension 收到的每个项目类型,在查找您的函数通过hasItemConforminToTypeIdentifier(_:) 识别的数据后,您可以使用 UTI(统一类型标识符)来识别其数据。

    补救措施:在这里,关键部分是要理解人们应该首先将他们的输入文件视为以下类型:kUTTypeURL。然后,在NSItemProvider 对象的loadItem 方法的completionHandler 中,会得到NSURL,这基本上就是我要查找的文件路径。

    第 2 点的解决方案:

    简报:Share App Extension 可以使用 Swift 编写,但我们项目中的主应用程序却没有!主应用程序是用ElectronJS 编写的,它与 Swift 的集成相去甚远!除了ElectronJS写的应用程序可以打包成dmg应用程序的形式外,就语言和框架的交织而言,ElectronJS和Swift的可集成性非常小。

    前提: 因此,前提是能够共享之前提取的文件路径,以便从Share App Extension(用 Swift 编写)传递到主应用程序(用 ElectronJS 编写)。现在,如果主应用程序是一个 Cocoa 应用程序,事情会容易得多。如果它们都属于同一个App group,那么使用 Swift API,它们可以同步读取/写入共享内存。但是,问题出现了,因为这些 API 在 ElectronJS 中不可用。一种补救方法是使用 nodeJS 库在 ElectronJS 应用程序的沙盒环境中运行 Swift 代码。但是,沙盒环境在数据共享方面表现出其自身的细微差别。所以,我暂时搁置了这种方法。

    所以,我现在选择的方法是使用App Data Directory 来共享这些中间信息。 Share App Extension 将在应用程序的App Data 目录中写入文件路径信息,而 ElectronJS 应用程序将使用 nodeJs API 来访问此信息。请记住,这是一种非常原始的方法,需要付出些微的努力,但这种特殊情况的要求并不需要严格的安全措施。

    但是,我正在积极寻找解决问题 #2 的更好方法。

    【讨论】:

    • 第 1 点的重新解决方案:使用kUTTypeURL 或kUTTypeFileURL 类型调用hasItemConforminToTypeIdentifier 时,如果选择PNG 之类的文件,将无法获取路径。有什么建议吗?
    • @HonghaoZhang 我不知道为什么会这样,但你可能想试试UTI Image Content Types。 developer.apple.com/documentation/mobilecoreservices/uttype/…
    • 我想获取所选文件的文件路径。我想通了,我使用了kUTTypeItem,developer.apple.com/documentation/coreservices/kuttypeitem,它可以工作。我可以通过调用loadItem... 来获取文件路径
    • 我按照您的回答通过共享扩展读取iOS Files APP中的txt文件并将txt共享到我的APP。但我失败了。你能帮我回答这个问题吗? stackoverflow.com/questions/62242952/… 我是 iOS 开发新手,想在 Share Extension 中读取 txt 文件。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多