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

Posted

技术标签:

【中文标题】自定义扩展文件未在 iMessage 中打开【英文标题】:Custom extension file not opening in iMessage 【发布时间】:2014-05-14 15:39:56 【问题描述】:

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

【问题讨论】:

不确定您是否必须坚持标准 UTI - developer.apple.com/library/ios/documentation/Miscellaneous/… - 您是否有代码示例说明您在将文件附加到消息时尝试执行的操作,您是否使用 addAttachmentData:typeIdentifier:filename: ? 您只想发送 PNG 文件吗?如果不是,您可以使用以下代码发送/检测各种格式&lt;key&gt;CFBundleDocumentTypes&lt;/key&gt; &lt;array&gt; &lt;dict&gt; &lt;key&gt;CFBundleTypeIconFiles&lt;/key&gt; &lt;array/&gt; &lt;key&gt;CFBundleTypeName&lt;/key&gt; &lt;string&gt;com.jungleDisk.file&lt;/string&gt; &lt;key&gt;LSHandlerRank&lt;/key&gt; &lt;string&gt;Owner&lt;/string&gt; &lt;key&gt;LSItemContentTypes&lt;/key&gt; &lt;array&gt; &lt;string&gt;public.data&lt;/string&gt; &lt;/array&gt; &lt;/dict&gt; &lt;/array&gt; @Ashutosh,你有想过这个吗?我遇到了同样的问题并遇到了这个线程。 【参考方案1】:

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

大概您的会议对象遵守UIActivityItemSource 协议。确保您返回的值(来自委托方法activityViewController:dataTypeIdentifierForActivityType:)与您在Info.plist 中声明为可读的值相匹配。

【讨论】:

【参考方案2】:

我在寻找类似解决方案时遇到了这篇文章。我能够从我的应用程序中通过电子邮件发送自定义文件并在电子邮件中打开它或将其与 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>

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

我发现通过将 public.text 添加为数组中的第二项,它可以在 iMessage 中执行。进一步说明,如果我将 public.plain-text 作为第三项添加,我的文件最终会出现一个 Pages 图标而不是我的图标(因此我将其删除)

我希望这对某人有所帮助。我花了好几个小时才弄明白。

【讨论】:

我无法使这个解决方案发挥作用。我的设备运行的是 iOS 11。这个问题***.com/q/39709981 表明 iOS 10 发生了一些变化。您的应用是否仍然可以在 iOS 11 上打开 iMessage 附件?【参考方案3】:

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

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

    在 Xcode 中,选择 File > New > Target

    选择Quick Look Preview Extension,为您的扩展命名,然后点击Finish

    在新创建的扩展的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.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 Extension 中使用了相同的大写字母,Quick Look 预览也不会显示。

不允许快速查看预览扩展链接到动态库。如果链接了动态库,则不会加载快速查看预览。

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

其他资源:

Building Great Document-based Apps in iOS 11 (WWDC 2017 Video)

Quick Look Previews from the Ground Up (WWDC 2018 Video)

QuickLook Documentation

【讨论】:

在 iOS 14.7 中,我发现我可以从“文件”应用打开自定义文件格式,但在“消息”中点击其中一个文件没有任何效果。通过为我的文件类型添加一个简单的快速查找,我可以在消息中点击我的文件时看到它。从我制作的那个预览中,我可以根据需要发送到我的应用程序。在“文件”应用程序中,它似乎有自己的快速查看功能,但在“消息”中不起作用(直到我自己制作了)。

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

自定义字体未在用作背景图像的 SVG 模式中显示

在 UINavigationController 中定义自定义过渡动画器时锚定键盘,如 iMessage 应用程序

使用 UICollectionView 自定义发送消息动画,如 iMessage 发送消息

支持 Flutter 应用中的自定义文件扩展名(在 Flutter 中打开扩展名为 .abc 的文件)

带有自定义声音的推送通知未在 iOS 中显示

Bootstrap 4自定义文件上传未在标签中显示文件名