airbridge-react-native-sdk
Version:
Airbridge SDK for React Native
149 lines (119 loc) • 4.53 kB
JavaScript
import { Platform, NativeModules } from 'react-native'
import messaging from '@react-native-firebase/messaging'
import { Airbridge } from 'airbridge-react-native-sdk'
import { storage } from './Storage'
import { qaLog } from './QALog'
class FCMService {
prepare = async () => {
if (Platform.OS === 'android') {
this.getAndroidToken()
} else if (Platform.OS === 'ios') {
this.getIosToken()
}
this.onMessageReceived()
return () => {
console.log('[App] unRegister')
}
}
updateToken = async () => {
if (Platform.OS === 'android') {
await this.getAndroidToken()
} else if (Platform.OS === 'ios') {
await this.getIosToken()
}
}
deleteToken = async () => {
await messaging().deleteToken()
}
requestPermission = async () => {
console.log('[App] onRegister requestPermission')
try {
const authorizationStatus = await messaging().requestPermission();
if (authorizationStatus === messaging.AuthorizationStatus.AUTHORIZED) {
console.log('[App] User has notification permissions enabled.');
} else if (authorizationStatus === messaging.AuthorizationStatus.PROVISIONAL) {
console.log('[App] User has provisional notification permissions.');
} else {
console.log('[App] User has notification permissions disabled');
}
}
catch (error) {
console.log('[App] ios error::', error)
}
this.updateToken()
}
getIosToken = async () => {
qaLog('[App] onRegister getIosToken')
try {
if (!messaging().isDeviceRegisteredForRemoteMessages) {
await messaging().registerDeviceForRemoteMessages()
}
const fcmToken = await messaging().getToken()
if (fcmToken) {
storage.set('fcmToken', fcmToken);
}
const apnsToken = await messaging().getAPNSToken()
qaLog('[App] getIosToken ApnsToken : ' + apnsToken)
if (apnsToken) {
storage.set('apnsToken', apnsToken);
Airbridge.registerPushToken(apnsToken)
}
}
catch (error) {
qaLog('[App] ios error::', error)
this.getApnsToken()
}
}
getApnsToken = async () => {
qaLog('[App] onRegister getApnsToken')
let shouldStop = false
const repeatCount = 5
const freq = 500
for (let i = 0; i < repeatCount; i++) {
setTimeout(async () => {
if (shouldStop) return
try {
const response = await NativeModules.IdentifiersInteractor.apnsToken();
const jsonData = JSON.parse(response);
const apnsToken = jsonData['data']
qaLog(`[App] getApnsToken ApnsToken (${i}) : ${apnsToken}`)
if (apnsToken) {
shouldStop = true
storage.set('apnsToken', apnsToken);
Airbridge.registerPushToken(apnsToken)
}
} catch (error) {
}
}, i * freq);
}
}
getAndroidToken = async () => {
console.log('[App] onRegister getAndroidToken')
const fcmToken = await messaging().getToken()
if (fcmToken != null) {
storage.set('fcmToken', fcmToken);
Airbridge.registerPushToken(fcmToken)
}
console.log('[App] fcmToken :' + fcmToken)
}
onMessageReceived = async () => {
const onReceived = async (remoteMessage) => {
console.log('[FCM] onMessageReceived: ' + JSON.stringify(remoteMessage))
if (Airbridge.isUninstallTrackingNotification(remoteMessage.data)) {
console.log("[FCM] Airbridge silent push notification received")
}
if (remoteMessage.data != null) {
console.log("[FCM] Message data payload: " + JSON.stringify(remoteMessage.data))
}
// Check if message contains a notification payload
if (remoteMessage.notification != null) {
console.log("[FCM] Message notification body: " + JSON.stringify(remoteMessage.notification.body))
}
}
// 활성 상태 및 포그라운드 상태일때 FCM 메시지 수신
const unsubscribe = messaging().onMessage(async remoteMessage => onReceived(remoteMessage));
// 앱이 종료된 상태일 때 FCM 메시지 수신
messaging().setBackgroundMessageHandler(async remoteMessage => onReceived(remoteMessage));
}
}
export const fcmService = new FCMService()