2017-02-15 6 views
0

Meine iOS App (Swift 3) benötigt wichtige Bilder von anderen Apps mit einer Action Extension. Ich verwende den Code der Standard-Action-Extension-Vorlage, der sich gut für Apps wie iOS Mail und Fotos eignet, bei denen das freigegebene Bild eine URL zu einer lokalen Datei ist. Aber für bestimmte Apps, bei denen das Bild geteilt wird, sind die tatsächlichen Bilddaten selbst, mein Aktions-Erweiterungscode erhält das Bild nicht.Importieren eines Bildes mit Action Extension - URL zu einem lokalen Image funktioniert aber nicht mit aktuellen Bilddaten

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 

        } 
       } 

Als Referenz erreichte ich für eine der Anwendungen in den Entwickler, wo die Dinge nicht funktioniert und er teilte diesen Code auf, wie er das Bild auf die Aktion Erweiterung teilt.

//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)    

Antwort

0

es herausgefunden dank dieser Stelle, die die Herausforderung ganz gut https://pspdfkit.com/blog/2017/action-extension/ erklärt. Zusammenfassend wissen wir nicht, ob die Sharing-App uns eine URL zu einem vorhandenen Bild oder nur Rohdaten des Bildes gibt. Daher müssen wir den Code für die Aktionserweiterungsvorlage ändern, um beide Fälle zu bearbeiten.

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 

      } 
Verwandte Themen