Forked from barbaramartina/Swift 3: How to implement a service extension.swift
Created
September 7, 2022 13:00
-
-
Save hsleedevelop/0a86131f046ce4eae4b438893611a68b to your computer and use it in GitHub Desktop.
Swift 3: implement a service extension and download an image attachment.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// NotificationService.swift | |
// Service | |
// | |
// Created by Barbara Rodeker on 28/09/16. | |
// Copyright © 2016 Barbara Rodeker. All rights reserved. | |
// | |
import UserNotifications | |
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) | |
if let bestAttemptContent = bestAttemptContent { | |
if let urlString = bestAttemptContent.userInfo["picture"] as? String, | |
let data = NSData(contentsOf: URL(string:urlString)!) as? Data { | |
let path = NSTemporaryDirectory() + "attachment" | |
_ = FileManager.default.createFile(atPath: path, contents: data, attributes: nil) | |
do { | |
let file = URL(fileURLWithPath: path) | |
let attachment = try UNNotificationAttachment(identifier: "attachment", url: file,options:[UNNotificationAttachmentOptionsTypeHintKey : "public.jpeg"]) | |
bestAttemptContent.attachments = [attachment] | |
} catch { | |
print(error) | |
} | |
} | |
contentHandler(bestAttemptContent) | |
} | |
} | |
override func serviceExtensionTimeWillExpire() { | |
// Called just before the extension will be terminated by the system. | |
// Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. | |
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent { | |
contentHandler(bestAttemptContent) | |
} | |
} | |
} | |
// The example is based in a payload like the following: | |
/*{ | |
"aps":{ | |
"alert":"Do you like puppies?", | |
"category":"any-name-2", | |
"mutable-content":1 | |
}, | |
"picture" : "https://pixabay.com/static/uploads/photo/2015/02/05/12/09/chihuahua-624924__180.jpg" | |
}*/ | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment