2016-08-21 2 views
10

Ich habe gearbeitet, reiche Benachrichtigung Erfahrung, die in iOS10 eingeführt wurde und stecken mit Bilder als Anhänge zu UNNotificationContentExtension übergeben.Bild von Anhang von lokalen Benachrichtigung wird nicht in UNNotificationContentExtension

Hier ist meine ContentExtension:

class NotificationViewController: UIViewController, UNNotificationContentExtension { 

    @IBOutlet weak var attachmentImage: UIImageView! 

    func didReceive(_ notification: UNNotification) { 

     if let attachment = notification.request.content.attachments.first { 
      if attachment.url.startAccessingSecurityScopedResource() { 
       attachmentImage.image = UIImage(contentsOfFile: attachment.url.path) 
       attachment.url.stopAccessingSecurityScopedResource() 
      } 
     } 
    } 
} 

als Tutorial, ich habe folgende Advanced Notifications video from WWDC. ich eingecheckt haben - UIImage Ich bin zu UIImageView Zuordnung:

  • ist nichtnil
  • richtige CGSize (191x191)
  • attachment.url.path gleich /var/mobile/Library/SpringBoard/PushStore/Attachments/<bundle of app>/<...>.png

hat So sende ich lokale Benachrichtigung von der App:

let content = UNMutableNotificationContent() 
    content.title = "Sample title" 
    content.body = "Sample body" 
    content.categoryIdentifier = "myNotificationCategory" 

    let attachement = try! UNNotificationAttachment(identifier: "image", 
                   url: Bundle.main.url(forResource: "cat", withExtension: "png")!, 
                   options: nil) 

    content.attachments = [ attachement ] 

    let request = UNNotificationRequest(identifier:requestIdentifier, content: content, trigger: nil) 
    UNUserNotificationCenter.current().delegate = self 
    UNUserNotificationCenter.current().add(request){(error) in 
     if (error != nil){ 
     } 
    } 

"cat.png" ist nur eine Dummy-Ressource, die ich zu proj hinzugefügt habe. enter image description here

Wie Sie sehen können, Meldung zeigt das Bild, so nehme ich an, dass ich es richtig, aber im expandierten Zustand (in NotificationViewController) ich zeigt das gleiche Bild noch nie gelingen würde senden.

Was mache ich falsch? Danke!

+1

Hallo Ich bin immer noch das gleiche Problem, das nicht in der Lage, Bild im erweiterten Zustand anzuzeigen. Kannst du mir helfen? Mein Code ist in Ziel c. –

Antwort

21

Wenn Sie eine UIImage mit contentsOfFile erstellen, lesen die UIImage-Objekt das Bild Header nur, die grundlegende Informationen anzeigt, wie Bildgröße, usw.

versuchen also, stopAccessingSecurityScopedResource-[NotificationViewController dealloc] zu bewegen.

Oder unter Verwendung folgender:

  • Objective-C Code:

    NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 
    UIImage *image = [UIImage imageWithData:imageData]; 
    
  • SWIFT Code:

    let imageData = NSData(contentsOf: attachment.url) 
    let image = UIImage(data: imageData! as Data) 
    

Es gibt keine Dokumente, die besagen, dass contentsOfFile nur den Bildkopf liest. Aber wenn ich den Code ausführen folgende:

NSString *docFolderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
NSString *pngPath = [docFolderPath stringByAppendingPathComponent:@"test.png"];  
UIImage *image = [UIImage imageWithContentsOfFile:pngPath]; 
[[NSFileManager defaultManager] removeItemAtPath:pngPath error:nil]; 
imageView.image = image; 

tritt ein Fehler auf:

ImageIO: createDataWithMappedFile:1322: 'open' failed '/Users/fanjie/Library/Developer/CoreSimulator/Devices/FFDFCA06-A75E-4B54-9FC2-8E2AAE3B1405/data/Containers/Data/Application/E2D26210-4A53-424E-9FE8-D522CFD4FD9E/Documents/test.png' 
    error = 2 (No such file or directory) 

So mache ich einen Schluss zu, dass UIImage contentsOfFile nur das Bild-Header liest.

+0

Jeffery, du bist mein Held. Toller Fang & Erklärung! Die Antwort zum Hinzufügen der von mir verwendeten Swift-Version wurde etwas modifiziert. Funktioniert jetzt wie ein Zauber! –

+1

@Jeffery wo hast du gelesen, dass 'contentsOfFile' nur den Bildkopf lädt? Hier ist die Diskussion aus docs: "Diese Methode lädt die Bilddaten in den Speicher und markiert es als löschbar. Wenn die Daten gelöscht werden und neu geladen werden müssen, lädt das Bildobjekt diese Daten erneut aus dem angegebenen Pfad." Ich denke, das Problem könnte sein, dass Sie 'stopAccessingSecurityScopedResource' aufrufen, die Bildspeicher löschen und Es schließt den Zugriff auf die Bilddatei und es kann nicht erneut geladen werden. –

+0

@Kostiantyn Koval Entschuldigung. Keine Dokumentation besagt, dass 'contentsOfFile' nur den Image-Header lädt. Ich denke, das Aufrufen von 'stopAccessingSecurityScopedResource' würde den Bildspeicher nicht löschen. Es ist nicht überzeugend, Code im Kommentar zu schreiben, also füge ich etwas Erklärung in die Antwort ein. – Jeffery

Verwandte Themen