在我开发的一个应用程序中,我使用共享扩展导入钱包通行证(PKPass)。
在iOS 13 (包括最新的beta 8)上,当从iOS邮件应用程序中调用共享扩展时,扩展程序不会以预期格式(IOS)接收数据。
这是来自共享扩展的ShareViewController的相关片段:
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语句在控制台中显示如下:
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语句在控制台中显示如下:
data: Optional(<_NSItemProviderSandboxedResource: 0x2839aa9e0>)这似乎只影响邮件应用程序。在Files应用程序中,数据如出一辙地保存着一个URL。
这是一个bug (实际上,我已经使用反馈助手在beta 4上报告了这一点)还是由iOS 13引入的一些新的安全特性?在这种情况下,我如何访问附件的url/数据?
发布于 2019-09-25 13:19:52
刚刚找到了解决这个问题的办法。
在调用iOS 13之前
attachment.loadItem(forTypeIdentifier: "com.apple.pkpass" as String, options: nil) data, error in数据也可以按以下方式降至URL
if let pkPassURL = data as? URL正如在上面的问题中所描述的,在iOS 13中,这是不可能的。
相反,现在需要使用"public.file-url“作为类型标识符调用loadItem:
attachment.loadItem(forTypeIdentifier: "public.file-url" as String, options: nil) { (data, error) in在PKPass项的特定情况下,我注意到在共享它们时
因此,下面的代码可以用于处理这两种情况:
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。
发布于 2019-09-27 14:16:43
从iOS 13开始,我在Apple附件中也遇到了同样的问题。另外,在之前检查UTI并加载该类型并不能从下面的代码中运行。
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>
})
}
}}发布于 2019-09-25 06:22:15
我也遇到过同样的问题,现在看来我找到了解决办法。
尝试使用attachments.last而不是.first
看起来,Apple会返回多个邮件应用程序附件类型。
https://stackoverflow.com/questions/57644782
复制相似问题