2017-04-22 3 views
2

Ich möchte ein Bild an meine lokalen Benachrichtigungen mit einer Bild-URL anhängen. Dies ist die Erweiterung eine Anlage zu schaffen:Bild an Benachrichtigung anhängen Bild-URL

import UserNotifications 

extension UNNotificationAttachment { 
    static func create(identifier: String, image: UIImage, options: [NSObject : AnyObject]?) -> UNNotificationAttachment? { 
     let fileManager = FileManager.default 
     let tmpSubFolderName = ProcessInfo.processInfo.globallyUniqueString 
     let tmpSubFolderURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(tmpSubFolderName, isDirectory: true) 
     do { 
      try fileManager.createDirectory(at: tmpSubFolderURL, withIntermediateDirectories: true, attributes: nil) 
      let imageFileIdentifier = identifier+".png" 
      let fileURL = tmpSubFolderURL.appendingPathComponent(imageFileIdentifier) 
      guard let imageData = UIImagePNGRepresentation(image) else { 
       return nil 
      } 
      try imageData.write(to: fileURL) 
      let imageAttachment = try UNNotificationAttachment.init(identifier: imageFileIdentifier, url: fileURL, options: options) 
      return imageAttachment  } catch { 
       print("error " + error.localizedDescription) 
     } 
     return nil 
    } 
} 

Wenn ich eine neue Benachrichtigung planen, ich benutze es wie folgt aus:

// url of the image such as http://www.unsplash.com/image.png 
let data = try? Data(contentsOf: url) 
guard let myImage = UIImage(data: data!) else { return } 

if let attachment = UNNotificationAttachment.create(identifier: key, image: myImage, options: nil) { 
    content.attachments = [attachment] 
} 

enter image description here

Erstellen einer Meldung wie diese die Anwendung friert für ein paar Sekunden, weil die App das Bild synchron herunterlädt. Ich habe auch versucht, DispatchQueue zu verwenden, aber es änderte nichts. Was habe ich falsch gemacht?

Antwort

2

Ihr Code lädt ein Bild herunter, analysiert es, um ein UIImage zu erstellen, konvertiert das Bild zurück in einen PNG-Datenblock und schreibt diese Daten in eine temporäre Datei.

Sie können den Schritt überspringen, in dem Sie die UIImage erstellen und in eine Datei zurückkonvertieren.

Versuchen URLSession und URLDataTask mit:

let fileURL = ... 
let task = URLSession.shared.dataTask(with: url) { (data, _, _) in 
    do { 
     try imageData.write(to: fileURL) 
     let attachment = UNNotificationAttachment.create(identifier: key, image: myImage, options: nil) 
     // call closure to call back with attachment and/or error 
    } 
    catch let ex { 
     // call closure with error 
    } 
} 
task.resume() 

Ich habe einige Fehlerbehandlung und andere Details weggelassen, aber das sollte Ihnen die allgemeine Vorstellung von dem, was erforderlich ist es asynchron zu tun. URLSession s verwenden GCD, um asynchrone Vernetzung durchzuführen.

0

Laden Sie das Bild asynchron mit Alamofire herunter und versuchen Sie es dann.

let destination: DownloadRequest.DownloadFileDestination = { 
    _, _ in 
    var documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] 
    documentsURL.appendPathComponent("image.jpg") 
    return (documentsURL, [.removePreviousFile, .createIntermediateDirectories]) 
} 
Alamofire.download(url, to: destination).response { 
    response in 
    // do whatever you want with your image, for example if it is an audio file: 
    do { 
     self.player = try AVAudioPlayer(contentsOf: URL(string: "\(response.destinationURL!)")!) 
     self.player.volume = 1.0 
     self.player.play() 
    } catch { 
     print(error) 
    }   
}