56 lines
2.0 KiB
Swift
56 lines
2.0 KiB
Swift
import UserNotifications
|
|
|
|
class NotificationService: UNNotificationServiceExtension {
|
|
|
|
var contentHandler: ((UNNotificationContent) -> Void)?
|
|
var bestAttemptContent: UNMutableNotificationContent?
|
|
var rocketchat: RocketChat?
|
|
|
|
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
|
|
self.contentHandler = contentHandler
|
|
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
|
|
|
|
if let bestAttemptContent = bestAttemptContent {
|
|
let ejson = (bestAttemptContent.userInfo["ejson"] as? String ?? "").data(using: .utf8)!
|
|
guard let data = try? (JSONDecoder().decode(Payload.self, from: ejson)) else {
|
|
return
|
|
}
|
|
|
|
rocketchat = RocketChat.instanceForServer(server: data.host.removeTrailingSlash())
|
|
|
|
// If the notification has the content on the payload, show it
|
|
if data.notificationType != .messageIdOnly {
|
|
self.processPayload(payload: data)
|
|
return
|
|
}
|
|
|
|
// Request the content from server
|
|
rocketchat?.getPushWithId(data.messageId) { notification in
|
|
if let notification = notification {
|
|
self.bestAttemptContent?.title = notification.title
|
|
self.bestAttemptContent?.body = notification.text
|
|
self.processPayload(payload: notification.payload)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func processPayload(payload: Payload) {
|
|
// If is a encrypted message
|
|
if payload.messageType == .e2e {
|
|
if let message = payload.msg, let rid = payload.rid {
|
|
if let decryptedMessage = rocketchat?.decryptMessage(rid: rid, message: message) {
|
|
bestAttemptContent?.body = decryptedMessage
|
|
if let roomType = payload.type, roomType == .group, let sender = payload.senderName {
|
|
bestAttemptContent?.body = "\(sender): \(decryptedMessage)"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if let bestAttemptContent = bestAttemptContent {
|
|
contentHandler?(bestAttemptContent)
|
|
}
|
|
}
|
|
}
|