react-native

React Native 在 Xcode升级后出现的问题

2021-06-07  本文已影响0人  AricWu

升级Xcode 版本后,RN经常会出现一些问题,一般升级RN版本就能解决,如果不能或不想升级版本就需要修改本地一些代码来解决

升级Xcode 12后 Image 不显示

此问题出现在Xcode升级到12.0及以后版本,Release 版本会不显示图片资源,具体复现如下

Xcode版本 iPhone版本 是否显示图片
12.0前 14.0前
12.0后 14.0前
12.0前 14.0后
12.0后 14.0后

github issue 链接

此问题已于0.63.4版本后官方修复
如不想升级,则要修改react-native/Libraries/Image/RCTUIImageViewAnimated.m中的如下方法

 - (void)displayLayer:(CALayer *)layer 
 { 
   if (_currentFrame) { 
     layer.contentsScale = self.animatedImageScale; 
     layer.contents = (__bridge id)_currentFrame.CGImage; 
   } 
 } 

修改成

 - (void)displayLayer:(CALayer *)layer 
 { 
 if (_currentFrame) {
    layer.contentsScale = self.animatedImageScale;
    layer.contents = (__bridge id)_currentFrame.CGImage;
  } else {
    [super displayLayer:layer];
  }
 } 

Xcode 升级12.5后build 失败

报错如下图

xcode升级12.5后报错

github issue 链接
升级最新版本的React native已经修复了此问题。

不升级的解决办法
主要是修改两个文件
1.node_modules/react-native/React/CxxBridge/RCTCxxBridge.mm文件下替换_initializeModules:(NSArray<id<RCTBridgeModule>> *)modules_initializeModules:(NSArray<Class> *)modules

2.node_modules/react-native/ReactCommon/turbomodule/core/platform/ios/RCTTurboModuleManager.mm文件下替换RCTBridgeModuleNameForClass(module))RCTBridgeModuleNameForClass(Class(module)))

快速解决办法为在podfile文件的底部加入以下代码

post_install do |installer|
    ## Fix for XCode 12.5
    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

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后自动替换文件中的字符串,不需要手动改动,并可提交git
参考Blog

上一篇下一篇

猜你喜欢

热点阅读