我想在收到 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 应用程序使用以下后台模式:
问题似乎已解决,但我不完全知道以下内容实际上解决了它:
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());