feat(background-task): 实现iOS原生后台任务V2系统并重构锻炼通知消息模板
- 新增iOS原生BackgroundTaskBridge桥接模块,支持后台任务注册、调度和完成 - 重构BackgroundTaskManager为V2版本,集成原生iOS后台任务能力 - 在AppDelegate中注册后台任务处理器,确保应用启动时正确初始化 - 重构锻炼通知消息生成逻辑,使用配置化模板提升可维护性 - 扩展健康数据类型映射,支持更多运动项目的中文显示 - 替换原有backgroundTaskManager引用为backgroundTaskManagerV2
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import Expo
|
||||
import React
|
||||
import ReactAppDependencyProvider
|
||||
import BackgroundTasks
|
||||
|
||||
@UIApplicationMain
|
||||
public class AppDelegate: ExpoAppDelegate {
|
||||
@@ -13,6 +14,11 @@ public class AppDelegate: ExpoAppDelegate {
|
||||
_ application: UIApplication,
|
||||
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
|
||||
) -> Bool {
|
||||
// 在应用启动完成前注册后台任务
|
||||
if #available(iOS 13.0, *) {
|
||||
registerBackgroundTasks()
|
||||
}
|
||||
|
||||
let delegate = ReactNativeDelegate()
|
||||
let factory = ExpoReactNativeFactory(delegate: delegate)
|
||||
delegate.dependencyProvider = RCTAppDependencyProvider()
|
||||
@@ -31,6 +37,53 @@ public class AppDelegate: ExpoAppDelegate {
|
||||
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
|
||||
// MARK: - Background Task Registration
|
||||
|
||||
@available(iOS 13.0, *)
|
||||
private func registerBackgroundTasks() {
|
||||
let identifier = "com.anonymous.digitalpilates.task"
|
||||
|
||||
// 注册后台任务处理器
|
||||
// 必须在应用启动完成前注册,否则会崩溃
|
||||
BGTaskScheduler.shared.register(
|
||||
forTaskWithIdentifier: identifier,
|
||||
using: nil
|
||||
) { [weak self] task in
|
||||
// 尝试通知 BackgroundTaskBridge 处理任务
|
||||
// 如果 bridge 不可用,标记任务完成
|
||||
self?.handleBackgroundTask(task, identifier: identifier)
|
||||
}
|
||||
|
||||
NSLog("[AppDelegate] 后台任务已在应用启动时注册: \(identifier)")
|
||||
}
|
||||
|
||||
@available(iOS 13.0, *)
|
||||
private func handleBackgroundTask(_ task: BGTask, identifier: String) {
|
||||
// 尝试获取 BackgroundTaskBridge 实例来处理任务
|
||||
// 如果 React Native bridge 还未初始化,则直接完成任务
|
||||
guard let bridge = reactNativeFactory?.bridge,
|
||||
bridge.isValid else {
|
||||
NSLog("[AppDelegate] React Native bridge 未就绪,直接完成后台任务")
|
||||
task.setTaskCompleted(success: false)
|
||||
return
|
||||
}
|
||||
|
||||
// 通过 bridge 查找 BackgroundTaskBridge 模块
|
||||
DispatchQueue.main.async {
|
||||
if let module = bridge.module(for: BackgroundTaskBridge.self) as? BackgroundTaskBridge {
|
||||
// 通知 BackgroundTaskBridge 处理任务
|
||||
NotificationCenter.default.post(
|
||||
name: NSNotification.Name("BackgroundTaskBridge.handleTask"),
|
||||
object: nil,
|
||||
userInfo: ["task": task, "identifier": identifier]
|
||||
)
|
||||
} else {
|
||||
NSLog("[AppDelegate] BackgroundTaskBridge 模块未找到,完成后台任务")
|
||||
task.setTaskCompleted(success: false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Linking API
|
||||
public override func application(
|
||||
|
||||
Reference in New Issue
Block a user