Cada 에서는 사용자가 데이터를 수집하고 리워드를 받습니다.
그리고 리워드를 환전 신청했을때 이체준비가 완료되었다는 알림을 보내기위해서 이번 expo-notification 을 이용해서 구현했습니다.
사용자의 디바이스에 알림을 허용요청을 할 라이브러리 설치가 필요합니다.
아래 두개를 설치해주세요.
expo-constants
expo-notification
아래 함수는 알림을 허용받고 expoPushToken 을 return 한다.
async function registerForPushNotificationsAsync() {
let token;
if (Constants.isDevice) {
const { status: existingStatus } =
await Notifications.getPermissionsAsync();
let finalStatus = existingStatus;
if (existingStatus !== 'granted') {
const { status } = await Notifications.requestPermissionsAsync();
finalStatus = status; // 알림허용을 거절당하면 finalState를 변경
}
if (finalStatus !== 'granted') {
alert('토큰을 가져오지 못했습니다.');
return;
} // 알림허용을 거절당하면 이 조건문에서 return 합니다.
token = (
await Notifications.getExpoPushTokenAsync({
experienceId: 'your experienceId',
})
).data;
} else {
alert('실제 디바이스를 사용해주세요');
}
if (Platform.OS === 'android') { //안드로이드는 세팅을 따로 해주셔야합니다.
Notifications.setNotificationChannelAsync('default', {
name: 'default',
importance: Notifications.AndroidImportance.MAX,
vibrationPattern: [0, 250, 250, 250],
lightColor: '#D22F27',
});
}
return token;
}
그 다음은 앱이 시작되었을때 useEffect 를 사용하여 함수를 실행해주고 return 값으로 받은 token을 firebase에 저장해준다.
useEffect(() => {
registerForPushNotificationsAsync().then(async (token) => {
try {
if (token) {
await db
.collection('users')
.doc(currentUser.userID)
.update({ expoPushToken: token });
}
} catch (e) {
console.log(e);
}
});
}, []);
expo-notification 을 사용하기 위해서 역시 라이브러리 설치가 필요하다.
expo-server-sdk
const { Expo } = require('expo-server-sdk');
const expo = new Expo();
환전신청을 하고 검수가 완료되면 이체준비가 완료되었다는 알림이 가야하기 때문에 특정 조건에 대해 doc을 생성하고 아래 함수를 trigger 시켰습니다.
exports.notificationTrigger = functions.firestore
.document('users/{usersId}/notifications/{notificationsDocId}')
.onCreate(async (event, context) => {
const message = event.data();
const querySnaps = await db.collection('users').doc(message.userID).get();
if (querySnaps.data().expoPushToken) {
return expo.sendPushNotificationsAsync([{
to: querySnaps.data().expoPushToken,
sound: 'default',
title: 'CADA',
subtitle: `검수가 완료 되었어요👍`,
body: `1~2시간 이내로 이체 시도가 진행될 예정이예요.`,
badge: 1,
data: {
withSome: 'notification',
},
priority: 'high'
}]);
}
});
감사합니다.