升级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后 | 否 |
此问题已于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 失败
报错如下图
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