Flutter:Firestore 服务器在后台不可用

问题描述 投票:0回答:1

我想在收到 FCM 消息后从后台同步我的 Firestore 数据。因此,我想仅使用

GetOptions(source: Source.server)
从 firestore 服务器获取数据,因为服务器数据可能已更改。

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  
 final FirebaseFirestore _firestore = FirebaseFirestore.instance;

// Throws firestore/unavailable when reading from server
var tasks = await _firestore.collection('tasks').get(GetOptions(source: Source.server)
);
return snapshot.docs.map((doc) {
  final data = doc.data();
  Task task = Task.fromJson(data);
  return task;
}).toList();
  
}

问题
一旦(iOS)应用程序进入后台,我会收到错误firestore/不可用,仅从firestore读取缓存正在工作。这是 iOS 相关的问题吗?后台进程没有互联网访问权限还是我必须设置特定权限?
我的 iOS 应用程序使用以下后台模式:

  • 后台获取
  • 后台处理
  • 远程通知
ios flutter firebase google-cloud-firestore
1个回答
0
投票

问题似乎已解决,但我不完全知道以下内容实际上解决了它:

  1. 将 iOS 更新至 17.5.1
  2. 更新flutter至3.22.1
  3. 禁用广告拦截 VPN
  4. 添加带有退避逻辑的重试
  Future<T> retry<T>(Future<T> Function() function, {int maxRetries = 5, Duration delayFactor = const Duration(seconds: 2)}) async {
      int attempt = 0;
      while (true) {
        try {
          return await function();
        } catch (e) {
          if (++attempt > maxRetries) {
            rethrow;
          }
          await Future.delayed(delayFactor * attempt);
        }
      }
  }  

  var tasks = await retry(() => firestore.getAllTasks());
© www.soinside.com 2019 - 2024. All rights reserved.