반응형
firebase연동
설치
react-native-firebase 패키지에서 제공하는
- react-native-firebase/auth
- react-native-firebase/firestore
- react-native-firebase/storage
등을 사용하려면
react-native-firebase/app 모듈 설치가 되어있어야한다.
# Using npm
npm install --save @react-native-firebase/app
firebase
안드로이드 설정
- firebase 콘솔에서 android 앱 추가
firebase console > project settings > General > Your apps > 안드로이드 아이콘 클릭 - packagename 입력(
android/app/src/main/AndroidManifest.xml
에 package에 있음 ) google-services.json
다운android/app
에 다운받은google-services.json
를 넣기android/app/google-services.json
.gitignore에 추가android/build.gradle
에 추가-
buildscript { repositories { // Check that you have the following line (if not, add it): google() // Google's Maven repository } dependencies { ... // Add this line classpath 'com.google.gms:google-services:4.3.6' // 추가 } }
android/app/build.gradle
추가-
apply plugin: 'com.android.application' // Add this line apply plugin: 'com.google.gms.google-services' dependencies { // Import the Firebase BoM implementation platform('com.google.firebase:firebase-bom:28.0.0') // Add the dependency for the Firebase SDK for Google Analytics // When using the BoM, don't specify versions in Firebase dependencies implementation 'com.google.firebase:firebase-analytics' // Add the dependencies for any other desired Firebase products // https://firebase.google.com/docs/android/setup#available-libraries }
- *** 이슈1. 설정 후 동기화오류남 (node_modules에 firebase가 없는듯?)
-
Error: Unable to resolve module react-native-firebase from D:\workspace_react\saessak\src\screen\CameraRoll.js: react-native-firebase could not be found within the project or in these directories: node_modules If you are sure themodule exists, try these steps: 1. Clear watchman watches: watchman watch-del-all 2. Delete node_modules(rm -rf node_modules/) and run npm install 3. Reset Metro's cache: npm start --reset-cache 4. Remove the cache: rm -rf /tmp/metro-*
gradlew clean
storage, database 사용
설치
# Install the storage module
npm add @react-native-firebase/storage
# Install the database module
npm add @react-native-firebase/database
스토리지 규칙이다. auth된 사용자만 써야한다는 규칙
Cloud Storage 위치 설정
기본적으로 이 규칙은 인증된 사용자의 모든 읽기 및 쓰기를 허용합니다.
데이터 구조를 정의한 후 데이터에 보안을 적용하는 규칙을 작성해야 합니다.자세히 알아보기
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if request.auth != null;
}
}
}
테스트를 하기위해 잠시 그 규칙 해제 >>> 돌려놓기
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write
}
}
}
한국은 asia-northeast3라고 한다. 설정 (다른나라로 하면 느려지는 현상이 생김 _ 지구한바퀴를 돌아야해서... )
import firebase from '@react-native-firebase/storage'
*** 이슈2. 나는 import firebase from 'react-native-firebase
이렇게 하면 오류남 .. ? 이유는 모름
그래서 따로 storage를 지정
const uploadImage = (source, imageUri) => {
const ext = imageUri.split('.').pop(); // Extract image extension
const filename = `${uuid()}.${ext}`; // Generate unique name
const imgRef = firebase.storage().ref(`saessak/${filename}`);
const unsubscribe = imgRef.putFile(imageUri)
.on(
firebase.storage.TaskEvent.STATE_CHANGED,
async snapshot => {
let state = {};
state = {
...state,
progress: (snapshot.bytesTransferred / snapshot.totalBytes) * 100 // Calculate progress percentage
};
if (snapshot.state === firebase.storage.TaskState.SUCCESS) {
console.log('upload success');
// unsubscribe the event
unsubscribe();
// update the image url
let url;
await imgRef.getDownloadURL()
.then((response) => {
console.log('get url response', response);
url = response;
})
.catch(error => {
console.log('Failed to get url', error);
})
// update user info, avatar, and name
console.log('user avatar url', url);
updateAvatarState({ userId, avatarUrl: url });
// refresh the screen
setAvatarUrl(url);
}
},
error => {
console.log('AccountEditScreen uploading error', error);
// alert for failure to upload avatar
Alert.alert(
t('AccountEditScreen.updateErrorTitle'),
t('AccountEditScreen.updateError'),
[
{ text: t('confirm') }
],
{ cancelable: true },
);
}
);
};
- Storage의 reference를 가져오는 부분은 Firestore와 동일합니다.
const imgRef = firebase.storage().ref(
avatar/${filename});
위 Storage구조를 보면 최상위 디렉터리 밑에avatar
라는 폴더가 있습니다.imgRef
는 그 폴더 밑에 임의로 생성한 이미지 이름을 가리키게 됩니다. putPile
함수를 이용하여 이미지를 Storage에 저장합니다.- 이미지를 Storage에 저장만 하고 끝나는게 아닙니다. 사용자별로 저장된 이미지의 위치를 DB에 기록해서 필요할 때마다 불러와야 합니다. 그래서 putFile이 이미지 업로드할 때까지 기다립니다.
firebase.storage.TaskState.SUCCESS
부분에서 업로드가 성공적이면, Storage에 저장된 이미지의 다운로드 경로를 가져옵니다.imgRef.getDownloadURL()
- 마지막으로 이미지 경로를 제대로 가져오면 사용자 정보(DB)에 저장된 아바타 이미지 경로를 저장합니다.
import database from '@react-native-firebase/database';
async function data(params) {
const ref = database().ref();
let data = await (await fetch(ref + params + '.json')).json();
return data;
}
export default data;
반응형
'개발(라이브러리,프레임워크) > react.js & react native' 카테고리의 다른 글
라이프사이클 (0) | 2021.09.23 |
---|---|
props 와 state (0) | 2021.09.23 |
axios / fetch (0) | 2021.06.30 |
apk 추출(리액트 네이티브) (0) | 2021.06.06 |
리액트 네이티브 (오류해결) (0) | 2021.05.17 |