首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSItemProvider loadItem方法返回_NSItemProviderSandboxedResource而不是URL

NSItemProvider loadItem方法返回_NSItemProviderSandboxedResource而不是URL
EN

Stack Overflow用户
提问于 2019-08-25 09:22:32
回答 3查看 6K关注 0票数 9

在我开发的一个应用程序中,我使用共享扩展导入钱包通行证(PKPass)。

在iOS 13 (包括最新的beta 8)上,当从iOS邮件应用程序中调用共享扩展时,扩展程序不会以预期格式(IOS)接收数据。

这是来自共享扩展的ShareViewController的相关片段:

代码语言:javascript
复制
if let inputItems = self.extensionContext?.inputItems,
   let inputItem = inputItems.first as? NSExtensionItem,
   let attachments = inputItem.attachments,
   let attachment = attachments.first,
   attachment.hasItemConformingToTypeIdentifier("com.apple.pkpass" as String){
    attachment.loadItem(forTypeIdentifier: "com.apple.pkpass" as String, options: nil) { data, error in
        print ("data: \(String(describing: data))")
}

在iOS 12 (最新版本)上,这也适用于iOS邮件应用程序中的附件(例如文件应用程序中的文件);数据包含一个可选的URL。上面的print语句在控制台中显示如下:

代码语言:javascript
复制
data: Optional(file:///var/mobile/Library/Mail/8EF174CF-68B9-414E-A166-D04C9DBE020E/INBOX.imapmbox/Attachments/13846/2/Attachment-1.pkpass)

在iOS 13 (beta 8)上,在iOS邮件应用程序中,数据包含一个可选的_NSItemProviderSandboxedResource。上面的print语句在控制台中显示如下:

代码语言:javascript
复制
data: Optional(<_NSItemProviderSandboxedResource: 0x2839aa9e0>)

这似乎只影响邮件应用程序。在Files应用程序中,数据如出一辙地保存着一个URL。

这是一个bug (实际上,我已经使用反馈助手在beta 4上报告了这一点)还是由iOS 13引入的一些新的安全特性?在这种情况下,我如何访问附件的url/数据?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-25 13:19:52

刚刚找到了解决这个问题的办法。

在调用iOS 13之前

代码语言:javascript
复制
attachment.loadItem(forTypeIdentifier: "com.apple.pkpass" as String, options: nil) data, error in

数据也可以按以下方式降至URL

代码语言:javascript
复制
if let pkPassURL = data as? URL

正如在上面的问题中所描述的,在iOS 13中,这是不可能的。

相反,现在需要使用"public.file-url“作为类型标识符调用loadItem:

代码语言:javascript
复制
attachment.loadItem(forTypeIdentifier: "public.file-url" as String, options: nil) { (data, error) in

在PKPass项的特定情况下,我注意到在共享它们时

  • 在Wallet应用程序中,附件将只符合"com.apple.pkpass“
  • 例如,通过邮件应用程序,附件将符合"com.apple.pkpass“和"public.file-url”。

因此,下面的代码可以用于处理这两种情况:

代码语言:javascript
复制
if let inputItems = self.extensionContext?.inputItems,
   let inputItem = inputItems.first as? NSExtensionItem,
   let attachments = inputItem.attachments,
   let attachment = attachments.first,
   attachment.hasItemConformingToTypeIdentifier("com.apple.pkpass" as String) {
    if attachment.hasItemConformingToTypeIdentifier("public.file-url" as String) {
        // extension is being called e.g. from Mail app
        attachment.loadItem(forTypeIdentifier: "public.file-url" as String, options: nil) { (data, error) in 
            if let sourcePKPassURL = data as? URL {
                //handle url here
            }
        }
    } else {
        // extension is being called from Wallet app
        attachment.loadItem(forTypeIdentifier: "com.apple.pkpass" as String, options: nil) { (data, error) in
            if let pkPassData = data as? Data,
               let pkPass = try? PKPass(data: pkPassData) {
               // handle pkPass here
            }
        }
    }
}

这适用于iOS 12和iOS 13。

票数 8
EN

Stack Overflow用户

发布于 2019-09-27 14:16:43

从iOS 13开始,我在Apple附件中也遇到了同样的问题。另外,在之前检查UTI并加载该类型并不能从下面的代码中运行。

代码语言:javascript
复制
if let item = extensionContext?.inputItems.first as? NSExtensionItem {
        if let itemProvider = item.attachments?.first {
            let type = itemProvider.registeredTypeIdentifiers
            let uti = type.first!
            if itemProvider.hasItemConformingToTypeIdentifier(uti) {
                itemProvider.loadItem(forTypeIdentifier:uti, options: nil, completionHandler: { (item, error) -> Void in
                    print(item) //<_NSItemProviderSandboxedResource: 0x2839aa9e0>
                })
            }
        }}
票数 1
EN

Stack Overflow用户

发布于 2019-09-25 06:22:15

我也遇到过同样的问题,现在看来我找到了解决办法。

尝试使用attachments.last而不是.first

看起来,Apple会返回多个邮件应用程序附件类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57644782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档