反应本机应用程序在调试模式下工作,但在 ios 上不工作发布模式

Posted

技术标签:

【中文标题】反应本机应用程序在调试模式下工作,但在 ios 上不工作发布模式【英文标题】:react native app works on debug mode, but not works release mode on ios 【发布时间】:2019-02-14 06:09:27 【问题描述】:

我有一个响应原生的应用程序。调试模式适用于 ios。但发布模式不起作用。我尝试更改优化级别,但没有帮助。我没有看到任何错误的问题。只是不工作一些功能。而且我无法调试应用程序的发布版本。如何解决这个问题?

作为我们在 saga 之后添加的最后一项更改,当我们删除调用这个 saga 时它可以工作

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;

【问题讨论】:

你能分享一个示例代码库来重现这个问题吗? 添加了我们上次成功工作后添加的代码 @PritishVaidya 添加了 如果您希望人们了解您的问题,您需要更好地描述release mode does not works 的含义。因此,请发布您遇到的错误(如果有),或先详细描述问题 @MihaiFratu 没有语法错误,只是没有关闭加载对话框 【参考方案1】:

根据提供的信息,您在 debugrelease 模式之间切换时似乎加载了不同的包。

确保您在发布模式下将您的应用配置为use a static bundle。

然后您的应用将在两种模式下呈现相同的包,并且行为可能与您预期的一样。

【讨论】:

【参考方案2】:

它必须是一个与您的 iOS 版本应用程序冲突的库。尝试一个一个地删除库,看看它是否在每次尝试时都有效。

一种快捷方式是检查您正在使用的库的代码,并查看该库正在使用的任何 API 是否已弃用。

我遇到了一个类似的问题,就我而言,是 lottie-animation 导致了问题。希望你能解决它。

【讨论】:

【参考方案3】:

好像您在代码中使用了console.log。由于您的真实手机环境没有 console-global 变量,因此请确保在编译到生产版本之前摆脱这些变量。

编辑

之前的说法并不完全正确。即使我自己遇到了边缘情况,console.log 在不以调试模式运行时会使您的应用程序崩溃,但似乎并非总是如此,生产构建将与它们一起运行。无论哪种方式,您都应该考虑通过删除它们来提高性能https://facebook.github.io/react-native/docs/performance.html#performance

【讨论】:

你的事实是错误的。 React Native 在层后面有 javascriptCore 引擎,因此即使在生产环境中也应该可以使用 console.log。自己试试吧,你永远不会受伤 看来你是对的。在生产中删除它们的唯一相关原因是实现性能提升。 facebook.github.io/react-native/docs/… 好吧,如果你记录一大块数据,那将是性能损失。因此明智地使用console.log。此外,如果你在谈论性能,渲染比 console.log 重要得多 我不知道为什么人们给了这个负面分数,这对我有用。

以上是关于反应本机应用程序在调试模式下工作,但在 ios 上不工作发布模式的主要内容,如果未能解决你的问题,请参考以下文章

在模拟器/设备上/使用或不使用 Chrome 调试时反应本机行为不同

在调试指向问题时反应本机

反应本机选择器未在android上显示

应用程序在发布时崩溃,但在调试模式下工作正常

ios 应用程序在调试模式下完美运行,但在发布时崩溃

Firebase 消息传递仅在调试模式下工作,而不是在发布模式下工作 (iOS)