2015-02-04 1 views
1

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

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

ответ

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