1

我正在尝试在 iOS 8 中创建一个动作扩展。从一个新项目开始,我创建了一个单视图应用程序并为动作扩展添加了一个新目标。默认操作扩展模板配置为显示图像。当我从照片分享时,图像会显示在扩展的视图控制器上,因此基本的管道都可以正常工作。

真正的用例是我想将文本文件从 Dropbox(或 Air Sharing 或其他)共享到应用程序并让应用程序处理文件。

首先我改变了info.plist:

<key>NSExtension</key>
<dict>
    <key>NSExtensionAttributes</key>
    <dict>
        <key>NSExtensionActivationRule</key>
        <dict>
            <key>NSExtensionActivationSupportsFileWithMaxCount</key>
            <string>1</string>
            <key>NSExtensionActivationSupportsText</key>
            <string>1</string>
        </dict>
    </dict>
    <key>NSExtensionMainStoryboard</key>
    <string>MainInterface</string>
    <key>NSExtensionPointIdentifier</key>
    <string>com.apple.ui-services</string>
</dict>

我添加testfile.text到 Dropbox,当我在 Dropbox 应用中导航到它并点击共享按钮时,我的扩展程序出现了,因此激活规则似乎正在运行。

当我记录扩展上下文时,这就是我得到的self.extensionContext.inputItems

self.extensionContext.inputItems= (
    "<NSExtensionItem: 0x15657180> - userInfo: {\nNSExtensionItemAttachmentsKey =     (\n        \"<NSItemProvider: 0x15658c30> {types = (\\n    \\\"public.url\\\"\\n)}\"\n    );\n}")

有一个类型为public.url. 所以我修改了 viewDidLoad 中的模板代码来查找类型kUTTypeURL

for (NSExtensionItem *item in self.extensionContext.inputItems) {
    for (NSItemProvider *itemProvider in item.attachments) {
        if ([itemProvider hasItemConformingToTypeIdentifier:(NSString *)kUTTypeURL]) {
            __weak UITextView *textView = self.textView;
            [itemProvider loadItemForTypeIdentifier:(NSString *)kUTTypeURL options:nil completionHandler:^(NSURL *url, NSError *error) {
                if(url) {
                    NSString *text = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; // just using this to test
                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                        [textView setText:text];
                    }];

url是这样的(我已经更改了中间的 id 字符串):

https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0

initWithContentsOfURL我收到文字后,但这不是我想要的。测试文件大约 300 字节。返回的是大约 70,000 字节的元数据。

我如何获取文件?我使用了错误的类型标识符吗?

注意:如果我将文件共享到 Evernote 或 TapForms,它会直接进入,因此与文件无关。

4

1 回答 1

2

您返回的 URL 类型是为了与人类共享,因此它会返回一个预览页面,用户可以在其中选择下载文件等。如果您需要以编程方式下载原始文件内容,您将需要先修改链接的参数。例如,您的假设示例:

https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=0

可以改为:

https://www.dropbox.com/s/lskd8jejbj8wpo/testfile.text?dl=1

只要您的代码遵循 URL 返回的重定向,您就可以下载文件内容。

有关这方面的更多信息,请参阅此帮助文章:

https://www.dropbox.com/help/201

于 2015-02-10T18:59:03.853 回答