fix get fcm token

This commit is contained in:
kanyanat 2025-12-03 20:52:48 +07:00
parent de23d2277c
commit c4424434e8
3 changed files with 114 additions and 46 deletions

106
App.js
View File

@ -41,19 +41,8 @@ class App extends Component {
SplashScreen.hide()
Settings.initializeSDK();
// Test FCM token
try {
const token = await messaging().getToken();
console.log('Current FCM Token:', token);
console.log('Token length:', token ? token.length : 0);
// ตรวจสอบ permission status
const authStatus = await messaging().requestPermission();
console.log('Permission status:', authStatus);
} catch (error) {
console.log('Error getting FCM token:', error);
}
// ไม่ต้องขอ FCM token ที่นี่ เพราะจะทำใน initNotification แล้ว
console.log('App initialized');
}
// เพิ่ม method ใหม่สำหรับ setup listeners
@ -110,29 +99,59 @@ class App extends Component {
initNotification = async () => {
try {
await this.setPermission()
console.log('Starting notification initialization...');
// ขอ permission ก่อน
await this.setPermission();
// รอให้ APNs token พร้อมสำหรับ iOS
if (Platform.OS === 'ios') {
let apnsToken = await messaging().getAPNSToken();
console.log('Waiting for APNs token on iOS...');
let apnsToken = null;
let retry = 0;
while (!apnsToken && retry < 10) {
console.log('Waiting for APNs token...');
await new Promise(resolve => setTimeout(resolve, 1000));
apnsToken = await messaging().getAPNSToken();
const maxRetries = 20; // เพิ่มจำนวน retry
while (!apnsToken && retry < maxRetries) {
try {
apnsToken = await messaging().getAPNSToken();
if (!apnsToken) {
console.log(`Waiting for APNs token... (${retry + 1}/${maxRetries})`);
await new Promise(resolve => setTimeout(resolve, 2000)); // เพิ่มเวลารอ
}
} catch (error) {
console.log('Error getting APNs token:', error);
}
retry++;
}
console.log('APNs Token:', apnsToken);
if (!apnsToken) {
console.log('Failed to get APNs token after retries');
// Decide if we want to return here or try anyway.
// Usually if APNs is missing, getToken will fail.
if (apnsToken) {
console.log('APNs Token received:', apnsToken);
} else {
console.log('Failed to get APNs token after retries, continuing anyway...');
// ลองต่อไปแม้ไม่ได้ APNs token
}
}
// ใช้ getToken() แทน getAPNSToken()
const fcmToken = await messaging().getToken();
console.log('FCM Token:', fcmToken);
// ขอ FCM token หลังจากที่ APNs token พร้อมแล้ว
let fcmToken = null;
let fcmRetry = 0;
const maxFcmRetries = 5;
while (!fcmToken && fcmRetry < maxFcmRetries) {
try {
fcmToken = await messaging().getToken();
if (fcmToken) {
console.log('FCM Token received:', fcmToken);
break;
}
} catch (error) {
console.log(`FCM token error (${fcmRetry + 1}/${maxFcmRetries}):`, error.message);
if (fcmRetry < maxFcmRetries - 1) {
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
fcmRetry++;
}
if (fcmToken) {
store.dispatch(appSetPushToken(fcmToken))
@ -141,6 +160,8 @@ class App extends Component {
if (resultSendDevice.ok && resultSendDevice.data.success) {
store.dispatch(appSetDevice(resultSendDevice.data.device))
}
} else {
console.log('Failed to get FCM token after all retries');
}
// เพิ่ม notification listeners
@ -153,14 +174,33 @@ class App extends Component {
setPermission = async () => {
try {
await messaging().registerDeviceForRemoteMessages();
const authStatus = await messaging().requestPermission();
const enabled = authStatus === messaging.AuthorizationStatus.AUTHORIZED || authStatus === messaging.AuthorizationStatus.PROVISIONAL;
if (!enabled) {
await messaging().requestPermission()
console.log('Setting up permissions...');
// ขอ permission ก่อน
const authStatus = await messaging().requestPermission({
alert: true,
sound: true,
badge: true,
});
console.log('Permission status:', authStatus);
const enabled = authStatus === messaging.AuthorizationStatus.AUTHORIZED ||
authStatus === messaging.AuthorizationStatus.PROVISIONAL;
if (enabled) {
console.log('Notification permission granted, registering device...');
await messaging().registerDeviceForRemoteMessages();
// สำหรับ iOS ให้รอสักครู่หลัง register
if (Platform.OS === 'ios') {
await new Promise(resolve => setTimeout(resolve, 2000));
}
} else {
console.log('Notification permission denied');
}
} catch (error) {
console.log('error', error)
console.log('setPermission error:', error)
}
}

View File

@ -56,21 +56,28 @@ class LoginScreen extends Component {
console.log('true')
try {
// ใช้ NotificationService
console.log('Initializing notifications for login...');
const isPermissionGranted = await NotificationService.initialize();
if (isPermissionGranted) {
console.log('Getting notification tokens...');
const tokens = await NotificationService.getTokens();
fcmToken = tokens.fcmToken;
console.log('FCM Token:', fcmToken);
if (fcmToken) {
console.log('Login FCM Token received:', fcmToken);
} else {
console.log('No FCM token received during login');
}
if (tokens.apnsToken) {
console.log('APNs Token:', tokens.apnsToken);
console.log('Login APNs Token received:', tokens.apnsToken);
}
} else {
console.log('Notification permission denied.');
console.log('Notification permission denied during login.');
}
} catch (error) {
console.error('Failed to get notification tokens:', error);
console.error('Failed to get notification tokens during login:', error);
}

View File

@ -43,15 +43,12 @@ class NotificationService {
try {
const tokens = {};
// Get FCM token
tokens.fcmToken = await messaging().getToken();
console.log('FCM Token:', tokens.fcmToken);
// Get APNs token for iOS
// Get APNs token first for iOS
if (Platform.OS === 'ios') {
console.log('Getting APNs token first...');
let apnsToken = null;
let retry = 0;
const maxRetries = 15;
const maxRetries = 20;
while (!apnsToken && retry < maxRetries) {
try {
@ -68,12 +65,36 @@ class NotificationService {
if (apnsToken) {
tokens.apnsToken = apnsToken;
console.log('APNs Token:', apnsToken);
console.log('APNs Token received:', apnsToken);
} else {
console.log('Failed to get APNs token after retries');
}
}
// Get FCM token after APNs token is ready
let fcmRetry = 0;
const maxFcmRetries = 5;
while (!tokens.fcmToken && fcmRetry < maxFcmRetries) {
try {
tokens.fcmToken = await messaging().getToken();
if (tokens.fcmToken) {
console.log('FCM Token received:', tokens.fcmToken);
break;
}
} catch (error) {
console.log(`FCM token error (${fcmRetry + 1}/${maxFcmRetries}):`, error.message);
if (fcmRetry < maxFcmRetries - 1) {
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
fcmRetry++;
}
if (!tokens.fcmToken) {
console.log('Failed to get FCM token after all retries');
}
return tokens;
} catch (error) {
console.error('Failed to get tokens:', error);