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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义扩展文件未在iMessage中打开相关的知识,希望对你有一定的参考价值。

在我的应用程序中,我需要将一些自定义数据文件从一个设备发送到另一个设备,我正在尝试使用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];
答案

我在搜索类似的解决方案时遇到过这篇文章。我能够从我的应用程序发送自定义文件,并通过电子邮件打开它或与AirDrop一起使用。如果我通过iMe​​ssage发送它甚至出现了我的自定义图标,但是当我在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图标而不是我的图标(所以我删除了它)

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

另一答案

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

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

  1. 在Xcode中,选择File> New> Target
  2. 选择“快速查看预览扩展”,为扩展名指定名称,然后单击“完成”。
  3. 在新创建的扩展的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> ...
  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不允许有任何按钮。如果它包含按钮,则​​不会加载快速查看预览。

其他资源:

另一答案

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

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

以上是关于自定义扩展文件未在iMessage中打开的主要内容,如果未能解决你的问题,请参考以下文章

ios 11 imessage 扩展 message.url 无法打开 safari

有没有办法从容器应用程序中打开 iMessage 扩展程序?

VS Code中自定义Emmet代码片段

VSCode创建自定义用户片段

VS code自定义用户代码片段snippet

vs code 自定义代码片段