反应本机应用程序在调试模式下工作,但在 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】:
根据提供的信息,您在 debug 和 release 模式之间切换时似乎加载了不同的包。
确保您在发布模式下将您的应用配置为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 上不工作发布模式的主要内容,如果未能解决你的问题,请参考以下文章