如何迁移到Xcode 12.5

31

我无法使用Xcode 12.5构建一个之前使用Xcode 11能够正确构建的React Native项目。

我不能继续使用Xcode 11,因为只有更新版本的Xcode才具备发布/上传到TestFlight和应用商店所需的API。

现在我遇到了三个构建错误:

Cannot initialize a parameter of type 'NSArray<id<RCTBridgeModule>> *' with an rvalue of type 'NSArray<Class> *'

Cannot initialize a parameter of type 'NSArray<id<RCTBridgeModule>> *' with an rvalue of type 'NSArray<Class> *'

Cannot initialize a parameter of type 'NSArray<id<RCTBridgeModule>> *' with an rvalue of type 'NSArray<Class> *'

我也注意到部署目标自动升级到了10和9:

- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.1;

新增了一些与Clang相关的属性:

+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
如何配置项目以使用Xcode 12.5部署此应用程序? $ react-native info info 正在获取系统和库信息... System: OS: macOS 11.3 CPU: (4) x64 Intel(R) Core(TM) i3-8100B CPU @ 3.60GHz Memory: 256.45 MB / 8.00 GB Shell: 3.2.57 - /bin/bash Binaries: Node: 10.16.0 - /usr/local/bin/node Yarn: 1.21.1 - ~/npm-global/bin/yarn npm: 6.9.0 - /usr/local/bin/npm Watchman: 4.9.0 - /usr/local/bin/watchman SDKs: iOS SDK: Platforms: iOS 14.5, DriverKit 20.4, macOS 11.3, tvOS 14.5, watchOS 7.4 IDEs: Xcode: 12.5/12E262 - /usr/bin/xcodebuild npmPackages: react: ^16.11.0 => 16.12.0 react-native: 0.61.4 => 0.61.4 npmGlobalPackages: react-native-cli: 2.0.1

目前看来,最好的答案似乎是升级React Native,但即使这样,该路径也可能会有不幸的后果。升级RN意味着不必使用查找和替换的解决方案,但现在我遇到了不同的构建错误。 - haleonj
6个回答

45

我通过更改React模块RCTCxxBridge.mm中的参数转换方式来修复了这个问题:

- (NSArray<RCTModuleData *> *)_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules
                               withDispatchGroup:(dispatch_group_t)dispatchGroup
                                lazilyDiscovered:(BOOL)lazilyDiscovered

收件人:

- (NSArray<RCTModuleData *> *)_initializeModules:(NSArray<Class> *)modules
                               withDispatchGroup:(dispatch_group_t)dispatchGroup
                                lazilyDiscovered:(BOOL)lazilyDiscovered

我正在使用0.59版本并未使用CocoaPods,但基本的解决方法是将以下形式的转换:

NSArray<id<RCTBridgeModule>> *)modules

应该被替换为:

NSArray<Class> *)modules

3
我已经编辑了我的先前回复,将其改为“我相信这是修复方法”,而不是说我遇到了Xcode 12.5的相同问题。 - Dan Coughlin
2
使用此修复程序后,所有旧的错误都被清除,但是在RCTTurboModuleManager.mm的第300行出现了一个错误:NSArray <id <RCTBridgeModule>> - haleonj
3
请问您能否添加一句话 "请同时将 'RCTBridgeModuleNameForClass(module))' 更改为 'RCTBridgeModuleNameForClass(Class(module)))'"?请注意保持原意不变,使翻译更加通俗易懂。完成后我会标记答案。 - haleonj
我也尝试了在运行RN 60.6时,它对我有效。 - isick

29

这个对我有用。

  1. 打开 RCTCxxBridge.mm(第770行),并将参数类型从:(NSArray<id<RCTBridgeModule>> *)modules更改为(NSArray<Class> *)modules
  2. 打开 RCTTurboModuleManager.mm(第300行),并将代码从:RCTBridgeModuleNameForClass(module))更改为RCTBridgeModuleNameForClass(Class(module)));

13

这个方法对我有效。更新PODFILE文件如下:

post_install do |installer|
    ## Fix for XCode 12.5 beta
    find_and_replace("../node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm",
    "_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules", "_initializeModules:(NSArray<Class> *)modules")
end

在 Podfile 的末尾添加一个函数:

def find_and_replace(dir, findstr, replacestr)
  Dir[dir].each do |name|
      text = File.read(name)
      replace = text.gsub(findstr,replacestr)
      if text != replace
          puts "Fix: " + name
          File.open(name, "w") { |file| file.puts replace }
          STDOUT.flush
      end
  end
  Dir[dir + '*/'].each(&method(:find_and_replace))
end

最后一步是运行:

pod install

这对我很有效。我喜欢这个答案胜过其他的,因为它不需要直接修改.mm文件,这可能会在下次运行npm install时被覆盖。相关的React Native问题报告:https://github.com/facebook/react-native/issues/31412#issuecomment-828097064 - Daniel Chesher

6

我也遇到了同样的问题,在使用这个脚本后,这三个错误问题得到了解决,但是又遇到了一个新问题 (No matching function for call to 'RCTBridgeModuleNameForClass')。

通过在 postinstall 脚本中添加这一行代码解决了该问题。

XCode 12.5 beta 的修复方法

post_install do |installer|

find_and_replace("../node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm",
"_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules", "_initializeModules:(NSArray<Class> *)modules")

find_and_replace("../node_modules/react- 
native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm",
"RCTBridgeModuleNameForClass(module))", 
"RCTBridgeModuleNameForClass(Class(module)))")

end

1
这对我有用,只是关于我必须做的事情的评论才能使它起作用:
  1. 第二个 find_and_replace 中有一个换行符,导致未正确更新 RCTTurboModuleManager.mm 文件。 使用一行代码解决了这个问题: find_and_replace("../node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm", "RCTBridgeModuleNameForClass(module))", "RCTBridgeModuleNameForClass(Class(module)))")
  2. find_and_replace 函数也需要在 Podfile 的末尾定义。
- skizzo

1

在Xcode中打开您的项目,然后转到“文件”>“工作区设置”>“构建系统”>“旧版构建系统”


1
对我没有任何作用。 - stevehs17

0

我在使用Xcode 13.1时也遇到了同样的问题。但是我通过这个方法解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接