增加系统消息通知
This commit is contained in:
parent
ab0ee1ccf9
commit
c215145123
@ -17,6 +17,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||
private var rootTask: Task<Void, Error>?
|
||||
|
||||
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
|
||||
|
||||
let shared = UserDefaults(suiteName: "group.com.jihe.punchnetmac")
|
||||
let msg = shared?.string(forKey: "test_msg")
|
||||
SDLLogger.shared.log("NE read message: \(msg ?? "failed")")
|
||||
|
||||
// host: "192.168.0.101", port: 1265
|
||||
guard let options, let config = SDLConfiguration.parse(options: options) else {
|
||||
completionHandler(TunnelError.invalidConfiguration)
|
||||
|
||||
112
punchnet/Core/DarwinNotificationCenter.swift
Normal file
112
punchnet/Core/DarwinNotificationCenter.swift
Normal file
@ -0,0 +1,112 @@
|
||||
//
|
||||
// DarwinNotificationName.swift
|
||||
// punchnet
|
||||
//
|
||||
// Created by 安礼成 on 2026/4/3.
|
||||
//
|
||||
import Foundation
|
||||
|
||||
// MARK: - Darwin Notification Name
|
||||
public struct DarwinNotificationName: RawRepresentable, Hashable {
|
||||
public let rawValue: String
|
||||
|
||||
public init(rawValue: String) {
|
||||
self.rawValue = rawValue
|
||||
}
|
||||
}
|
||||
|
||||
// 预定义名称
|
||||
extension DarwinNotificationName {
|
||||
static let vpnStatusChanged = DarwinNotificationName(rawValue: "com.jihe.punchnetmac.vpnStatusChanged")
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Manager
|
||||
public final class DarwinNotificationCenter {
|
||||
public static let shared = DarwinNotificationCenter()
|
||||
|
||||
private let center = CFNotificationCenterGetDarwinNotifyCenter()
|
||||
|
||||
private var observers: [DarwinNotificationName: (DarwinNotificationName) -> Void] = [:]
|
||||
private let lock = NSLock()
|
||||
|
||||
private init() {}
|
||||
|
||||
// MARK: - Add Observer
|
||||
public func addObserver(for name: DarwinNotificationName, queue: DispatchQueue = .main, using block: @escaping (DarwinNotificationName) -> Void ) {
|
||||
lock.lock()
|
||||
defer {
|
||||
lock.unlock()
|
||||
}
|
||||
|
||||
if observers[name] == nil {
|
||||
// 首次注册到 Darwin Center
|
||||
CFNotificationCenterAddObserver(
|
||||
center,
|
||||
UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()),
|
||||
{ (_, observer, cfName, _, _) in
|
||||
guard let observer, let cfName else {
|
||||
return
|
||||
}
|
||||
|
||||
let instance = Unmanaged<DarwinNotificationCenter>
|
||||
.fromOpaque(observer)
|
||||
.takeUnretainedValue()
|
||||
|
||||
let name = DarwinNotificationName(rawValue: cfName.rawValue as String)
|
||||
instance.handle(name: name)
|
||||
},
|
||||
name.rawValue as CFString,
|
||||
nil,
|
||||
.deliverImmediately
|
||||
)
|
||||
|
||||
observers[name] = { n in
|
||||
queue.async {
|
||||
block(n)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Remove Observer
|
||||
public func removeObserver(for name: DarwinNotificationName) {
|
||||
lock.lock()
|
||||
defer {
|
||||
lock.unlock()
|
||||
}
|
||||
|
||||
if observers[name] != nil {
|
||||
CFNotificationCenterRemoveObserver(
|
||||
center,
|
||||
UnsafeMutableRawPointer(Unmanaged.passUnretained(self).toOpaque()),
|
||||
CFNotificationName(name.rawValue as CFString),
|
||||
nil
|
||||
)
|
||||
}
|
||||
observers.removeValue(forKey: name)
|
||||
|
||||
}
|
||||
|
||||
// MARK: - Post
|
||||
public func post(_ name: DarwinNotificationName) {
|
||||
CFNotificationCenterPostNotification(
|
||||
center,
|
||||
CFNotificationName(name.rawValue as CFString),
|
||||
nil,
|
||||
nil,
|
||||
true
|
||||
)
|
||||
}
|
||||
|
||||
// MARK: - Handle
|
||||
private func handle(name: DarwinNotificationName) {
|
||||
lock.lock()
|
||||
let block = observers[name]
|
||||
lock.unlock()
|
||||
|
||||
block?(name)
|
||||
}
|
||||
|
||||
}
|
||||
@ -90,6 +90,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
|
||||
func applicationWillFinishLaunching(_ notification: Notification) {
|
||||
|
||||
let shared = UserDefaults(suiteName: "group.com.jihe.punchnetmac")
|
||||
shared?.set("App says hello", forKey: "test_msg")
|
||||
shared?.synchronize()
|
||||
|
||||
}
|
||||
|
||||
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user