iOS flutter workmanager не работает при попытке выполнить http.get в фоновом режиме и не выдает ошибок в журналах
У меня есть проекты, в которых мне нужно, чтобы iOS проверяла срок выполнения из api в фоновом режиме и планировала уведомление на эту дату, однако всякий раз, когда код попадает в вызов http.get, он останавливается и не вызывает ошибок в Xcode.
Вот мой main.dart:
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:shared_preferences/shared_preferences.dart';
import 'package:workmanager/workmanager.dart' as w;
List<String> accountList = [];
List<String> notificationList = [];
List<dynamic> dateInfo = [];
List<dynamic> accountInfo;
SharedPreferences myPrefs;
bool switchOne = true;
bool switchTwo = true;
bool switchThree = true;
//this is the name given to the background fetch
const simplePeriodicTask = "simplePeriodicTask";
w.Workmanager workmanager = w.Workmanager();
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await workmanager.initialize(callbackDispatcher, isInDebugMode: true);
await NotificationService().initialize();
runApp(BWSApp());
}
void setSwitches() async {
WidgetsFlutterBinding.ensureInitialized();
myPrefs = await SharedPreferences.getInstance();
switchOne = (myPrefs.getBool('switchOne') ?? false);
switchTwo = (myPrefs.getBool('switchTwo') ?? false);
switchThree = (myPrefs.getBool('switchThree') ?? false);
if(myPrefs.getStringList('accounts') != null){
for(var i = 0; i < myPrefs.getStringList('accounts').length; i++){
accountList.add(myPrefs.getStringList('accounts')[i]);
notificationList.add(myPrefs.getStringList('notificationId')[i]);
http.Response result = await http.get(Uri.parse("https://reqres.in/api/users?page=2"));
print("doesn't even get here");
_getDueDate(json.decode(result.body), myPrefs.getStringList('notificationId')[i]);
}
}
}
void callbackDispatcher() {
print("callBackDispatcher");
workmanager.executeTask((task, inputData) async{
setSwitches();
return Future.value(true);
});
}
А вот и мой AppDelegate.swift:
import UIKit
import Flutter
import workmanager
import shared_preferences
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
WorkmanagerPlugin.register(with: self.registrar(forPlugin: "be.tramckrijte.workmanager.WorkmanagerPlugin")!)
UNUserNotificationCenter.current().delegate = self
UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15))
WorkmanagerPlugin.setPluginRegistrantCallback { registry in
AppDelegate.registerPlugins(with: registry)
FLTSharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin")!)
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
static func registerPlugins(with registry: FlutterPluginRegistry) {
GeneratedPluginRegistrant.register(with: registry)
}
override func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler(.alert)
}
}
В Xcode я имитирую фоновую выборку, и я могу что-то напечатать, пока он не достигнет http.get, тогда в этот момент кажется, что он просто останавливается, он не дает мне журналов ошибок или чего-то еще, поэтому я не знаю, что такое проблема. Любая помощь приветствуется.
1 ответ
Мне просто нужно было поместить мою функцию setSwitches в Future.