libc ++ abi.dylib: завершается с необработанным исключением типа NSException, React Native iOS - PullRequest
3 голосов
/ 23 декабря 2019

Описание проблемы ::

Я работаю над приложением 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

Описание среды ::

  • «реагировать-нативный»:«0.61.4»
  • «реагировать»: «16.12.0»
  • «реагировать-навигация»: «3.5.1"
  • "реагировать-native-splash-screen ":" 3.2.0 "

  • xcode: 11.2.1

1 Ответ

2 голосов
/ 26 декабря 2019

Из сообщения о сбое кажется, что вы забыли установить контроллер корневого представления для текущего окна.

Также, как вы упомянули, хорошо, если он перенаправляет на страницу входа. Проверяя код, я увидел, что setRootScreen(AUTH, INITIAL_SCREEN) вызывается только тогда, когда пользователю необходимо войти в систему. Я предполагаю, что вам может потребоваться установить корневой экран после успешного входа пользователя в систему?

Если это не сработает, то вам следует проверить, как вы перенаправляете на контроллер заставки. Встроено ли собственное представление реагирования в другой контроллер представления? Возможно, нам потребуется увидеть здесь ваш собственный код для устранения неполадок, если он не работает.

Вы можете обратиться к этой статье , чтобы узнать больше о связи.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...