mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-03 16:10:20 +00:00
Avoid creating multiple clients if the NSE is invoked more than once on the same process
This commit is contained in:
committed by
Stefan Ceriu
parent
6655833719
commit
f291f10f46
@@ -49,6 +49,9 @@ private let keychainController = KeychainController(service: .sessions,
|
|||||||
class NotificationServiceExtension: UNNotificationServiceExtension {
|
class NotificationServiceExtension: UNNotificationServiceExtension {
|
||||||
private var handler: ((UNNotificationContent) -> Void)?
|
private var handler: ((UNNotificationContent) -> Void)?
|
||||||
private var modifiedContent: UNMutableNotificationContent?
|
private var modifiedContent: UNMutableNotificationContent?
|
||||||
|
|
||||||
|
// Used to create one single UserSession across process/instances/runs
|
||||||
|
private static var userSession: NSEUserSession?
|
||||||
|
|
||||||
override func didReceive(_ request: UNNotificationRequest,
|
override func didReceive(_ request: UNNotificationRequest,
|
||||||
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
|
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
|
||||||
@@ -75,6 +78,17 @@ class NotificationServiceExtension: UNNotificationServiceExtension {
|
|||||||
MXLog.info("\(tag) Payload came: \(request.content.userInfo)")
|
MXLog.info("\(tag) Payload came: \(request.content.userInfo)")
|
||||||
|
|
||||||
Task {
|
Task {
|
||||||
|
if Self.userSession == nil {
|
||||||
|
// This function might be run concurrently and from different processes
|
||||||
|
// It's imperative that we create **at most** one UserSession/Client per process
|
||||||
|
do {
|
||||||
|
Self.userSession = try await NSEUserSession(credentials: credentials, clientSessionDelegate: keychainController)
|
||||||
|
} catch {
|
||||||
|
MXLog.error("NSE run error: \(error)")
|
||||||
|
return discard(unreadCount: request.unreadCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
await run(with: credentials,
|
await run(with: credentials,
|
||||||
roomId: roomId,
|
roomId: roomId,
|
||||||
eventId: eventId,
|
eventId: eventId,
|
||||||
@@ -94,12 +108,13 @@ class NotificationServiceExtension: UNNotificationServiceExtension {
|
|||||||
eventId: String,
|
eventId: String,
|
||||||
unreadCount: Int?) async {
|
unreadCount: Int?) async {
|
||||||
MXLog.info("\(tag) run with roomId: \(roomId), eventId: \(eventId)")
|
MXLog.info("\(tag) run with roomId: \(roomId), eventId: \(eventId)")
|
||||||
|
|
||||||
|
guard let userSession = Self.userSession else {
|
||||||
|
MXLog.error("Invalid NSE User Session, discarding.")
|
||||||
|
return discard(unreadCount: unreadCount)
|
||||||
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
// This function might be run concurrently and from different processes, let the SDK handle race conditions
|
|
||||||
// on fetching user sessions
|
|
||||||
let userSession = try await NSEUserSession(credentials: credentials, clientSessionDelegate: keychainController)
|
|
||||||
|
|
||||||
guard let itemProxy = await userSession.notificationItemProxy(roomID: roomId, eventID: eventId) else {
|
guard let itemProxy = await userSession.notificationItemProxy(roomID: roomId, eventID: eventId) else {
|
||||||
MXLog.info("\(tag) no notification for the event, discard")
|
MXLog.info("\(tag) no notification for the event, discard")
|
||||||
return discard(unreadCount: unreadCount)
|
return discard(unreadCount: unreadCount)
|
||||||
|
|||||||
Reference in New Issue
Block a user