如何迁移到 Xcode 12.5

hal*_*onj 20 xcode ios reactjs react-native

我无法使用 Xcode 12.5 构建使用 Xcode 11 正确构建的 React Native 项目。

我不能再使用 Xcode 11,因为只有更新的 Xcode 版本才带有必要的 API 来发布/上传到 TestFlight 和应用商店。

现在我收到三个构建错误:

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> *'
Run Code Online (Sandbox Code Playgroud)

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

- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.1;
Run Code Online (Sandbox Code Playgroud)

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

+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
Run Code Online (Sandbox Code Playgroud)

如何配置项目以使用 Xcode 12.5 部署此应用程序?

$ react-native info info Fetching system and libraries information... 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 二进制文件:节点:10.16.0 - /usr/local/bin/node 纱线:1.21.1 - ~/npm-global/bin/yarn npm:6.9.0 - /usr/local/ bin/npm Watchman:4.9.0 - /usr/local/bin/watchman SDK:iOS SDK:平台:iOS 14.5、DriverKit 20.4、macOS 11.3、tvOS 14.5、watchOS 7.4 IDE: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

Dan*_*lin 32

我通过更改 React 模块 RCTCxxBridge.mm 中的参数来解决这个问题,如下所示:

- (NSArray<RCTModuleData *> *)_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules
                               withDispatchGroup:(dispatch_group_t)dispatchGroup
                                lazilyDiscovered:(BOOL)lazilyDiscovered
Run Code Online (Sandbox Code Playgroud)

到:

- (NSArray<RCTModuleData *> *)_initializeModules:(NSArray<Class> *)modules
                               withDispatchGroup:(dispatch_group_t)dispatchGroup
                                lazilyDiscovered:(BOOL)lazilyDiscovered
Run Code Online (Sandbox Code Playgroud)

我正在运行 0.59 并且没有使用 CocoaPods,但基本的修复是以下形式的转换:

NSArray<id<RCTBridgeModule>> *)modules
Run Code Online (Sandbox Code Playgroud)

应替换为:

NSArray<Class> *)modules
Run Code Online (Sandbox Code Playgroud)

  • 我编辑了上面的回复,表示我相信修复,而不是说我在 Xcode 12.5 上遇到了同样的问题。 (3认同)
  • @haleonj,请参阅此https://github.com/facebook/react-native/issues/28405#issuecomment-827424477。您还必须将 RCTBridgeModuleNameForClass(module)) 更改为 RCTBridgeModuleNameForClass(Class(module))) (3认同)
  • 您能否添加“您还必须将 RCTBridgeModuleNameForClass(module)) 更改为 RCTBridgeModuleNameForClass(Class(module))) ”?我想在完成后标记答案。 (3认同)
  • 使用此修复后,所有旧错误都将被删除,但在“RCTTurboModuleManager.mm”的第 300 行出现一个错误,即“NSArray&lt;id&lt;RCTBridgeModule&gt;&gt;”。 (2认同)

Tùn*_* Lê 14

这个对我有用。

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


Bog*_*yak 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
Run Code Online (Sandbox Code Playgroud)

并在 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
Run Code Online (Sandbox Code Playgroud)

最后一步如果要运行:

pod install
Run Code Online (Sandbox Code Playgroud)


小智 7

我遇到了同样的问题,使用此脚本后,这三个错误的问题得到了解决,但遇到了一个新的错误(没有调用“RCTBridgeModuleNameForClass”的匹配函数)

通过在安装后脚本中添加此行解决了这个问题

修复 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
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,只是关于我必须做什么才能使其工作的评论: 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` 的末尾。 (2认同)