Ошибка авторизации по номеру телефона в Firebase
При реализации авторизации по номеру телефона с использованием @react-native-firebase/auth возникает следующая ошибка:
LOG Error sending code: Exception in HostFunction: Malformed calls from JS: field sizes are different.
Эта ошибка связана с некорректной передачей данных между JavaScript и нативным модулем. Ниже приведено решение и исправленный код.
Основные причины ошибки
- Некорректный формат номера телефона (ожидается международный формат, например, +71234567890)
- Проблемы с зависимостями или версиями библиотек React Native Firebase
- Отсутствие правильной инициализации нативных модулей
Исправленный код авторизации
import 'react-native-gesture-handler';
import React, { useState } from 'react';
import { StyleSheet, Text, TouchableOpacity, View, TextInput } from 'react-native';
import auth from '@react-native-firebase/auth';
import firestore from '@react-native-firebase/firestore';
import { useNavigation } from '@react-navigation/native';
export default function App() {
const [phoneNumber, setPhoneNumber] = useState('');
const [code, setCode] = useState('');
const [confirm, setConfirm] = useState(null);
const navigation = useNavigation();
const signInWithPhoneNumber = async () => {
try {
// Номер должен быть в международном формате, начиная с +
const formattedPhone = phoneNumber.trim();
if (!formattedPhone.startsWith('+')) {
console.log('Номер телефона должен начинаться с + и кода страны');
return;
}
const confirmation = await auth().signInWithPhoneNumber(formattedPhone);
setConfirm(confirmation);
} catch (error) {
console.log('Error sending code: ', error.message);
}
};
const confirmCode = async () => {
try {
const userCredential = await confirm.confirm(code);
const user = userCredential.user;
const userDocument = await firestore()
.collection('users')
.doc(user.uid)
.get();
if (userDocument.exists) {
navigation.navigate('Dashboard');
} else {
navigation.navigate('Detail', { uid: user.uid });
}
} catch (error) {
console.log('Invalid code.', error.message);
}
};
return (
<View style={styles.container}>
<Text>Авторизация по номеру телефона с Firebase</Text>
{!confirm ? (
<>
<Text>Введите номер телефона</Text>
<TextInput
placeholder='+7 (000) 000 00 00'
value={phoneNumber}
onChangeText={setPhoneNumber}
keyboardType='phone-pad'
/>
<TouchableOpacity onPress={signInWithPhoneNumber}>
<Text>Отправить код</Text>
</TouchableOpacity>
</>
) : (
<>
<Text>Введите код, отправленный на ваш телефон</Text>
<TextInput
placeholder='Введите код'
value={code}
onChangeText={setCode}
keyboardType='number-pad'
/>
<TouchableOpacity onPress={confirmCode}>
<Text>Подтвердить</Text>
</TouchableOpacity>
</>
)}
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
alignItems: 'center',
justifyContent: 'center',
},
});Дополнительные рекомендации
- Убедитесь, что в Firebase Console включен метод входа по номеру телефона
- Проверьте актуальность версий @react-native-firebase/app и @react-native-firebase/auth (рекомендуется последняя стабильная версия)
- Для Android: убедитесь, что в файле build.gradle указана правильная версия Firebase Android SDK
- Для iOS: проверьте наличие файла GoogleService-Info.plist в проекте