feat(background): 增强iOS后台任务系统,添加processing任务类型支持
- 添加新的processing任务标识符到iOS配置文件 - 重构BackgroundTaskBridge支持不同任务类型(refresh/processing) - 增强后台任务日志记录和调试信息 - 修复任务类型配置不匹配问题 - 改进任务调度逻辑和错误处理机制 - 添加任务执行时间戳记录用于调试 - 移除notification-settings中未使用的AuthGuard依赖
This commit is contained in:
@@ -390,14 +390,27 @@ class BackgroundTaskBridge: RCTEventEmitter {
|
||||
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: identifier)
|
||||
NSLog("[BackgroundTaskBridge] 已取消之前的任务请求: \(identifier)")
|
||||
|
||||
// 使用 BGAppRefreshTaskRequest 而不是 BGProcessingTaskRequest
|
||||
// BGAppRefreshTaskRequest 更适合定期刷新数据的场景
|
||||
let request = BGAppRefreshTaskRequest(identifier: identifier)
|
||||
// 根据任务类型选择合适的请求类
|
||||
// processing 类型使用 BGProcessingTaskRequest,fetch 类型使用 BGAppRefreshTaskRequest
|
||||
let request: BGTaskRequest
|
||||
|
||||
switch kind {
|
||||
case .processing:
|
||||
request = BGProcessingTaskRequest(identifier: identifier)
|
||||
case .refresh:
|
||||
request = BGAppRefreshTaskRequest(identifier: identifier)
|
||||
}
|
||||
|
||||
// 设置最早开始时间
|
||||
// 注意:实际执行时间由系统决定,可能会延迟
|
||||
// 系统通常会在设备空闲、网络连接良好、电量充足时执行
|
||||
request.earliestBeginDate = Date(timeIntervalSinceNow: delay)
|
||||
if let appRefreshRequest = request as? BGAppRefreshTaskRequest {
|
||||
appRefreshRequest.earliestBeginDate = Date(timeIntervalSinceNow: delay)
|
||||
} else if let processingRequest = request as? BGProcessingTaskRequest {
|
||||
processingRequest.earliestBeginDate = Date(timeIntervalSinceNow: delay)
|
||||
processingRequest.requiresNetworkConnectivity = requiresNetworkConnectivity
|
||||
processingRequest.requiresExternalPower = requiresExternalPower
|
||||
}
|
||||
|
||||
do {
|
||||
try BGTaskScheduler.shared.submit(request)
|
||||
@@ -429,7 +442,10 @@ class BackgroundTaskBridge: RCTEventEmitter {
|
||||
guard let self else { return }
|
||||
|
||||
self.currentTask = task
|
||||
NSLog("[BackgroundTaskBridge] 开始处理后台任务: \(task.identifier)")
|
||||
NSLog("[BackgroundTaskBridge] ===== 开始处理后台任务 =====")
|
||||
NSLog("[BackgroundTaskBridge] 任务标识符: \(task.identifier)")
|
||||
NSLog("[BackgroundTaskBridge] 任务类型: \(type(of: task))")
|
||||
NSLog("[BackgroundTaskBridge] 当前时间: \(Date().description)")
|
||||
|
||||
if self.identifier == nil {
|
||||
self.identifier = task.identifier
|
||||
@@ -474,8 +490,10 @@ class BackgroundTaskBridge: RCTEventEmitter {
|
||||
return
|
||||
}
|
||||
|
||||
NSLog("[BackgroundTaskBridge] 发送后台任务执行事件到JS")
|
||||
NSLog("[BackgroundTaskBridge] 准备发送后台任务执行事件到JS")
|
||||
NSLog("[BackgroundTaskBridge] hasListeners: \(self.hasListeners)")
|
||||
self.emitTaskToJS(payload: payload)
|
||||
NSLog("[BackgroundTaskBridge] ✅ 事件已发送到JS层")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -514,8 +532,22 @@ class BackgroundTaskBridge: RCTEventEmitter {
|
||||
// 先取消之前的任务请求,避免重复
|
||||
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: identifier)
|
||||
|
||||
let request = BGAppRefreshTaskRequest(identifier: identifier)
|
||||
request.earliestBeginDate = Date(timeIntervalSinceNow: self.defaultDelay)
|
||||
// 使用与配置时相同的任务类型
|
||||
let request: BGTaskRequest
|
||||
switch self.kind {
|
||||
case .processing:
|
||||
request = BGProcessingTaskRequest(identifier: identifier)
|
||||
if let processingRequest = request as? BGProcessingTaskRequest {
|
||||
processingRequest.earliestBeginDate = Date(timeIntervalSinceNow: self.defaultDelay)
|
||||
processingRequest.requiresNetworkConnectivity = self.requiresNetworkConnectivity
|
||||
processingRequest.requiresExternalPower = self.requiresExternalPower
|
||||
}
|
||||
case .refresh:
|
||||
request = BGAppRefreshTaskRequest(identifier: identifier)
|
||||
if let appRefreshRequest = request as? BGAppRefreshTaskRequest {
|
||||
appRefreshRequest.earliestBeginDate = Date(timeIntervalSinceNow: self.defaultDelay)
|
||||
}
|
||||
}
|
||||
|
||||
do {
|
||||
try BGTaskScheduler.shared.submit(request)
|
||||
@@ -542,11 +574,14 @@ class BackgroundTaskBridge: RCTEventEmitter {
|
||||
|
||||
pendingTaskTimeoutWorkItem?.cancel()
|
||||
|
||||
NSLog("[BackgroundTaskBridge] 缓存后台任务等待JS监听器...")
|
||||
NSLog("[BackgroundTaskBridge] 等待超时时间: \(Int(pendingTaskWaitTimeout))秒")
|
||||
|
||||
let timeoutItem = DispatchWorkItem { [weak self] in
|
||||
guard let self else { return }
|
||||
guard self.waitingForJSListeners else { return }
|
||||
|
||||
NSLog("[BackgroundTaskBridge] 等待 JS 监听器超时,执行默认处理")
|
||||
NSLog("[BackgroundTaskBridge] ⚠️ 等待 JS 监听器超时,执行默认处理")
|
||||
self.waitingForJSListeners = false
|
||||
self.pendingTaskPayload = nil
|
||||
self.pendingTaskTimeoutWorkItem = nil
|
||||
@@ -555,6 +590,7 @@ class BackgroundTaskBridge: RCTEventEmitter {
|
||||
|
||||
pendingTaskTimeoutWorkItem = timeoutItem
|
||||
queue.asyncAfter(deadline: .now() + pendingTaskWaitTimeout, execute: timeoutItem)
|
||||
NSLog("[BackgroundTaskBridge] 已设置超时计时器")
|
||||
}
|
||||
|
||||
private func emitPendingTaskIfPossible() {
|
||||
@@ -573,10 +609,12 @@ class BackgroundTaskBridge: RCTEventEmitter {
|
||||
private func emitTaskToJS(payload: [String: Any]) {
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
guard let self else { return }
|
||||
NSLog("[BackgroundTaskBridge] 正在发送事件到JS层...")
|
||||
self.sendEvent(
|
||||
withName: "BackgroundTaskBridge.execute",
|
||||
body: payload
|
||||
)
|
||||
NSLog("[BackgroundTaskBridge] ✅ 事件发送成功")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user