приложение React native работает в режиме отладки, но не работает в режиме выпуска на ios

У меня есть приложение для реагирования на родной язык. Режим отладки работает на ios. Но Release mode не работает. Я попытался изменить уровень оптимизации, но это не помогло. Проблема в том, что я не вижу ошибок. Просто не работает какой-то функционал. И я не могу отладить релизную версию приложения. Как решить эту проблему?

В качестве последнего изменения мы добавили следующую сагу, когда мы убираем вызов этой саги, она работает

import { select, take, takeLatest, call, put, fork, race } from 'redux-saga/effects';
import R from 'ramda';
import V from 'o-validator';
import * as actionCreators from './actions';
import { redirectTo, showModalError, showModal, showOtp, closeOtp, errorOtp, loader, keychainSet } from '../../../actions/app-actions';
import { storeSession, refreshSession } from '../../../actions/session-actions';
import I18n from 'react-native-i18n';
import {
  KEYCHAIN_RESET,
  KEYCHAIN_GET,
  KEYCHAIN_RESULT
} from '../../../constants/action-types';


import { validatePassword, createCustomError, serverError } from '../../../services/utils';

const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms))


export function * ChangePasswordWatcher( api, action ) {
        yield fork( ChangePasswordFormWatcher, api, action );
}

export function * ChangePasswordFormWatcher(api, action){
  while (true) {
    yield race({
      changePasswordProcess: call(ChangePasswordStart, api),
      cancel: take(['CHANGE_PASSWORD_PASSWORD_RESET'])
    });
    //yield put( loader('hide') );
        yield put( loader('hide') );


  }
}




/**
 * Change Password Sagas starter
 *
 * @param {function} api - api object
 * @param {object} action - action from dispatch
 * @returns
 */
export function * ChangePasswordStart(api, action) {
    try {
            while (true) {
                const { formData } = yield take('CHANGE_PASSWORD_FORM_SUBMIT');
                                let oldPassword = formData.oldPassword;
                                let newPassword = formData.newPassword;
                                let newPasswordConfirmation = formData.newPasswordConfirmation;


                                yield put({
                                type: 'CHANGE_PASSWORD_FORM_VALID'
                              });

                                const validate = validateForm( 'changePasswordForm', formData );
                                if ( validate.valid ) {
                                        yield put( actionCreators.submitChangePasswordFormValid() );
                                        yield put( loader('show') );


                                        let newPasswordResponse = yield call( api.setChangePassword, oldPassword, newPassword);
                    yield put( loader('hide') );
                    if ( !newPasswordResponse.ok ) {

                                            let errors = serverError(newPasswordResponse);
                                            console.log(errors);
                                      console.log('errors newPasswordResponse');

                                      yield put( showModalError({ error: errors }));
                                      yield put( actionCreators.submitNewPasswordFormFailed( errors ) );

                                        //  return false;
                                        }
                                        else {


                                        yield put({
                                            type: KEYCHAIN_GET,
                                            // resultAction: ''
                                        });


                                        const keychain = yield take(KEYCHAIN_RESULT);

                    // Save to Keychain
                                        yield put( keychainSet({
                                            login: keychain.login || false,
                                            password: keychain.password || false
                                        }) );

                            // final screen
                                        yield put( redirectTo('thankyou') );
                                        yield call( delay, 300 );
                                        yield put( actionCreators.changePasswordResetState() );
                                    }

                                }
                                else {
                                    yield put( showModalError({ error: validate.errors }));
                                    yield put( actionCreators.submitChangePasswordFormFailed( validate.errors ));
                                    yield put( actionCreators.changePasswordFailed() );


                    //                      yield put( actionCreators.submitFinFormFailed( ret.errors ) );
                //                      yield put( actionCreators.registrationFailed());
                              }
          // Reset login
         //  yield call( delay, 300 );
        //  yield put( actionCreators.resetState() );

        }

    } catch (e) {
            console.log(e);
    }


}




