// // HXProcessNotification.swift // ScreenShareExtension // // Created by Bugu on 2023/10/25. // Copyright © 2023 Bugu. All rights reserved. // import Foundation import CoreFoundation struct HXProcessNotification { static let callback: CFNotificationCallback = { (center: CFNotificationCenter?, observer: UnsafeMutableRawPointer?, name: CFNotificationName?, object: UnsafeRawPointer?, userInfo: CFDictionary?) in DispatchQueue.main.async { if let identifier = name?.rawValue as String? { NotificationCenter.default.post(name: Notification.Name(identifier), object: identifier) } } } static func addObserver(_ observer: AnyObject, selector: Selector, notificationName: String, object: Any?) { DispatchQueue.main.async { let center = CFNotificationCenterGetDarwinNotifyCenter() let pointerObserver = Unmanaged.passUnretained(observer).toOpaque() CFNotificationCenterAddObserver(center, pointerObserver, self.callback, notificationName as CFString, nil, .deliverImmediately) NotificationCenter.default.addObserver(observer, selector: selector, name: NSNotification.Name(rawValue: notificationName), object: object) } } static func removeObserver(_ observer: AnyObject, notificationName: String) { let center = CFNotificationCenterGetDarwinNotifyCenter() let pointerObserver = Unmanaged.passUnretained(observer).toOpaque() CFNotificationCenterRemoveObserver(center, pointerObserver, CFNotificationName(notificationName as CFString) , nil) NotificationCenter.default.removeObserver(observer, name: NSNotification.Name(rawValue: notificationName), object: nil) } static func removeObserver(_ observer: AnyObject) { let center = CFNotificationCenterGetDarwinNotifyCenter() let pointerObserver = Unmanaged.passUnretained(observer).toOpaque() CFNotificationCenterRemoveEveryObserver(center, pointerObserver) NotificationCenter.default.removeObserver(observer) } static func postNotificationName(_ notificationName: String, userInfo: [String : Any]?) { DispatchQueue.main.async { let center = CFNotificationCenterGetDarwinNotifyCenter() let userInfo = userInfo as CFDictionary? CFNotificationCenterPostNotification(center, CFNotificationName(notificationName as CFString), nil, userInfo, true) } } }