React Native 0.77+ 如何在Swift版AppDelegate中集成react-native-health
别发愁,我之前在RN 0.78的项目里刚搞定过一模一样的问题,刚好适配你的RN 0.77+ Swift AppDelegate场景,一步步来就行:
先确认你已经搞定了这些前置操作,避免踩不必要的坑:
- 已经通过CocoaPods安装好react-native-health,并且执行过
pod install - 在Xcode的「Signing & Capabilities」里给项目添加了HealthKit能力
- Info.plist里已经配置了HealthKit的使用描述(比如
NSHealthShareUsageDescription和NSHealthUpdateUsageDescription) - 项目的桥接文件(比如
YourApp-Bridging-Header.h)里已经添加了#import "RCTAppleHealthKit.h"
接下来分两种常见场景给你代码方案:
场景1:你的AppDelegate继承自默认的RCTAppDelegate
这是RN 0.77+最常用的配置,修改起来超简单:
import UIKit import React class AppDelegate: RCTAppDelegate { override func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { self.moduleName = "你的App名称" self.initialProps = [:] // 一定要先调用super的初始化方法,确保bridge实例已经被创建 super.application(application, didFinishLaunchingWithOptions: launchOptions) // 初始化HealthKit后台观察者 let healthKitManager = RCTAppleHealthKit() healthKitManager.initializeBackgroundObservers(self.bridge) return true } }
这里的关键是必须在调用super之后再初始化HealthKit,因为super的方法会帮你完成bridge的创建,此时self.bridge才会有有效实例。
场景2:你使用了自定义的RCTReactNativeFactory
如果你的项目自定义了factory来管理RN模块,那需要手动保存bridge实例,再进行初始化:
首先,在AppDelegate里加一个属性来存bridge实例:
class AppDelegate: UIResponder, UIApplicationDelegate, RCTBridgeDelegate { // 用来保存自定义创建的bridge实例 private var customBridge: RCTBridge? // ...你的其他已有代码
然后重写createBridge方法,创建bridge的时候把它存起来:
override func createBridge(withDelegate delegate: RCTBridgeDelegate, launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> RCTBridge { let factory = RCTReactNativeFactory() // 这里可以加你的factory自定义配置,比如注册自定义模块 let bridge = RCTBridge(delegate: delegate, launchOptions: launchOptions, moduleProvider: factory) // 把bridge实例存到属性里 self.customBridge = bridge return bridge }
最后在didFinishLaunchingWithOptions里初始化HealthKit:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { // ...你的其他初始化代码 // 确保bridge实例已经创建成功 guard let bridge = self.customBridge else { print("出错了:没找到RCTBridge实例") return true } // 初始化HealthKit后台观察者 let healthKitManager = RCTAppleHealthKit() healthKitManager.initializeBackgroundObservers(bridge) return true }
针对你的问题逐一解答:
如何在Swift AppDelegate中初始化后台观察者:
就是上面两种场景里的代码,创建RCTAppleHealthKit实例,调用initializeBackgroundObservers(_:)方法传入有效的RCTBridge实例就行,本质上和OC版本的逻辑完全一致,只是转成了Swift语法。如何从自定义factory拿到bridge实例:
在重写createBridge(withDelegate:launchOptions:)方法创建bridge的时候,把实例保存到AppDelegate的一个属性里,之后在需要的地方直接访问这个属性就可以了。RN 0.77+是否需要特殊处理:
核心逻辑和旧版本没差,只是RN 0.77+默认用Swift AppDelegate,所以要确保桥接文件配置正确,另外如果是用了新架构(Fabric)的话可能需要额外配置,但如果是旧架构,上面的代码完全能用。而且RN 0.77+的RCTAppDelegate已经封装了bridge的创建,继承默认的话直接用self.bridge就能拿到实例,不用手动创建。
如果遇到编译错误,记得检查桥接文件的路径是否在Xcode的Build Settings里正确配置了(找Swift Compiler - General里的Objective-C Bridging Header选项)。
内容来源于stack exchange

