20

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

3 回答 3

6

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

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

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

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

  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 预览从未显示,即使我在 Quick Look Preview Extension 中使用了相同的大写字母。

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

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

其他资源:

于 2018-08-06T00:26:13.873 回答
3

我在寻找类似的解决方案时遇到了这篇文章。我能够从我的应用程序中通过电子邮件发送自定义文件并在电子邮件中打开它或将其与 AirDrop 一起使用。如果我通过 iMessage 发送它,它甚至会显示我的自定义图标,但是当我在 iMessage 中点击它时,什么也没发生。

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

<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 图标而不是我的图标(所以我删除了它)

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

于 2015-12-30T20:35:06.393 回答
1

您的 Info.plist 中LSItemContentTypes键的值应等于您的会议对象声明的值。

大概您的会议对象遵守UIActivityItemSource协议。确保您返回的值(来自委托方法activityViewController:dataTypeIdentifierForActivityType:)与您在Info.plist.

于 2014-05-28T20:00:16.383 回答