React Native升级Xcode14.1后调用iOS库函数报unrecognized selector错误
解决React Native 0.66.4升级Xcode14.1后iOS端
unrecognized selector sent to instance错误 针对你遇到的问题,核心原因是运行时某个对象收到了无法识别的方法调用,结合代码和环境变化,从以下几个方向排查解决:
1. 修正React Native Promise桥接的参数命名错误
你的OC桥接方法里,Promise的拒绝回调参数用了rejecter,但React Native的标准桥接命名是reject,这个命名不匹配会导致JS端调用时找不到正确的方法选择器,是最可能的问题。
修改代码中的参数名:
RCT_EXPORT_METHOD(getCardToken:(NSString *)cardNumber expirationDate:(NSString *)expirationDate CVV:(NSString *)CVV resolve: (RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject) { BMSCardInfo *card = [BMSCardInfo new]; card.cardNumber = cardNumber; card.expirationDate = expirationDate; card.CVV = CVV; [[BMSAPI instance] generateAccountForCard:card completion:^(BMSAccount *account, NSError *error){ if (account) { resolve(account.token); } else { reject(@"error", error.localizedDescription, error); } }]; }
2. 检查第三方SDK的API兼容性
升级iOS16后,第三方SDK可能存在API变更:
- 确认
BMSCardInfo的属性名是否正确,比如CVV是否在新版本中改为小写cvv,iOS16对KVC的属性匹配更严格; - 验证
[BMSAPI instance]单例获取方式是否有效,部分SDK会将单例方法从instance改为sharedInstance; - 核对
generateAccountForCard:completion:的方法签名,包括block的参数类型、数量是否与SDK文档一致。
3. 适配Xcode14的编译架构要求
Xcode14默认移除了对32位架构的支持:
- 检查第三方SDK是否包含
arm64(真机)和x86_64(模拟器)架构,若SDK仅提供32位版本,需更换为适配64位的SDK; - 调整项目
Build Settings:- 将
Architectures设置为$(ARCHS_STANDARD); - 确保
Valid Architectures只保留64位架构(arm64、x86_64)。
- 将
4. 排查链接与符号剥离问题
- 确认项目
Link Binary With Libraries中已正确添加第三方SDK的库文件; - 临时关闭
Build Settings中的Dead Code Stripping选项,避免SDK中的方法符号被错误剥离; - 检查OC文件是否正确导入了SDK的头文件(
#import "BMSCardInfo.h"、#import "BMSAPI.h")。
最后执行清理操作:删除Xcode的DerivedData文件夹,Command+Shift+K清理项目,重新编译运行。
内容的提问来源于stack exchange,提问作者Shubham Bisht
相关产品推荐
相关产品推荐

