【问题标题】:How to migrate to Xcode 12.5如何迁移到 Xcode 12.5
【发布时间】:2021-07-21 02:07:13
【问题描述】:

我无法使用 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> *'

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

- IPHONEOS_DEPLOYMENT_TARGET = 9.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 12.1;

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

+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;

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

$ 反应原生信息 info 获取系统和图书馆信息... 系统: 操作系统:macOS 11.3 CPU:(4) x64 Intel(R) Core(TM) i3-8100B CPU @ 3.60GHz 内存:256.45 MB / 8.00 GB 外壳: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 守望者:4.9.0 - /usr/local/bin/watchman 开发工具包: 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: 反应:^16.11.0 => 16.12.0 反应原生:0.61.4 => 0.61.4 npmGlobalPackages: react-native-cli: 2.0.1

【问题讨论】:

  • 在这一点上,似乎最好的答案可能是升级 React Native,但即便如此,这条路径也可能会带来不幸的后果。升级 RN 意味着不必使用查找和替换的解决方案,但我现在有不同的构建错误。

标签: ios reactjs xcode react-native


【解决方案1】:

我通过更改 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

【讨论】:

  • 我已经编辑了上面的回复,让我相信修复,而不是说我在 Xcode 12.5 上遇到了同样的问题。
  • 使用此修复程序后,所有旧错误均已删除,但在 RCTTurboModuleManager.mm 的第 300 行出现了一个错误 NSArray&lt;id&lt;RCTBridgeModule&gt;&gt;
  • @haleonj,请参考这个github.com/facebook/react-native/issues/…。您还必须将 RCTBridgeModuleNameForClass(module)) 更改为 RCTBridgeModuleNameForClass(Class(module)))
  • 您能否添加“您也必须将 RCTBridgeModuleNameForClass(module)) 更改为 RCTBridgeModuleNameForClass(Class(module)))”?我想在答案完成后标记答案。
  • 为我工作以及运行 RN 60.6
【解决方案2】:

这个对我有用。

  1. 打开 RCTCxxBridge.mm(第 770 行)并将参数类型从:(NSArray&lt;id&lt;RCTBridgeModule&gt;&gt; *)modules 更改为 (NSArray&lt;Class&gt; *)modules
  2. 打开 RCTTurboModuleManager.mm(第 300 行)并从以下位置更改: RCTBridgeModuleNameForClass(module))RCTBridgeModuleNameForClass(Class(module)));

【讨论】:

  • 谢谢。这个对我有用
【解决方案3】:

这个对我有用。更新 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 问题报告:github.com/facebook/react-native/issues/…
【解决方案4】:

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

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

修复 XCode 12.5 测试版

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.第二个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 的末尾定义。
【解决方案5】:

在 Xcode 中打开您的项目,然后转到 File > Workspace settings > Build System > Legacy Build System

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    相关资源
    最近更新 更多