flutter_workmanager
flutter_workmanager copied to clipboard
Firebasecore missing plugin exception on ios when task running🐞
- [x] I have read the README
- [x] I have done the setup for Android
- [x] I have done the setup for iOS
- [x] I have ran the sample app and it does not work there
Version
| Technology | Version |
|---|---|
| Workmanager version | 0.5.0 |
| Xcode version | 13.4.1 |
| Swift version | |
| iOS deployment target |
Describe the error Flutter workmanager works reallay well on android side for my case. But I need to init firebase app but I got the following error. Everything is working on android side as well.
Unhandled Exception: MissingPluginException(No implementation found for method Firebase#initializeCore on channel plugins.flutter.io/firebase_core) #0 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:165:7) <asynchronous suspension> #1 MethodChannel.invokeListMethod (package:flutter/src/services/platform_channel.dart:353:35) <asynchronous suspension> #2 MethodChannelFirebase._initializeCore (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:31:23) <asynchronous suspension> #3 MethodChannelFirebase.initializeApp (package:firebase_core_platform_interface/src/method_channel/method_channel_firebase.dart:73:7) <asynchronous suspension> #4 Firebase.initializeApp (package:firebase_core/src/firebase.dart:40:31) <asynchronous suspension> #5 callbackDispatcher (package:tibbicihaz/main.dart:156:5) <asynchronous suspension> 2022-06-30 20:30:24.448439+0300 Runner[2582:288684] 8.15.0 - [Firebase/Firestore][I-FST000001] WatchStream (10ddb1938) Stream error: 'Unavailable: Network connectivity changed'
My code;
`void callbackDispatcher()async {
await WidgetsFlutterBinding.ensureInitialized();
Workmanager().executeTask((task, inputData) async {
FlutterLocalNotificationsPlugin flp = FlutterLocalNotificationsPlugin();
if(task == Workmanager.iOSBackgroundTask){
stderr.writeln("The iOS background fetch was triggered");
}
try{
// error occurs here
await Firebase.initializeApp();
var android = AndroidInitializationSettings('@mipmap/ic_launcher', );
var iOS = IOSInitializationSettings();
var initSetttings = InitializationSettings(android: android, iOS: iOS);
flp.initialize(initSetttings);
var androidx = AndroidNotificationDetails('channel id', 'channel NAME',
channelDescription: 'CHANNEL DESCRIPTION',
priority: Priority.high,
playSound: true,
importance: Importance.max);
var iOSx = IOSNotificationDetails();
var platform = NotificationDetails(android: androidx, iOS: iOSx);
bool a = Get.isRegistered<CihazController>();
CihazController cihazController;
if(a){
cihazController = Get.find();
}
else{
cihazController = await Get.put(CihazController());
}
await cihazController.connect();
await cihazController.getTopicsFromUser();
log(cihazController.cihazlar.toString());
await Future.delayed(Duration(seconds: 10));
var notifs = await cihazController.notifVarMi();
log("notifvar mş");
log(notifs.toString());
if(notifs != null){
if(notifs.isNotEmpty){
for (var notif in notifs){
log(notif.toJson().toString());
log("notif var mi x");
await flp.show(DateTime.now().microsecond.toInt(), notif.str1 ?? "asd", notif.str2 ?? "asdf", platform, payload: "asdsadad");
//await _showNotificationWithDefaultSound(flp);
//await flp.show(DateTime.now().microsecond.toInt(), notif.str1, notif.str2, platform, payload: "asdsadad");
}
}
}
}
catch (e){
stderr.writeln(e.toString());
return Future.error(e);
//throw (e);
}
return Future.value(true);
});
}`
Output of flutter doctor -v
I think your problems is that:
- You cannot set all Firebase setup inside the callbackDispatcher. You have to set it up at function main().
- Make a separate class for that and call it inside callbackDispatcher. Run it from inside and put it on the top level function
Like what I made in this code using GetXController:
@pragma('vm:entry-point')
Future<void> callbackDispatcher() async {
final Cloud cloud = Get.find();
Workmanager().executeTask((task, inputData) async {
switch (task) {
case periodicTask:
await cloud.startBackingUp();
log("$periodicTask was executed");
break;
case failedTask:
log('failed task');
return Future.error('failed');
}
return Future.value(true);
});
}
I think your problems is that:
You cannot set all Firebase setup inside the callbackDispatcher. You have to set it up at function main().
Make a separate class for that and call it inside callbackDispatcher. Run it from inside and put it on the top level function
Like what I made in this code using GetXController:
@pragma('vm:entry-point') Future<void> callbackDispatcher() async { final Cloud cloud = Get.find(); Workmanager().executeTask((task, inputData) async { switch (task) { case periodicTask: await cloud.startBackingUp(); log("$periodicTask was executed"); break; case failedTask: log('failed task'); return Future.error('failed'); } return Future.value(true); }); }
You probably need to set up firebase twice. Consider a case when the main app is gone (firebase state is uninitialized) and work manager runs a periodic task. In that case, firebase needs a reinit
Hey @alperenbaskaya58! Did you follow the steps mentioned in Registered plugins section?
Updated advice in version 0.5.1 - please recheck.