Skip to content

Commit 6b13dbd

Browse files
committed
添加 ttl 参数,到期自动删除保存的推送。
1 parent 6a2997a commit 6b13dbd

12 files changed

Lines changed: 369 additions & 73 deletions

Bark/AppDelegate+Realm.swift

Lines changed: 83 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88

99
import UIKit
1010

11+
private let pendingMessageProcessingQueue = DispatchQueue(label: "me.fin.bark.pending-message-processing", qos: .utility)
12+
let kBarkMessagesDidChangeNotification = Notification.Name("com.bark.messagesDidChange")
13+
1114
extension AppDelegate {
1215
/*
1316
之前数据库是放在App Groups 共享
@@ -84,68 +87,89 @@ extension AppDelegate {
8487
}
8588

8689
// 处理 Notification Service Extension 保存的待处理消息, 将其存入 Realm 数据库
87-
func processPendingMessages() {
88-
guard let groupUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.bark") else {
89-
return
90-
}
91-
92-
let pendingMessagesDir = groupUrl.appendingPathComponent("pending_messages")
93-
94-
// 检查目录是否存在
95-
guard FileManager.default.fileExists(atPath: pendingMessagesDir.path) else {
96-
return
97-
}
98-
99-
// 获取所有 plist 文件
100-
guard let fileUrls = try? FileManager.default.contentsOfDirectory(
101-
at: pendingMessagesDir,
102-
includingPropertiesForKeys: nil,
103-
options: [.skipsHiddenFiles]
104-
) else {
105-
return
106-
}
107-
108-
let plistFiles = fileUrls.filter { $0.pathExtension == "plist" }
109-
110-
guard !plistFiles.isEmpty else {
111-
return
112-
}
113-
114-
// 获取 Realm 实例
115-
guard let realm = try? Realm() else {
116-
return
117-
}
118-
119-
// 批量处理消息
120-
var messagesToAdd: [Message] = []
121-
var urlsToDelete: [URL] = []
122-
123-
// 先读取所有 plist 文件
124-
for plistUrl in plistFiles {
125-
guard let dict = NSDictionary(contentsOf: plistUrl) as? [String: Any] else {
126-
continue
127-
}
128-
129-
let message = Message(dict: dict)
130-
messagesToAdd.append(message)
131-
urlsToDelete.append(plistUrl)
132-
}
133-
134-
// 批量写入 Realm
135-
do {
136-
try realm.write {
137-
for message in messagesToAdd {
138-
realm.add(message, update: .all)
90+
func processPendingMessages() async {
91+
await withCheckedContinuation { (continuation: CheckedContinuation<Void, Never>) in
92+
pendingMessageProcessingQueue.async {
93+
defer { continuation.resume() }
94+
95+
guard let groupUrl = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.bark") else {
96+
return
97+
}
98+
99+
let pendingMessagesDir = groupUrl.appendingPathComponent("pending_messages")
100+
let plistFiles: [URL]
101+
if FileManager.default.fileExists(atPath: pendingMessagesDir.path),
102+
let fileUrls = try? FileManager.default.contentsOfDirectory(
103+
at: pendingMessagesDir,
104+
includingPropertiesForKeys: nil,
105+
options: [.skipsHiddenFiles]
106+
)
107+
{
108+
plistFiles = fileUrls.filter { $0.pathExtension == "plist" }
109+
} else {
110+
plistFiles = []
111+
}
112+
113+
guard let realm = try? Realm() else {
114+
return
115+
}
116+
117+
var messagesToAdd: [Message] = []
118+
var urlsToDelete: [URL] = []
119+
let now = Date()
120+
var didChangeMessages = false
121+
122+
for plistUrl in plistFiles {
123+
guard let dict = NSDictionary(contentsOf: plistUrl) as? [String: Any] else {
124+
urlsToDelete.append(plistUrl)
125+
continue
126+
}
127+
128+
let message = Message(dict: dict)
129+
urlsToDelete.append(plistUrl)
130+
if let expireDate = message.expireDate, expireDate <= now {
131+
continue
132+
}
133+
messagesToAdd.append(message)
134+
}
135+
136+
let expiredMessages = realm.objects(Message.self)
137+
.filter("expireDate != nil AND expireDate <= %@", now)
138+
139+
if !messagesToAdd.isEmpty || !expiredMessages.isEmpty {
140+
do {
141+
try realm.write {
142+
if !messagesToAdd.isEmpty {
143+
didChangeMessages = true
144+
for message in messagesToAdd {
145+
realm.add(message, update: .all)
146+
}
147+
}
148+
if !expiredMessages.isEmpty {
149+
didChangeMessages = true
150+
realm.delete(expiredMessages)
151+
}
152+
}
153+
} catch {
154+
// 一般不会失败,真失败了算你小子运气差
155+
}
156+
}
157+
158+
for plistUrl in urlsToDelete {
159+
try? FileManager.default.removeItem(at: plistUrl)
160+
}
161+
162+
if didChangeMessages {
163+
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
164+
self.notifyMessagesDidChange()
139165
}
140166
}
141-
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
142-
} catch {
143-
// 一般不会失败,真失败了算你小子运气差
144167
}
145-
146-
// 无论成功或失败,都删除已处理的 plist 文件
147-
for plistUrl in urlsToDelete {
148-
try? FileManager.default.removeItem(at: plistUrl)
168+
}
169+
170+
func notifyMessagesDidChange() {
171+
DispatchQueue.main.async {
172+
NotificationCenter.default.post(name: kBarkMessagesDidChangeNotification, object: nil)
149173
}
150174
}
151175
}

Bark/AppDelegate.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
4949
{ _, observer, _, _, _ in
5050
guard let observer = observer else { return }
5151
let appDelegate = Unmanaged<AppDelegate>.fromOpaque(observer).takeUnretainedValue()
52-
DispatchQueue.main.async {
53-
appDelegate.processPendingMessages()
52+
Task {
53+
await appDelegate.processPendingMessages()
5454
}
5555
},
5656
"com.bark.newmessage" as CFString,
@@ -59,7 +59,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
5959
)
6060

6161
// 处理可能在启动前积累的消息
62-
processPendingMessages()
62+
Task {
63+
await processPendingMessages()
64+
}
6365

6466
UNUserNotificationCenter.current().delegate = self
6567
var actions = [
@@ -128,6 +130,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
128130
realm.delete(message)
129131
}
130132
WidgetHistorySnapshotStore.shared.refreshFromRealmAsync()
133+
notifyMessagesDidChange()
131134
}
132135

133136
completionHandler(.newData)
@@ -172,7 +175,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
172175
UIApplication.shared.applicationIconBadgeNumber = -1
173176

174177
// 处理待处理的消息
175-
processPendingMessages()
178+
Task {
179+
await processPendingMessages()
180+
}
176181
}
177182

178183
func applicationWillTerminate(_ application: UIApplication) {

0 commit comments

Comments
 (0)