在我的应用程序中,我需要将一些自定义数据文件从一个设备发送到另一个设备,我正在尝试使用Mail,iMessage / Message和Airdrop执行此操作。
这适用于Mail和Airdrop但是使用iMessage并且它很好,但在接收端,我无法打开文件。它只是不允许我用它做任何事情。
任何想法?
这就是我的文档类型:
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFile</key>
<string>abc.png</string>
<key>CFBundleTypeName</key>
<string>ABC Custom Data type</string>
<key>CFBundleTypeRole</key>
<string>Viewer</string>
<key>Handler Rank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.company.abc.wd</string>
</array>
</dict>
</array>
这就是我发送数据的方式:
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];
答案 0 :(得分:3)
我在搜索类似的解决方案时遇到过这篇文章。我能够从我的应用程序发送自定义文件,并通过电子邮件打开它或与AirDrop一起使用。如果我通过iMessage发送它甚至出现了我的自定义图标,但是当我在iMessage中点击它时没有发生任何事情。
请注意,您需要在plist文件中添加以下内容(来自How do I associate file types with an iPhone application?)
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.plain-text</string>
<string>public.text</string>
</array>
<key>UTTypeDescription</key>
<string>Molecules Structure File</string>
<key>UTTypeIdentifier</key>
<string>com.sunsetlakesoftware.molecules.pdb</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<string>pdb</string>
<key>public.mime-type</key>
<string>chemical/x-pdb</string>
</dict>
</dict>
注意:我的应用程序非常相似但在UTTypeConforms中我只有public.data,因为我的文件是压缩数据文件。
我发现通过将public.text添加为数组中的第二项,它将在iMessage中可操作。另外请注意,如果我将public.plain-text添加为第三项,我的文件最终会显示一个Pages图标而不是我的图标(所以我删除了它)
我希望这有助于某人。我花了几个小时才到达它的底部。
答案 1 :(得分:3)
This answer是正确的,因为符合public.text
的自定义文档可以从消息中打开。该解决方案的缺点是将文档预览为原始文本,这可能不是期望的结果。
符合public.data
的文档可以通过创建快速外观预览扩展程序从“消息”应用程序中打开,而无需作为原始文本进行预览。关于如何构建快速外观预览扩展的文档并不多,但是非常简单:
在Xcode中,选择File
> New
> Target
。
选择快速外观预览扩展程序,为扩展程序命名,然后单击完成。
在新创建扩展名的info.plist
中,在NSExtension
> NSExtensionAttributes
> QLSupportedContentTypes
下添加一个新项目,并将该项目的值设置为您应用的自定义文档类型。例如:
...
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>QLSupportedContentTypes</key>
<array>
<string>com.company.abc.wd</string>
</array>
<key>QLSupportsSearchableItems</key>
<true/>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.quicklook.preview</string>
</dict>
...
使用MainInterface.storyboard
和PreviewViewController
定义自定义Quick Look预览的布局。更具体地说,从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扩展程序中使用了相同的大写字母,也从未显示过Quick Look预览。
快速外观预览扩展不允许链接到动态库。如果链接了动态库,则不会加载“快速查看”预览。
Quick Look ViewController不允许具有任何按钮。如果包含按钮,则不会加载“快速查看”预览。
其他资源:
答案 2 :(得分:1)
您的Info.plist中LSItemContentTypes
键的值应该等于Meeting对象声明的值。
据推测,您的Meeting对象符合UIActivityItemSource
协议。确保您返回的值(来自委托方法activityViewController:dataTypeIdentifierForActivityType:
)与您在Info.plist
中声明为可读的值匹配。