Я хочу обновлять Firestore
document
каждый день в 6 утра автоматически.
Например, есть приложение с расценками, которое каждое утро обновляет расценки на новые, чтобы пользователь мог видеть разные расценки.
Я не возражаю против выполнения кода на устройстве iOS или Android, потому что у меня есть оба телефона.
Но я хочу, чтобы приложение обновляло документ, даже если я сплю.
Как лучше всего это сделать?
Возможный дубликат Как запланировать фоновые задачи во Flutter?
К сожалению, в этом случае вам понадобится WorkManager на Android. Это способ использовать фоновую службу в этом случае. В iOS не знаю как.
Я думаю, что во Flutter невозможно создавать фоновые службы, потому что он работает в другом контексте.
Разве не рекомендуется выполнять эту логику на мобильном устройстве? Я имею в виду фоновое исполнение.
Если у вас есть способы сделать это, это хорошая идея. На данный момент я не нашел способа использовать только Flutter.
Как вы думаете, это сработает? [pub.dartlang.org/packages/background_fetch
Хорошие новости: отчасти это возможно.
На Android
вы должны использовать WorkManager
.
Вы можете попросить платформу Android
запланировать вашу задачу где-нибудь в будущем (точные часы не поддерживаются).
На iOS
вы включаете Background Fetch
в XCode или вручную редактируете файл Info.plist
.
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>
</key>
Поскольку соединение всего вместе требует большого количества церемоний, существует удобный плагин Flutter
, который вам поможет.
Плагин flutter_workmanager поддерживает как WorkManager
, так и performFetch
в одном унифицированном API Dart.
void callbackDispatcher() {
Workmanager.executeTask((backgroundTask) {
switch(backgroundTask) {
case Workmanager.iOSBackgroundTask:
case "firebaseTask":
print("You are now in a background Isolate");
print("Do some work with Firebase");
Firebase.doSomethingHere();
break;
}
return Future.value(true);
});
}
void main() {
Workmanager.initialize(callbackDispatcher);
Workmanager.registerPeriodicTask(
"1",
"firebaseTask",
frequency: Duration(days: 1),
constraints: WorkManagerConstraintConfig(networkType: NetworkType.connected),
);
runApp(MyApp());
}
Это похоже на то, что вы, возможно, захотите сделать на стороне сервера, а не на стороне клиента.