Описание проблемы ::
Я работаю над приложением Reaction-native-IOS, в большинстве случаев оно зависает после заставки. Я создал дубликат заставки внутри моего собственного кода реакции. Когда приложение запускается, я перенаправляю его на пустую заставку, которая в точности похожа на заставку. Здесь я загружаю полные необходимые данные приложения из API. После загрузки полных данных я нажимаю на начальный экран. Но большую часть времени я застревал после заставки или иногда зависал после загрузки заставки (при переходе от первоначальной заставки к пустому заставке, где я загружаю все данные, необходимые для приложения).
В терминале нет ошибки,Я получаю следующую упомянутую ошибку в окне вывода xcode, всякий раз, когда мое приложение падает или приложение застревает на заставке.
Ошибка ::
Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Ожидается, что окна приложений будут иметь корневой контроллер представления в конце запуска приложения»
libc ++ abi.dylib: завершается с невостребованным исключением типа NSException
Мое приложение iOS работает нормально, если я перенаправляю на экран входа в систему, но возникает проблема всякий раз, когда я перенаправляю на фиктивный всплеск. Я также изменил свое фиктивное экранное имя на «initializer.js», но ничего не произошло. Приложение iOS зависло или зависло после заставки, оно перенаправило его на экран, на котором я загружаю полные необходимые данные для приложения.
Код экрана инициализатора приложения (пустая заставка) ::
/**
* Splash Screen
*/
import React, { useEffect } from 'react';
import { connect } from 'react-redux';
import * as Animatable from 'react-native-animatable';
import { View, Text } from 'react-native';
import { Spinner } from 'native-base';
import Toast from 'react-native-simple-toast';
import NetInfo from '@react-native-community/netinfo';
import SplashScreen from 'react-native-splash-screen';
import AsyncStorage from '@react-native-community/async-storage';
//Global Components
import { ImageView } from '../../Components/GlobalComponent';
//Form Components
import { Button } from '../../Components/FormComponent';
// APIResponseMessages
import APIResponseMessages from '../../Constants/APIResponseMessages';
// Actions
import { appInitialize, loader } from '../../Actions';
//Style
import { GlobalStyles, Colors } from '../../Styles';
//Images
import Images from '../../Assets/Images';
//Navigation Screen
import { AUTH, INITIAL_SCREEN, setRootScreen } from '../../Navigation';
import LocalStorageKeys from '../../Constants/LocalStorageKeys';
// singleton class
import APIURLServiceSingleton from '../../Services/APIURLService';
// Strings
import { en } from '../../Strings';
//Base Controller
import BaseController from '../BaseController';
const { overlayContainer, flex1, w100, mb30, h100, justifyContentCenter, alignItemsCenter, mb20, px20, px10, textWhite, textCenter } = GlobalStyles;
class Splash extends BaseController {
state = {
showTryButton: false,
};
isConnected = false;
/*
* lifecycle method called when component mount
*/
componentDidMount() {
NetInfo.isConnected.addEventListener('connectionChange', this._handleConnectionChange);
// hide splash screen
setTimeout(() => {
SplashScreen.hide();
NetInfo.isConnected.fetch().done((isConnected) => {
this._handleConnectionChange(isConnected);
this.initializeApp();
});
}, 1000);
}
/**
* Function to initialize Application
*/
async initializeApp() {
if (this.isConnected) {
let currentUser = await AsyncStorage.getItem(LocalStorageKeys.CURRENT_USER);
let currentBusiness = await AsyncStorage.getItem(LocalStorageKeys.CURRENT_BUSINESS);
if (currentUser) {
await APIURLServiceSingleton.getInstance().saveUser(JSON.parse(currentUser));
await APIURLServiceSingleton.getInstance().saveCustmrBusiness(currentBusiness);
await this.props.appInitialize(JSON.stringify(currentUser));
} else {
await setRootScreen(AUTH, INITIAL_SCREEN);
}
} else {
Toast.showWithGravity('Please check your internet connection and try again.', Toast.LONG, Toast.CENTER);
}
}
/*
* lifecycle method called when component unmount
*/
componentWillUnmount() {
NetInfo.isConnected.removeEventListener('connectionChange', this._handleConnectionChange);
}
/**
* Function to handle connection change
*/
_handleConnectionChange = (isConnected) => {
if (isConnected) {
this.isConnected = isConnected;
} else {
this.isConnected = isConnected;
this.setState({ showTryButton: true });
}
};
/**
* Function called on try again
*/
async onTryAgain() {
if (this.isConnected) {
this.setState({ showTryButton: false });
}
await this.initializeApp();
}
// render method
render() {
const { showTryButton } = this.state;
const { serverError } = this.props;
return (
<View style={[flex1]}>
<ImageView style={[overlayContainer, w100, h100]} resizeMode="cover" source={Images.splash} />
<View style={[flex1, justifyContentCenter, alignItemsCenter]}>
<ImageView animation="fadeInDown" style={[mb30]} source={Images.appLogoLight} />
<Animatable.View animation="fadeInUp">
<Spinner color={Colors.white} />
</Animatable.View>
{(showTryButton || serverError) &&
<View style={[mb20, px20]}>
<Text style={[textWhite, textCenter, mb20, px10]}>
{this.props.serverError ? APIResponseMessages.SERVER_TIMEOUT : APIResponseMessages.COULD_NOT_CONNECT_TO_THE_NETWORK}
</Text>
<Button large block onPress={this.onTryAgain.bind(this)}>{en.tryAgain}</Button>
</View>
}
</View>
</View>
);
}
}
// map state to props
const mapStateToProps = ({ AppInitializer, Common }) => {
// const { showLoading } = Common;
const { serverError } = AppInitializer;
return { serverError };
};
export default connect(mapStateToProps, { appInitialize, loader })(Splash);
Мой файл AppDelegate.m ::
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#import "AppDelegate.h"
#import <React/RCTBridge.h>
#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>
#import <ReactNativeNavigation/ReactNativeNavigation.h>
#import "RNSplashScreen.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSURL *jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];
[ReactNativeNavigation bootstrap:jsCodeLocation launchOptions:launchOptions];
[RNSplashScreen show];
return YES;
}
@end
Описание среды ::