From c4424434e80a79d824b8500be5afec3844e37e07 Mon Sep 17 00:00:00 2001 From: kanyanat Date: Wed, 3 Dec 2025 20:52:48 +0700 Subject: [PATCH] fix get fcm token --- App.js | 110 +++++++++++++++++++++---------- src/screens/login/Login.js | 15 +++-- src/utils/NotificationService.js | 35 ++++++++-- 3 files changed, 114 insertions(+), 46 deletions(-) diff --git a/App.js b/App.js index 3cba2ba..40af886 100644 --- a/App.js +++ b/App.js @@ -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) } } diff --git a/src/screens/login/Login.js b/src/screens/login/Login.js index d1bb94f..2778b72 100644 --- a/src/screens/login/Login.js +++ b/src/screens/login/Login.js @@ -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); } diff --git a/src/utils/NotificationService.js b/src/utils/NotificationService.js index befba01..97116c6 100644 --- a/src/utils/NotificationService.js +++ b/src/utils/NotificationService.js @@ -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);