美文网首页react-native
React Native 在 Xcode升级后出现的问题

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

作者: AricWu | 来源:发表于2021-06-07 15:32 被阅读0次

    升级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

    相关文章

      网友评论

        本文标题:React Native 在 Xcode升级后出现的问题

        本文链接:https://www.haomeiwen.com/subject/yvvleltx.html