this is our code foe fetching the apnstoken - and registering for the FCM and snding it to our servers. - we are consistently getting apns == null
import 'dart:io'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:firebase_auth/firebase_auth.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:solaris/services/fetch_deviceId.dart';
Future<void> initializeFCM() async { final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance;
// Request notification permissions for iOS final settings = await _firebaseMessaging.requestPermission(); print('Notifcation Permission Status: ${settings.authorizationStatus}');
String? apnsToken; int retries = 0; const int maxRetries = 60; const Duration retryDelay = Duration(seconds: 2);
// Retry fetching the APNs token until it's available or max retries are reached while (apnsToken == null && retries < maxRetries) { print(retries);
apnsToken = await _firebaseMessaging.getAPNSToken();
if (apnsToken == null) {
await Future.delayed(retryDelay);
retries++;
}
}
if (apnsToken != null) { // APNs token is available, proceed to get FCM token String? fcmToken = await _firebaseMessaging.getToken(); if (fcmToken != null) { // Register the device and token with your backend await registerDeviceAndToken(fcmToken); } else { // Handle the case where FCM token is still null print('FCM token is null.'); } } else { // Handle the case where APNs token is not available after retries print('APNs token not available after retries.'); } }
Future<void> registerDeviceAndToken(String fcmToken) async { //fcmToken = fcmToken; print(fcmToken); final user = FirebaseAuth.instance.currentUser;
if (user == null) { print('❌ User not logged in'); return; }
final deviceId = await DeviceInfoService.getUniqueDeviceId(); //final fcmToken = await FirebaseMessaging.instance.getToken();
print('📱 Device ID from register_fcm: $deviceId'); print('📩 FCM Token from mew getapnd function: $fcmToken');
if (deviceId == null || fcmToken == null) { print('❌ Failed to get deviceId or fcmToken'); return; }
final docRef = FirebaseFirestore.instance .collection('master_users') .doc(user.uid) .collection('deviceId') .doc(user.uid); // This document holds a map: { deviceId: fcmToken }
print(docRef);
try { // Get current data, fallback to empty map final snapshot = await docRef.get(); final data = snapshot.data() ?? <String, dynamic>{}; print(data);
// Update or add current deviceId key
data[deviceId] = fcmToken;
// Save updated map back to Firestore
await docRef.set(data);
print(data);
print('✅ Device ID and FCM token updated/stored under correct structure');
} catch (e) { print('❌ Firestore write error: $e'); } }