2016-04-08 1 views
0

Теперь я работаю над приложением, которое должно внедрять расширение для совместного использования вложений из приложения Mail. Он должен поддерживать разные расширения файлов (почти все типы документов). Из документов Apple я понял, что мне нужно использовать Predicate в моем Info.plist, но в ответах на SO я обнаружил, что должен использовать его в коде. Теперь я застрял на этом и не могу продолжать дальше. Вот предикат, который я хочу использовать из этого post.Поделиться вложением из приложения Mail с расширением Share в iOS

SUBQUERY (
      extensionItems, 
      $extensionItem, 
      SUBQUERY (
      $extensionItem.attachments, 
      $attachment, 

      (
         ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg-2000" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.tiff" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.bmp" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.word.doc" 
        || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "org.openxmlformats.wordprocessingml.document" 
      ) 
)[email protected] == [email protected] 
)[email protected] == 1 

Может кто-нибудь посоветовать, как использовать этот предикат в моем быстром коде:

for attachment in content.attachments as! [NSItemProvider] { 
     if attachment.hasItemConformingToTypeIdentifier(contentType) { 

      attachment.loadItemForTypeIdentifier(contentType, options: nil) { data, error in 
       if error == nil { 
        let url = data as! NSURL 
        if let fileData = NSData(contentsOfURL: url) { 
         self.selectedFile = NSData(data: fileData) 
        } 
       } else { 

        let alert = UIAlertController(title: "Error", message: "Error loading file", preferredStyle: .Alert) 

        let action = UIAlertAction(title: "Error", style: .Cancel) { _ in 
         self.dismissViewControllerAnimated(true, completion: nil) 
        } 

        alert.addAction(action) 
        self.presentViewController(alert, animated: true, completion: nil) 
       } 
      } 
     } 
    } 

Вот мой NSExtensionActivationRule:

 <key>NSExtensionActivationRule</key> 
     <dict> 
      <key>NSExtensionActivationSupportsAttachmentsWithMaxCount</key> 
      <integer>1</integer> 
     </dict> 

Спасибо заранее.

ответ

2

Итак, наконец, я нашел ответ на мой вопрос! На всякий случай, если кто-то встретит ту же проблему. Прежде всего, я должен использовать инструкцию PREDICATE (Подзапрос) в Info.plist вместо ключа NSExtensionActivationSupportsAttachmentsWithMaxCount. Как:

 <key>NSExtensionActivationRule</key> 
     <string>SUBQUERY (
      extensionItems, 
      $extensionItem, 
      SUBQUERY (
      $extensionItem.attachments, 
      $attachment, 
      (
      ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg-2000" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.tiff" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.bmp" 
      || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.word.doc" 
      ) 
      )[email protected] == 1 // Important! to activate extension only on 1 chosen image 
      )[email protected] == 1 
     </string> 

Второе: Правильно получить все вложения, используя необходимые TypeIdentifier (ИМП):

if let content = extensionContext!.inputItems.first as? NSExtensionItem { 
     if let contents = content.attachments as? [NSItemProvider] { 
      for attachment in contents{ 
       attachment.loadItemForTypeIdentifier("public.item", options: nil) { data, error in 
        let url = data as! NSURL 
        let fileExtension = url.pathExtension as String! 
        let fileName = self.generateImageName() as String 
        if let fileData = NSData(contentsOfURL: url) { 
         self.uploadFile("\(fileName).\(fileExtension)", data: fileData) 
        } 
       } 
      } 
     } 
    } 

"public.item" - это универсальный ИМП для поддержки всех видов расширений файлов, перечисленных в вашем Строка NSExtensionActivationRule. Вы можете получить необходимое UTI на https://developer.apple.com

Удача с разработкой расширений действия! Любые вопросы приветствуются!

+0

Как насчет generateImageName() Вы можете объяснить, что это за функция? –

+0

Это моя функция, это просто получение исходного имени файла из пути выбранного файла. – Artiom

Смежные вопросы