feat(background): 增强iOS后台任务系统,添加processing任务类型支持
- 添加新的processing任务标识符到iOS配置文件 - 重构BackgroundTaskBridge支持不同任务类型(refresh/processing) - 增强后台任务日志记录和调试信息 - 修复任务类型配置不匹配问题 - 改进任务调度逻辑和错误处理机制 - 添加任务执行时间戳记录用于调试 - 移除notification-settings中未使用的AuthGuard依赖
This commit is contained in:
@@ -63,12 +63,25 @@ public class AppDelegate: ExpoAppDelegate {
|
||||
forTaskWithIdentifier: identifier,
|
||||
using: nil
|
||||
) { [weak self] task in
|
||||
NSLog("[AppDelegate] ✅ 后台任务被系统触发: \(identifier)")
|
||||
// 尝试通知 BackgroundTaskBridge 处理任务
|
||||
// 如果 bridge 不可用,标记任务完成
|
||||
self?.handleBackgroundTask(task, identifier: identifier)
|
||||
}
|
||||
|
||||
NSLog("[AppDelegate] 后台任务已在应用启动时注册: \(identifier)")
|
||||
|
||||
// 额外注册 processing 类型的任务(如果需要)
|
||||
let processingIdentifier = "com.anonymous.digitalpilates.processing"
|
||||
BGTaskScheduler.shared.register(
|
||||
forTaskWithIdentifier: processingIdentifier,
|
||||
using: nil
|
||||
) { [weak self] task in
|
||||
NSLog("[AppDelegate] ✅ Processing 后台任务被系统触发: \(processingIdentifier)")
|
||||
self?.handleBackgroundTask(task, identifier: processingIdentifier)
|
||||
}
|
||||
|
||||
NSLog("[AppDelegate] Processing 后台任务已注册: \(processingIdentifier)")
|
||||
}
|
||||
|
||||
@available(iOS 13.0, *)
|
||||
@@ -76,11 +89,22 @@ public class AppDelegate: ExpoAppDelegate {
|
||||
NSLog("[AppDelegate] ====== 后台任务被触发 ======")
|
||||
NSLog("[AppDelegate] 任务标识符: \(identifier)")
|
||||
NSLog("[AppDelegate] 任务类型: \(type(of: task))")
|
||||
NSLog("[AppDelegate] 触发时间: \(Date().description)")
|
||||
|
||||
// 记录任务开始
|
||||
let defaults = UserDefaults.standard
|
||||
defaults.set(Date().timeIntervalSince1970, forKey: "last_background_task_trigger")
|
||||
NSLog("[AppDelegate] 已记录任务触发时间到UserDefaults")
|
||||
|
||||
// 设置任务过期处理器(iOS 给的执行时间有限,通常30秒)
|
||||
task.expirationHandler = {
|
||||
task.expirationHandler = { [weak self] in
|
||||
NSLog("[AppDelegate] ⚠️ 后台任务即将过期,强制完成")
|
||||
task.setTaskCompleted(success: false)
|
||||
|
||||
// 确保重新调度下一次任务
|
||||
if let strongSelf = self {
|
||||
strongSelf.scheduleNextBackgroundTask(identifier: identifier)
|
||||
}
|
||||
}
|
||||
|
||||
// 尝试获取 BackgroundTaskBridge 实例来处理任务
|
||||
@@ -117,7 +141,9 @@ public class AppDelegate: ExpoAppDelegate {
|
||||
|
||||
@available(iOS 13.0, *)
|
||||
private func executeBasicBackgroundMaintenance(task: BGTask, identifier: String) {
|
||||
NSLog("[AppDelegate] 执行基本后台维护任务")
|
||||
NSLog("[AppDelegate] ===== 执行基本后台维护任务 =====")
|
||||
NSLog("[AppDelegate] 标识符: \(identifier)")
|
||||
NSLog("[AppDelegate] 开始时间: \(Date().description)")
|
||||
|
||||
// 在后台线程执行基本维护
|
||||
DispatchQueue.global(qos: .background).async {
|
||||
@@ -139,9 +165,28 @@ public class AppDelegate: ExpoAppDelegate {
|
||||
|
||||
@available(iOS 13.0, *)
|
||||
private func scheduleNextBackgroundTask(identifier: String) {
|
||||
let request = BGAppRefreshTaskRequest(identifier: identifier)
|
||||
// 设置最早开始时间(15分钟后)
|
||||
request.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
|
||||
NSLog("[AppDelegate] ===== 调度下一次后台任务 =====")
|
||||
NSLog("[AppDelegate] 标识符: \(identifier)")
|
||||
|
||||
let request: BGTaskRequest
|
||||
if identifier.contains("processing") {
|
||||
request = BGProcessingTaskRequest(identifier: identifier)
|
||||
if let processingRequest = request as? BGProcessingTaskRequest {
|
||||
processingRequest.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
|
||||
processingRequest.requiresNetworkConnectivity = false
|
||||
processingRequest.requiresExternalPower = false
|
||||
}
|
||||
} else {
|
||||
request = BGAppRefreshTaskRequest(identifier: identifier)
|
||||
if let appRefreshRequest = request as? BGAppRefreshTaskRequest {
|
||||
appRefreshRequest.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
|
||||
}
|
||||
}
|
||||
|
||||
let formatter = DateFormatter()
|
||||
formatter.dateFormat = "HH:mm:ss"
|
||||
let scheduledTime = formatter.string(from: Date(timeIntervalSinceNow: 15 * 60))
|
||||
NSLog("[AppDelegate] 计划执行时间: \(scheduledTime)")
|
||||
|
||||
do {
|
||||
try BGTaskScheduler.shared.submit(request)
|
||||
|
||||
Reference in New Issue
Block a user