우선, 회원가입을 위해 리듀서의 구조를 살짝 바꿨다.
회원가입을 할때, 정보를 저장해둘 reducer
가 필요해졌다.
따라서
- 휴대폰 인증 : spring (coolsms) 인증 으로!
-> 인증되면 이름 가져오기- 간편 비밀번호 생성
- 신분증 등록
- 백신패스 등록
- 이름 모두 비교 분석후 회원정보 (디바이스아이디, 이름, 시간) 서버로 전송 후
- 로그인 화면으로 이동!!!
- coolsms 으로 보내기 및 가져오기
- 인증번호 유효시간 설정
setInterval( )
&clearInterval( )
&useRef( )
사용하기
const [min, setMin] = useState(padNumber(3, 2));
const [sec, setSec] = useState(padNumber(0, 2));
const time = useRef(180);
//3분으로 설정
const timerId = useRef(null);
const startTimer = () => {
clearInterval(timerId.current);
time.current = 180;
setMin(padNumber(3, 2));
setSec(padNumber(0, 2));
timerId.current = setInterval(() => {
time.current -= 1;
setSec(padNumber(time.current % 60, 2));
setMin(padNumber(parseInt(time.current / 60), 2));
}, 1000);
}
const stopTimer = () => {
setMin(padNumber(3, 2));
setSec(padNumber(0, 2));
clearInterval(timerId.current);
}
useEffect(() => {
if (time.current <= 0) {
clearInterval(timerId.current);
}
}, [sec]);
형식이 잘못되거나 인증이 유효하지 않으면 stopTimer
를 호출해 타이머를 멈추고,
유효한 인증이면 startTimer
를 호출해 타이머를 시작한다.
<SignUpButton
buttonName="인증"
onPress={function () {
Keyboard.dismiss();
if (!isPhoneNumber(phoneNumber)) {
Alert.alert('잘못된 형식의 전화번호입니다');
stopTimer();
}else {
Alert.alert('인증 유효시간은 3분입니다');
props.postMessage(phoneNumber);
props.getMessage(phoneNumber);
startTimer();
}
}
}
/>
number-pad
로 설정secureTextEntry
의 기능을 추가하여 비밀번호 타임maxLength
는 6 <TextInput style={signUp.messageInput}
placeholder="숫자 6자리 입력"
placeholderTextColor={colors.nvpUnder}
keyboardType="number-pad"
maxLength={6}
secureTextEntry
onChangeText={(inputPassword) => {
setPassword(inputPassword);
}} />
npm install react-native-rectangle-scanner --save
cd ios && pod install && cd ..
- NVP > NVP > Info
Privacy - Camera Usage Description
을Key
로 가지고
카메라 접근이 필요합니다!
를Value
로 가지는
Information Property 추가!
include ':openCVLibrary310' project(':openCVLibrary310').projectDir = new File(rootProject.projectDir,'../node_modules/react-native-rectangle-scanner/android/openCVLibrary310')
android/app/src/main/AndroidManifest.xml
로 들어가서 카메라 권한을 설정<uses-permission android:name="android.permission.CAMERA" />
- components/RectangleCarmera.js 따로 생성
npm install --save prop-types
prop 타입을 가져오기 위한 라이브러리 필요!
- 이후 이를 OCR 기능을 통해 이름을 따와야 함
yarn add @react-native-firebase/storage
설치 후
cd ios && pod install && npm run ios
- RectangleCamera.js 에 uploadImageToStorage() 정의
import storage from '@react-native-firebase/storage'; uploadImageToStorage(){ let imageNames = this.state.currentImage.split('/'); let refImageName = imageNames[imageNames.length - 1]; //jpeg 파일 이름만 따오기! let reference = storage().ref(refImageName); // 핸드폰 로컬 저장소에 있는 이미지 업로드!! let task = reference.putFile(this.state.currentImage); task.then(() => { console.log("Upload"); }).catch((e) => console.log(e)); }
업로드 성공
{ "googleCloud": { "api": "https://vision.googleapis.com/v1/images:annotate?key=", "apiKey": "앱키" } }
callGoogleVisionApi = async (uri) => { let googleVisionRes = await fetch(config.googleCloud.api + config.googleCloud.apiKey, { method: 'POST', body: JSON.stringify({ "requests": [ { "features": [ { "type": "DOCUMENT_TEXT_DETECTION" } ], "image": { "source": { "imageUri": uri } } } }); ] }) await googleVisionRes.text() .then(googleVisionRes => { console.log(googleVisionRes.description); if (googleVisionRes) { } }).catch((err) => { console.log(err) }) }
- 권한 추가
- Rules : 모두가 읽고 쓰기 가능하게 설정
service firebase.storage { match /b/{bucket}/o { match /{allPaths=**} { allow read, write; } } }
"responses": [ { "textAnnotations": [ { "locale": "ko", "description": "CT\n\u003c\n신분증 등록\n네모 상자가 나타나게 신분증을 찍어주세요\n신분증 촬영 결과\n주민등록증\n홍서희(洪瑞喜)\n000112-\n/\n다시찍기\n사용하기\n", "boundingPoly": { "vertices": [ { "x": 22, "y": 39
- 여기서
신분증 촬영 ~ -\n
까지 뽑아와서 데이터저장!!
신분증 등록 완료
- 개인정보법에 의해 신분증은 저장해놓으면 안된다.
const imageRef = storage().refFromURL(uri); imageRef.delete();
yarn add react-native-image-picker cd ios && pod install
- TakeVaccinePass.js
let [imageUri, setImageUri] = useState(''); const openPicker = () => { launchImageLibrary({}, (response) => { //선택한 이미지의 경로를 가져와서 view로 보여준다. console.log(response.assets[0].uri); setImageUri(response.assets[0].uri); }) } ... <View style={signUp.cameraView}> <Image source={{ uri: imageUri }} style={{ width: '100%', height: '100%' }} /> </View>
성공적으로 경로를 가져온 것을 볼 수 있다.
firebaseStorage 관리를 위해 firebaseStorage.js
를 만들어
모듈로써 관리한다
import storage from '@react-native-firebase/storage';
export function registerImage(imageName) {
let currentImageName = imageName.split('/');
let refImageName = currentImageName[currentImageName.length - 1];
let reference = storage().ref(refImageName);
let task = reference.putFile(imageName);
task.then(() => {
console.log("Upload");
}).catch((e) => {
console.log(e)
console.log("에러")
});
}
이를 백신패스 등록하는 곳에 연결
import { registerImage } from '../../utils/firebaseStorage';
...
const openPicker = () => {
launchImageLibrary({}, (response) => {
setImageUri(response.assets[0].uri);
registerImage(response.assets[0].uri);
})
}
회원가입할때
- id
- password
- name
- phone
- filename
- date(인증서 제출알짜)