iOS端RN0.66.4使用azure-blob-storage报_Bool与数组越界错误
React Native iOS端react-native-azure-blob-storage报错修复方案
运行环境
- 平台:iOS
- React Native版本:
0.66.4 - 依赖版本:
react-native-azure-blob-storage@^2.0.3
报错信息
- 方法
-[EAzureBlobStorageFile configure:key:container:token:]存在未知参数类型_Bool,提示需扩展RCTConvert以支持该类型 - 调用EAzureBlobStorageFile的configure方法传递参数时,抛出异常:
*** -[__NSArrayM objectAtIndexedSubscript:]: index 3 beyond bounds [0 .. 2]
已验证通用修复方案(新增
RCTReadString(input, "__attribute__((__unused__))") ||逻辑)无效,当前使用的依赖版本已合入该修复。
问题原因
React Native 0.66及以上版本调整了原生模块方法参数的宏解析规则,react-native-azure-blob-storage 2.0.3版本的原生代码存在两处兼容问题:
- 方法中声明的
BOOL类型参数在编译时被识别为底层类型_Bool,RN内置的RCTConvert类型解析逻辑没有覆盖_Bool别名,导致参数解析顺序错位 - 参数解析错位后,框架实际识别到的方法参数总数比真实参数少1个,调用时读取索引为3的第4个参数就会触发数组越界异常
修复步骤
- 定位依赖的iOS原生文件:如果使用CocoaPods管理依赖,打开路径
ios/Pods/Development Pods/react-native-azure-blob-storage/ios/EAzureBlobStorageFile.m;如果是手动link依赖,直接打开node_modules/react-native-azure-blob-storage/ios/EAzureBlobStorageFile.m - 找到
configure方法对应的RCT_EXPORT_METHOD导出声明,显式标注所有参数的类型,避免编译器自动类型推导,参考写法:
RCT_EXPORT_METHOD(configure:(NSString *)sasToken key:(NSString *)accessKey container:(NSString *)containerName refreshToken:(BOOL)shouldRefreshToken resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
- 在同文件的RN类型解析逻辑中,新增
_Bool类型的匹配分支,让_Bool和BOOL走相同的转换逻辑:
// 找到RCTConvert的类型判断代码块,添加以下分支 if (RCTReadString(input, "_Bool")) { return RCTBlock("BOOL", "bool"); }
- 清理编译缓存后重新编译:
- 执行
cd ios && xcodebuild clean清理Xcode编译缓存 - 若修改的是Pods下的文件,建议删除
Podfile.lock和Pods目录后重新执行pod install - 重新运行项目即可验证修复
- 执行
直接修改node_modules或Pods目录的内容会在重新安装依赖时丢失,建议使用
patch-package将修改内容生成持久化补丁,团队其他成员拉取代码后安装依赖即可自动应用修复。
内容的提问来源于stack exchange,提问作者CarlosM
相关产品推荐
相关产品推荐