export function validateForm( formKey, formData ) {
  let
  ret = {
    valid: true,
    errors: false
  },
  schema: {};

  switch ( formKey ) {
    case 'changePasswordForm':
        schema = {
                    oldPassword: V.required( validatePassword ),
                    newPassword: V.required( validatePassword ),
                    newPasswordConfirmation: V.required( R.equals( formData.newPassword ) )
                };
      break;

    default:
      break;
  }

  ret.valid = V.validate( schema, formData );

  if ( !ret.valid ) {
    ret.errors = V.getErrors( schema, formData );
    ret.errors = R.zipObj( R.pluck('property', ret.errors), ret.errors );
  }

  console.log('isValid: ' + ret.valid.toString());

  return ret;
}

Комментировать все Console.log высказывания не помогло

import { select, take, takeLatest, call, put, fork, race } from 'redux-saga/effects';
import R from 'ramda';
import V from 'o-validator';
import * as actionCreators from './actions';
import { redirectTo, showModalError, showModal, showOtp, closeOtp, errorOtp, loader, keychainSet } from '../../../actions/app-actions';
import { storeSession, refreshSession } from '../../../actions/session-actions';
import I18n from 'react-native-i18n';
import {
  KEYCHAIN_RESET,
  KEYCHAIN_GET,
  KEYCHAIN_RESULT
} from '../../../constants/action-types';


import { validatePassword, createCustomError, serverError } from '../../../services/utils';

const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms))


export function * changePasswordScreenWatcher( api, action ) {
        yield fork( ChangePasswordFormWatcher, api, action );
}

export function * ChangePasswordFormWatcher(api, action){
  while (true) {
    yield race({
      changePasswordProcess: call(ChangePasswordStart, api),
      cancel: take(['CHANGE_PASSWORD_PASSWORD_RESET'])
    });
    //yield put( loader('hide') );
        yield put( loader('hide') );


  }
}




/**
 * Change Password Sagas starter
 *
 * @param {function} api - api object
 * @param {object} action - action from dispatch
 * @returns
 */
export function * ChangePasswordStart(api, action) {
    try {
            while (true) {
                const { formData } = yield take('CHANGE_PASSWORD_FORM_SUBMIT');
                                let oldPassword = formData.oldPassword;
                                let newPassword = formData.newPassword;
                                let newPasswordConfirmation = formData.newPasswordConfirmation;


                                yield put({
                                type: 'CHANGE_PASSWORD_FORM_VALID'
                              });

                                const validate = validateForm( 'changePasswordForm', formData );
                                if ( validate.valid ) {
                                        yield put( actionCreators.submitChangePasswordFormValid() );
                                        yield put( loader('show') );


                                        let newPasswordResponse = yield call( api.setChangePassword, oldPassword, newPassword);
                    yield put( loader('hide') );
                    if ( !newPasswordResponse.ok ) {

                                            let errors = serverError(newPasswordResponse);
                                            //console.log(errors);
                                      //console.log('errors newPasswordResponse');

                                      yield put( showModalError({ error: errors }));
                                      yield put( actionCreators.submitNewPasswordFormFailed( errors ) );

                                        //  return false;
                                        }
                                        else {


                                        yield put({
                                            type: KEYCHAIN_GET,
                                            // resultAction: ''
                                        });


                                        const keychain = yield take(KEYCHAIN_RESULT);

                    // Save to Keychain
                                        yield put( keychainSet({
                                            login: keychain.login || false,
                                            password: keychain.password || false
                                        }) );

                            // final screen
                                        yield put( redirectTo('thankyou') );
                                        yield call( delay, 300 );
                                        yield put( actionCreators.changePasswordResetState() );
                                    }

                                }
                                else {
                                    yield put( showModalError({ error: validate.errors }));
                                    yield put( actionCreators.submitChangePasswordFormFailed( validate.errors ));
                                    yield put( actionCreators.changePasswordFailed() );


                    //                      yield put( actionCreators.submitFinFormFailed( ret.errors ) );
                //                      yield put( actionCreators.registrationFailed());
                              }
          // Reset login
         //  yield call( delay, 300 );
        //  yield put( actionCreators.resetState() );

        }

    } catch (e) {
            //console.log(e);
    }


}




export function validateForm( formKey, formData ) {
  let ret = {
    valid: true,
    errors: false
  };

  switch ( formKey ) {
    case 'changePasswordForm':
        schema = {
                    oldPassword: V.required( validatePassword ),
                    newPassword: V.required( validatePassword ),
                    newPasswordConfirmation: V.required( R.equals( formData.newPassword ) )
                };
      break;

    default:
      break;
  }

  ret.valid = V.validate( schema, formData );

  if ( !ret.valid ) {
    ret.errors = V.getErrors( schema, formData );
    ret.errors = R.zipObj( R.pluck('property', ret.errors), ret.errors );
  }

  //console.log('isValid: ' + ret.valid.toString());

  return ret;
}

