2016-08-21 9 views
10

Pracuję nad zaawansowanym powiadomieniem, które zostało wprowadzone w iOS10 i utknęło w przekazywaniu obrazów jako załączników do UNNotificationContentExtension.Obraz z załącznika z Powiadomienia lokalnego nie jest wyświetlany w UNNotificationContentExtension

Oto mój 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() 
      } 
     } 
    } 
} 

W samouczku Śledzę Advanced Notifications video from WWDC. Sprawdziłem - UIImage jestem przypisanie do UIImageView:

  • jest nienil
  • jest właściwa CGSize (191x191)
  • attachment.url.path równa /var/mobile/Library/SpringBoard/PushStore/Attachments/<bundle of app>/<...>.png

Oto jak wysyłać lokalne powiadomienia z aplikacji:

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" to po prostu sztuczny zasób dodany do proj. enter image description here

Jak widać, zgłoszenie pokazuje pic, więc zakładam, że wyślę go poprawnie, ale w stanie rozszerzonym (w NotificationViewController) nigdy nie uda się pokazując ten sam obraz.

Co robię źle? Dzięki!

+1

Witam Nadal mam ten sam problem, który nie jest w stanie wyświetlić obrazu w stanie rozwiniętym. Czy możesz mi pomóc? Mój kod jest obiektywny c. –

Odpowiedz

21

Podczas tworzenia UIImage z contentsOfFile, obiekt UIImage przeczytać tylko nagłówek obrazu, który wskazujące podstawowe informacje, takie jak rozmiar, itp

Tak, spróbuj przenieść stopAccessingSecurityScopedResource do [NotificationViewController dealloc].

lub za pomocą następujących czynności:

  • celem-C kod:

    NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 
    UIImage *image = [UIImage imageWithData:imageData]; 
    
  • szybki Kod:

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

Brak dokumentów informujących, że contentsOfFile odczytuje tylko nagłówek obrazu. Ale kiedy uruchomić kod następujący:

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; 

wystąpi błąd:

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) 

Więc robię wniosku, że UIImage contentsOfFile czyta tylko nagłówek obrazu.

+0

Jeffery, jesteś moim bohaterem. Świetny chwyt i wyjaśnienie! Lekko zmodyfikowałem odpowiedź, aby dodać wersję swift, której użyłem. Teraz działa jak urok! –

+1

@Jeffery gdzie przeczytałeś, że 'contentsOfFile' ładuje tylko nagłówek obrazu? Oto dyskusja z dokumentów: "Ta metoda ładuje dane obrazu do pamięci i zaznacza je jako możliwe do oczyszczenia.Jeśli dane zostaną wyczyszczone i muszą zostać ponownie załadowane, obiekt obrazu wczytuje te dane ponownie z określonej ścieżki." Myślę, że problemem może być to, że nazywasz 'stopAccessingSecurityScopedResource', który usuwa pamięć obrazu i Zamyka dostęp do pliku obrazu i nie można go załadować ponownie. –

+0

@Kostiantyn Koval Przepraszamy. Brak dokumentów stwierdzających, że 'contentsOfFile' ładuje tylko nagłówek obrazu. Myślę, że wywołanie 'stopAccessingSecurityScopedResource' nie oczyści pamięci obrazu. Nie jest przekonany, aby opublikować kod w komentarzu, więc dodam wyjaśnienie do odpowiedzi. – Jeffery

Powiązane problemy