iOS RCTStatusBarManager红屏警告 处理报告
2019-05-08 本文已影响0人
null_2562
项目在开发阶段一路东风,集成后出了问题,iOS红屏警告,如下图
![](https://img.haomeiwen.com/i11274297/226a772a235b4328.png)
网络给出的结论是:
引用(dangxy丶)界面,侵删给出的解决方法是修改info.plist文件
在info.plist中,add row
添加View controller-based status bar appearance
并设置为NO
即可。改个配置而已,分分钟的事
![](https://img.haomeiwen.com/i11274297/a8eda81438a1fa4e.jpg)
重点来了,由于要修改原生配置,我们经理不允许
无奈我们只能找出 引用RCTStatusBarManager的地方,屏蔽删除
看iOS源码 我们找到支撑RN的原生类RCTStatusBarManager
![](https://img.haomeiwen.com/i11274297/fbc00396d79f35f5.png)
为什么会红屏?
![](https://img.haomeiwen.com/i11274297/624f87f27d9615d1.png)
![](https://img.haomeiwen.com/i11274297/6a5cc5552b9f5b78.png)
现在我们有两种改法,
原生改法
修改 RCTViewControllerBasedStatusBarAppearance
方法,改动如下
static BOOL RCTViewControllerBasedStatusBarAppearance()
{
static BOOL value;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
value = [[[NSBundle mainBundle] objectForInfoDictionaryKey:
@"UIViewControllerBasedStatusBarAppearance"] ?: @YES boolValue];
});
return false;
}
或,屏蔽RCTLogError 眼不见心不烦
RCT_EXPORT_METHOD(setStyle:(UIStatusBarStyle)statusBarStyle
animated:(BOOL)animated)
{
if (RCTViewControllerBasedStatusBarAppearance()) {
//RCTLogError(@"RCTStatusBarManager module requires that the \
UIViewControllerBasedStatusBarAppearance key in the Info.plist is set to NO");
} else {
[RCTSharedApplication() setStatusBarStyle:statusBarStyle
animated:animated];
}
}
RCT_EXPORT_METHOD(setHidden:(BOOL)hidden
withAnimation:(UIStatusBarAnimation)animation)
{
if (RCTViewControllerBasedStatusBarAppearance()) {
//RCTLogError(@"RCTStatusBarManager module requires that the \
UIViewControllerBasedStatusBarAppearance key in the Info.plist is set to NO");
} else {
[RCTSharedApplication() setStatusBarHidden:hidden
withAnimation:animation];
}
}
简单粗暴从此告别statusbar引起的红屏
![](https://img.haomeiwen.com/i11274297/ee1205eb4f751213.gif)
找到RN的包
从源码上看,当StatusBar调用隐藏或者style时会红屏,所以请区分对待
getStatusBarFromPlatform = () => {
switch (Platform.OS) {
case 'ios':
return <View></View>
case 'android':
return <StatusBar backgroundColor={statusBarColor} translucent={true} barStyle={statusBarStyle} animated={animated} hidden={statusBarHidden} />
}
}