2017-02-15 6 views
0

Мое приложение iOS (Swift 3) нуждается в важных изображениях из других приложений с помощью расширения действия. Я использую стандартный шаблон шаблона Action Extension, который отлично подходит для таких приложений, как iOS Mail и Photos, где общий образ - это URL-адрес локального файла. Но для некоторых приложений, в которых совместное изображение является фактическими данными изображения, мой код расширения действия не получает изображение.Импорт изображения с помощью Action Extension - URL-адрес для локального изображения работает, но не с фактическими данными изображения

for item: Any in self.extensionContext!.inputItems { 
     let inputItem = item as! NSExtensionItem 
     for provider: Any in inputItem.attachments! { 

      let itemProvider = provider as! NSItemProvider 

      if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) { //we'll take any image type: gif, png, jpg, etc 

     // This is an image. We'll load it, then place it in our image view. 
     weak var weakImageView = self.imageView 
     itemProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil, completionHandler: { (imageURL, 

      error) in 
      OperationQueue.main.addOperation { 


       if let strongImageView = weakImageView { 


        if let imageURL = imageURL as? NSURL { 

         strongImageView.image = UIImage(data: NSData(contentsOf: imageURL as URL)! as Data) 

         let imageData = NSData(contentsOf: imageURL as URL)! as Data 
         self.gifImageView.image = UIImage.gif(data: imageData) 

         let width = strongImageView.image?.size.width 
         let height = strongImageView.image?.size.height 
         .... my custom logic 

        } 
       } 

Для справки, я потянулся к разработчику для одного из приложений, где вещи не работают, и он делил этот код, как он делит изображение на продление действия.

//Here is the relevant code. At this point the scaledImage variable holds a UIImage. 

var activityItems = Array<Any?>() 

if let pngData = UIImagePNGRepresentation(scaledImage) { 

    activityItems.append(pngData) 

} else { 

    activityItems.append(scaledImage) 
} 

//Then a little later it presents the share sheet: 

let activityVC = UIActivityViewController(activityItems: activityItems,applicationActivities: []) 

self.present(activityVC, animated: true, completion: nil)    

ответ

0

Фигурного это благодаря этому посту, который объясняет проблему довольно хорошо https://pspdfkit.com/blog/2017/action-extension/. Таким образом, мы не знаем, добавляет ли приложение для совместного использования URL-адрес существующего изображения или просто данные необработанного изображения, поэтому нам необходимо изменить код шаблона расширения для расширения действия для обработки обоих случаев.

for item: Any in self.extensionContext!.inputItems { 
    let inputItem = item as! NSExtensionItem 
    for provider: Any in inputItem.attachments! { 

     let itemProvider = provider as! NSItemProvider 

     if itemProvider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) { //we'll take any image type: gif, png, jpg, etc 

    // This is an image. We'll load it, then place it in our image view. 
    weak var weakImageView = self.imageView 
    itemProvider.loadItem(forTypeIdentifier: kUTTypeImage as String, options: nil, completionHandler: { (imageURL, 

     error) in 
     OperationQueue.main.addOperation { 


      if let strongImageView = weakImageView { 


       if let imageURL = imageURL as? NSURL { 

        strongImageView.image = UIImage(data: NSData(contentsOf: imageURL as URL)! as Data) 

        let imageData = NSData(contentsOf: imageURL as URL)! as Data 
        self.gifImageView.image = UIImage.gif(data: imageData) 

        let width = strongImageView.image?.size.width 
        let height = strongImageView.image?.size.height 
        .... my custom logic 

       } 

       else 

        guard let imageData = imageURL as? Data else { return } //can we cast to image data? 
        strongImageView_.image = UIImage(data: imageData_) 

        //custom logic 

      }