Void) { self.contentHandler = contentHandler self.bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent) /* Get the custom data from the notification payload */ if let notificationData = request.content.userInfo["data"] as? [String: String] { /* Grab the attachment */ if let urlString = notificationData["attachment-url"], let fileUrl = URL(string: urlString) { /* Download the attachment */ URLSession.shared.downloadTask(with: fileUrl) { (location, response, error) in if let location = location { /* Move temporary file to remove .tmp extension */ let tmpDirectory = NSTemporaryDirectory() let tmpFile = "file://".appending(tmpDirectory).appending(fileUrl.lastPathComponent) let tmpUrl = URL(string: tmpFile)! try! FileManager.default.moveItem(at: location, to: tmpUrl) /* Add the attachment to the notification content */ if let attachment = try? UNNotificationAttachment(identifier: "", url: tmpUrl) { self.bestAttemptContent?.attachments = [attachment] } } /* Serve the notification content */ self.contentHandler!(self.bestAttemptContent!) }.resume() } } In your Notification extension (Swift 3.0)