React Native升级后Xcode编译报错:Cannot find type 'Module' in scope
解决React Native升级后Xcode编译错误及AppDelegate适配方案
一、修复KeepAwakeModule「Cannot find type 'Module' in scope」错误
React Native升级后,原生模块的协议定义已变更,旧版Module类型已被移除,按以下步骤修改即可解决:
- 更新模块继承与协议:打开
KeepAwakeModule文件(.m或.mm),将类声明从
修改为兼容新版RN的标准写法:class KeepAwakeModule: Module@interface KeepAwakeModule : NSObject <RCTBridgeModule> @end - 补全必要头文件与宏:确保文件顶部导入RN桥接模块头文件,并添加模块导出宏:
#import <React/RCTBridgeModule.h> @implementation KeepAwakeModule RCT_EXPORT_MODULE() // 必须添加此宏标记为RN原生模块 // 保留原有的KeepAwake业务方法,示例: RCT_EXPORT_METHOD(activate) { // 你的唤醒逻辑 } RCT_EXPORT_METHOD(deactivate) { // 你的休眠逻辑 } @end - 排查依赖来源:如果KeepAwake是第三方依赖,直接升级该库到兼容当前RN版本的最新版;若为自定义模块,按上述修改后重新编译。
二、适配AppDelegate从.m到.mm的变更
新版RN默认使用.mm扩展名(Objective-C++)以支持Fabric架构等C++依赖,适配步骤如下:
- 修改文件扩展名:将原
AppDelegate.m重命名为AppDelegate.mm,在Xcode项目中移除旧文件、添加新的.mm文件(避免引用失效)。 - 更新初始化逻辑:替换旧版RN初始化代码为新版标准流程,示例如下:
#import "AppDelegate.h" #import <React/RCTAppSetupUtils.h> #import <React/RCTBridge.h> #import <React/RCTRootView.h> #import <UIKit/UIKit.h> @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 新版RN初始化前置操作 RCTAppSetupPrepareApp(application, launchOptions); RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"YourAppName" initialProperties:nil]; rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIViewController *rootViewController = [UIViewController new]; rootViewController.view = rootView; self.window.rootViewController = rootViewController; [self.window makeKeyAndVisible]; return YES; } // 若启用Fabric架构,需添加以下方法 - (NSArray<id<RCTBridgeModule>> *)extraModulesForBridge:(RCTBridge *)bridge { return RCTAppSetupDefaultExtraModules(bridge); } @end - 验证项目配置:选中Xcode中的
AppDelegate.mm,检查右侧「Identity and Type」里的「File Type」是否为「Objective-C++ Source」,若不是手动修改。
三、通用排查与收尾步骤
- 清理Xcode缓存:执行
Cmd+Shift+K清理构建,再执行Cmd+Option+Shift+K清理派生数据。 - 重新安装依赖:项目根目录执行
yarn install,进入ios目录执行pod install --repo-update。 - 确认版本一致性:检查
package.json的react-native版本与ios/Podfile.lock中React相关依赖版本是否完全匹配,有差异则重新执行pod install。
内容的提问来源于stack exchange,提问作者Bromox
相关产品推荐
相关产品推荐

