Расширение действия, пытающееся получить файл

Я пытаюсь создать расширение действия в 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 примерно так (я изменил строку идентификатора в середине):

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

После initWithContentsOfURL я получаю текст, но это не то, что мне нужно. Тестовый файл весит около 300 байт. Что возвращается, так это около 70 000 байт метаданных.

Как получить файл? Я использую неправильный идентификатор типа?

Примечание. Если я поделюсь файлом с Evernote или TapForms, он сразу же появится, так что дело не в файле.


person Murray Sagal    schedule 04.02.2015    source источник


Ответы (1)


Тип 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

person Greg    schedule 10.02.2015