我有一个react原生的应用程序。调试模式适用于 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;
}
Seems like you doconsole.log
's in your code. Since your real phone environment dosen't haveconsole
-global variable make sure you get rid of these before compiling to production release.EDIT
Previous statement is not entirely true. Even tho I have myself run into edge cases where
console.log
will crash your app when not running in debugging mode, it seems like this is not always the case and production build would run with them in place. Either way performance increase you might achieve by removing them should be taken in consideration https://facebook.github.io/react-native/docs/performance.html#performance