自定义扩展文件未在iMessage中打开

在我的应用程序中,我需要将一些自定义数据文件从一个设备发送到另一个设备,我正在尝试使用Mail,iMessage / Message和Airdrop。

这适用于Mail和Airdrop但使用iMessage并且它很好,但在接收端,我无法打开文件。 它只是不允许我用它做任何事情。

有任何想法吗??

这就是我的文档类型:

CFBundleDocumentTypes   CFBundleTypeIconFile abc.png CFBundleTypeName ABC Custom Data type CFBundleTypeRole Viewer Handler Rank Owner LSItemContentTypes  com.company.abc.wd    

这就是我发送数据的方式:

 NSMutableDictionary * dict = [NSMutableDictionary dictionary]; [dict setObject:currentDataSet forKey:@"actualData"]; NSData * meetingData = [NSKeyedArchiver archivedDataWithRootObject:dict]; Meeting * dataItem = [[Meeting alloc]initWithData:meetingData type:@"com.abc.xyz.wd" subject:@"Meeting" previewImage:[UIImage imageNamed:@"appIcon.png"]]; UIActivityViewController * activityController = [[UIActivityViewController alloc]initWithActivityItems:@[dataItem] applicationActivities:nil]; activityController.excludedActivityTypes = @[UIActivityTypePostToTwitter, UIActivityTypePostToWeibo]; [self presentViewController:activityController animated:YES completion:nil]; 

我在搜索类似的解决方案时遇到过这篇文章。 我能够从我的应用程序发送自定义文件,然后通过电子邮件打开或与AirDrop一起使用。 如果我通过iMe​​ssage发送它甚至出现了我的自定义图标,但当我在iMessage中点击它时没有发生任何事情。

请注意,在plist文件中需要类似以下内容( 如何将文件类型与iPhone应用程序相关联? )

 UTExportedTypeDeclarations   UTTypeConformsTo  public.plain-text public.text  UTTypeDescription Molecules Structure File UTTypeIdentifier com.sunsetlakesoftware.molecules.pdb UTTypeTagSpecification  public.filename-extension pdb public.mime-type chemical/x-pdb   

注意:我的应用程序非常相似但在UTTypeConformsTo我只有public.data,因为我的文件是压缩数据文件。

我发现通过添加public.text作为数组中的第二项,它将在iMessage中可操作。 另外需要注意的是,如果我将public.plain-text添加为第三项,我的文件最终会显示一个Pages图标而不是我的图标(所以我删除了它)

我希望这可以帮助别人。 花了我几个小时才到达它的底部。

Info.plist中LSItemContentTypes键的值应该等于Meeting对象声明的值。

据推测,您的Meeting对象遵循UIActivityItemSource协议。 确保返回的值(来自委托方法activityViewController:dataTypeIdentifierForActivityType:与您在Info.plist声明为可读的值匹配。

这个答案是正确的,因为如果自定义文档符合public.text则可以从Messages打开它。 此解决方案的缺点是文档被预览为原始文本,这可能不是所需的结果。

通过创建快速查看预览扩展,可以从“消息”应用程序打开符合public.data文档,而无需将其作为原始文本进行预览。 关于如何构建快速查看预览扩展的文档并不多,但它非常简单:

  1. 在Xcode中,选择File > New > Target

  2. 选择“ 快速查看预览扩展” ,为扩展名命名,然后单击“ 完成”

  3. 在新创建的扩展的info.plist中,在NSExtension > NSExtensionAttributes > QLSupportedContentTypes下添加一个新项,并将此项的值设置为应用程序的自定义文档类型。 例如:

     ... NSExtension  NSExtensionAttributes  QLSupportedContentTypes  com.company.abc.wd  QLSupportsSearchableItems   NSExtensionMainStoryboard MainInterface NSExtensionPointIdentifier com.apple.quicklook.preview  ... 
  4. 使用MainInterface.storyboardPreviewViewController定义自定义快速查看预览的布局。 更具体地说,从preparePreviewOfFile函数中提供的URL读取数据并相应地填充ViewController。 一个简短的例子(在Swift 4中):

     func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) { do { let documentData = try Data(contentsOf: url) // Populate the ViewController with a preview of the document. handler(nil) } catch let error { handler(error) } } 

我在创建扩展时遇到的一些陷阱:

  • 导出的UTI标识符必须全部为小写。 当某些字符为大写字母时,即使我在快速查看预览扩展中使用相同的大小写,也从未显示快速查看预览。

  • Quick Look Preview Extensions不允许链接动态库。 如果链接了动态库,则不会加载快速查看预览。

  • Quick Look ViewController不允许有任何按钮。 如果它包含按钮,则​​不会加载快速查看预览。

其他资源:

  • 在iOS 11中构建基于文档的优秀应用程序(WWDC 2017video)

  • 从头开始快速查看预览(WWDC 2018video)

  • QuickLook文档