Расширение действия Попытка получить файл
Я пытаюсь создать расширение 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-адресом.
Для получения дополнительной информации об этом, обратитесь к этой статье справки: