2017-12-23 1 views
0

UNNotificationServiceExtension을 작성하여 파일을 다운로드하고 첨부하려고합니다. 내가 실행할 때마다 예외가 발생합니다.UNNotificationServiceExtension의 첨부 파일 URL이 잘못되었습니다.

잘못된 첨부 파일 URL입니다.

나는 왜 이것이 실패하고 있는지 알지 못한다.

다음
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { 
    let bestAttemptContent = request.content.mutableCopy() as! UNMutableNotificationContent 

    guard let urlPath = request.content.userInfo["media-url"] as? String, 
     let url = URL(string: urlPath) else { 
      contentHandler(bestAttemptContent) 
      return 
    } 

    let semaphore = DispatchSemaphore(value: 0) 

    URLSession.shared.downloadTask(with: url) { 
     location, _, _ in 

     defer { semaphore.signal() } 

     guard let location = location else { return } 

     var destination: URL! 

     do { 
      destination = try FileManager.default.url(for: .itemReplacementDirectory, 
                 in: .userDomainMask, 
                 appropriateFor: location, 
                 create: true) 
      destination.appendPathComponent(url.lastPathComponent) 
      let attachment = try UNNotificationAttachment(identifier: "", 
                  url: destination) 
      bestAttemptContent.attachments = [attachment] 
     } catch let error { 
      bestAttemptContent.body = error.localizedDescription + "\n" + destination.absoluteString 
     } 
    }.resume() 

    _ = semaphore.wait(timeout: .distantFuture) 

    contentHandler(bestAttemptContent) 
} 

답변

1

당신은 여전히 ​​코드를 찾고 있다면, 그것이,

class NotificationService: UNNotificationServiceExtension { 

    var contentHandler: ((UNNotificationContent) -> Void)? 
    var bestAttemptContent: UNMutableNotificationContent? 

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) { 

     self.contentHandler = contentHandler 
     bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) 

     func failEarly() { 
      contentHandler(request.content) 
     } 

     guard let content = (request.content.mutableCopy() as? UNMutableNotificationContent) else { 
      return failEarly() 

     } 
     guard let apnsData = content.userInfo["data"] as? [String: Any] else { 
      return failEarly() 

     } 

     guard let attachmentURL = apnsData["media-url"] as? String else { 
      return failEarly() 

     } 

     guard let imageData = NSData(contentsOf:NSURL(string: attachmentURL)! as URL) else { 
      return failEarly() 

     } 

     bestAttemptContent?.attachments = [create(imageFileIdentifier: "image.jpg", data: imageData, options: nil)!] 
     contentHandler(bestAttemptContent!) 

    } 

    override func serviceExtensionTimeWillExpire() { 
     if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { 
      contentHandler(bestAttemptContent) 
     } 
    } 

} 

func create(imageFileIdentifier: String, data: NSData, options: [NSObject : AnyObject]?) -> UNNotificationAttachment? { 

    let tmpSubFolderName: String = ProcessInfo.processInfo.globallyUniqueString 
    let fileURLPath: String = NSTemporaryDirectory() 
    let tmpSubFolderURL: String = URL(fileURLWithPath: fileURLPath).appendingPathComponent(tmpSubFolderName).absoluteString 

    if ((try? FileManager.default.createDirectory(atPath: tmpSubFolderURL, withIntermediateDirectories: true, attributes: nil)) != nil) { 
     let fileURL = URL(fileURLWithPath: tmpSubFolderURL).appendingPathComponent(imageFileIdentifier) 
     data.write(to: fileURL, atomically: true) 
     let attachment = try? UNNotificationAttachment(identifier: imageFileIdentifier, url: fileURL, options: options) 
     return attachment! 
    } 
    return nil 

} 
관련 문제