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

Я пытаюсь создать расширение Action в iOS 8. Начиная с нового проекта, я создал приложение с одним представлением и добавил новую цель для расширения Action. Шаблон расширения действия по умолчанию настроен для отображения изображения. Когда я делюсь с фотографиями, изображение отображается на контроллере представления для расширения, так что все основные сантехника работает.

Реальный случай использования заключается в том, что я хочу поделиться текстовым файлом из 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 байт. Возвращается около 70000 байт метаданных.

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

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

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

Другие вопросы по тегам