person Kamil Ibadov    schedule 09.09.2018    source источник
comment
Можете ли вы поделиться образцом кодовой базы, чтобы воспроизвести проблему?   -  person Pritish Vaidya    schedule 12.09.2018
comment
добавлен код, который мы добавили после последней успешной работы   -  person Kamil Ibadov    schedule 12.09.2018
comment
@PritishVaidya добавил   -  person Kamil Ibadov    schedule 12.09.2018
comment
Вам нужно лучше описать, что release mode does not works означает, если вы хотите, чтобы люди поняли вашу проблему. Поэтому, пожалуйста, опубликуйте полученную ошибку, если таковая имеется, или сначала подробно опишите проблему   -  person Mihai Fratu    schedule 13.09.2018
comment
нет синтаксической ошибки @MihaiFratu, просто не закрывается диалог загрузки   -  person Kamil Ibadov    schedule 13.09.2018
comment
У меня такая же проблема на Андроиде. Если приду к результату, я вам сообщу   -  person Mahdi Bashirpour    schedule 13.09.2018
comment
Вы удостоверились, что не компилируете никаких console.log в своем выпуске продукта? На вашем реальном телефоне этого не сказано console-global, так что это приведет к сбою вашего приложения.   -  person Jimi Pajala    schedule 17.09.2018
comment
Один вопрос, почему вы должны использовать while (true) в своем коде? Я думаю, что это заставит ваш код работать в бесконечном цикле и в конце концов потерпеть крах.   -  person arufian    schedule 18.09.2018


Ответы (3)


Судя по предоставленной информации, похоже, что вы загружаете разные пакеты при переключении между режимами отладки и выпуска.

Убедитесь, что вы настроили свое приложение на использовать статический пакет в режиме выпуска.

Затем ваше приложение будет отображать один и тот же пакет в обоих режимах, и поведение может быть таким, как вы ожидаете.

person Luiz Dias    schedule 18.09.2018

Это должна быть библиотека, которая конфликтует с вашей версией приложения для iOS. Попробуйте удалить библиотеки одну за другой и посмотрите, работает ли она при каждой попытке.

Ярлык - проверить код используемых вами библиотек и посмотреть, устарели ли какие-либо API, которые используются библиотекой.

Я столкнулся с аналогичной проблемой, и в моем случае проблема была вызвана анимацией лотереи. Надеюсь, ты сможешь решить эту проблему.

person atitpatel    schedule 03.12.2018

Похоже, вы используете console.log в своем коде. Поскольку в вашей реальной телефонной среде нет console-global переменных, убедитесь, что вы избавились от них перед компиляцией в производственную версию.

ИЗМЕНИТЬ

Предыдущее утверждение не совсем верно. Даже несмотря на то, что я сам сталкивался с крайними случаями, когда console.log приведет к сбою вашего приложения, когда оно не запущено в режиме отладки, похоже, что это не всегда так, и производственная сборка будет работать с ними на месте. В любом случае следует принимать во внимание увеличение производительности, которого вы можете достичь, удалив их. https://facebook.github.io/react-native/docs/performance.html#performance

person Jimi Pajala    schedule 17.09.2018
comment
Ваш факт неверен. React Native имеет движок JavascriptCore за слоем, поэтому console.log можно использовать даже в производственной среде. Попробуйте сами, вам никогда не будет больно - person arufian; 18.09.2018
comment
Похоже, ты прав. Единственная актуальная причина для их удаления в производстве - это, похоже, повышение производительности. facebook.github.io/react-native/docs/ - person Jimi Pajala; 18.09.2018
comment
Что ж, если вы регистрируете большой кусок данных, это приведет к потере производительности. Поэтому используйте console.log с умом. Более того, если вы говорите о производительности, рендеринг гораздо важнее, чем console.log. - person arufian; 19.09.2018
comment
Я не знаю, почему люди ставят это отрицательное мнение. Это сработало для меня. - person gandalf; 28.12.2019