flutter_workmanager icon indicating copy to clipboard operation
flutter_workmanager copied to clipboard

Firebasecore missing plugin exception on ios when task running🐞

Open alperenbaskaya58 opened this issue 3 years ago • 3 comments

  • [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

alperenbaskaya58 avatar Jun 30 '22 17:06 alperenbaskaya58

I think your problems is that:

  1. You cannot set all Firebase setup inside the callbackDispatcher. You have to set it up at function main().
  2. 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);
  });
}

gOzaru avatar Aug 01 '22 06:08 gOzaru

I think your problems is that:

  1. You cannot set all Firebase setup inside the callbackDispatcher. You have to set it up at function main().

  2. 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

ened avatar Aug 06 '22 09:08 ened

Hey @alperenbaskaya58! Did you follow the steps mentioned in Registered plugins section?

korzonkiee avatar Sep 14 '22 07:09 korzonkiee

Updated advice in version 0.5.1 - please recheck.

ened avatar Oct 23 '22 17:10 ened