Rocket.Chat.ReactNative/ios/ReplyNotification.swift

54 lines
2.2 KiB
Swift
Raw Normal View History

[NEW] E2E Encryption push (iOS) (#2463) * link pods to notification service * push encryption poc * decrypt room key poc * read user key from mmkv and cast into a pkcs * push decrypt poc (iOS) * expose needed watermelon methods * watermelon -> database * indent & simple-crypto update * string extensions * storage * toBase64 -> toData * remove a forced unwrap * remove unused import * database driver * improvement * folder structure & watermelon bridge * more improvement stuff * watermelon -> database * reuse database instance * improvement * database fix: bypass watermelon cache * some code improvements * encryption instances * start api stuff * network layer * improve notification service * improve folder structure * watermelon patch * retry fetch logic * rocketchat class * fix try to decrypt without a roomKey * fallback to original content that is translated * some fixes to rocketchat logic * merge develop * remove unnecessary extension * [CHORE] Improve reply notification code (iOS) * undo sign changes * remove mocked value * import direct from library * send message request * reply notification with encrypted message working properly * revert apple sign * fix api onerror * trick to display sender name on group notifications * revert data.host change * fix some multithread issues * use sendername sent by server * small improvement * Bump crypto lib * Update ios/NotificationService/NotificationService.swift * add experimental string * remove trailing slash * remove trailing slash on reply * fix decrypt messages Co-authored-by: Diego Mello <diegolmello@gmail.com>
2020-09-24 18:34:13 +00:00
//
// ReplyNotification.swift
// RocketChatRN
//
// Created by Djorkaeff Alexandre Vilela Pereira on 9/17/20.
// Copyright © 2020 Rocket.Chat. All rights reserved.
//
import Foundation
import UserNotifications
@objc(ReplyNotification)
class ReplyNotification: RNNotificationEventHandler {
private static let dispatchOnce: Void = {
let instance: AnyClass! = object_getClass(ReplyNotification())
let originalMethod = class_getInstanceMethod(instance, #selector(didReceive))
let swizzledMethod = class_getInstanceMethod(instance, #selector(replyNotification_didReceiveNotificationResponse))
if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}()
@objc
public static func configure() {
_ = self.dispatchOnce
}
@objc
func replyNotification_didReceiveNotificationResponse(_ response: UNNotificationResponse, completionHandler: @escaping(() -> Void)) {
if response.actionIdentifier == "REPLY_ACTION" {
if let notification = RCTConvert.unNotificationPayload(response.notification) {
if let data = (notification["ejson"] as? String)?.data(using: .utf8) {
if let payload = try? JSONDecoder().decode(Payload.self, from: data), let rid = payload.rid {
if let msg = (response as? UNTextInputNotificationResponse)?.userText {
let rocketchat = RocketChat.instanceForServer(server: payload.host.removeTrailingSlash())
let backgroundTask = UIApplication.shared.beginBackgroundTask(expirationHandler: nil)
rocketchat.sendMessage(rid: rid, message: msg) { response in
guard let response = response, response.success else {
let content = UNMutableNotificationContent()
content.body = "Failed to reply message."
let request = UNNotificationRequest(identifier: "replyFailure", content: content, trigger: nil)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
return
}
UIApplication.shared.endBackgroundTask(backgroundTask)
}
}
}
}
}
}
}
}