flutter_in_app_update icon indicating copy to clipboard operation
flutter_in_app_update copied to clipboard

InAppUpdate.checkForUpdate 10 crashes from 10 user

Open ProZhar opened this issue 8 months ago • 1 comments

In my case when:

  • run debug mode - works
  • run release mode - works
  • download from internal app testing in Google Play - works

But when I added the app bundle to release, Google Play rejected my app. I installed crashlytics and received a report today about 10 crashes on 10 users

StandardMethodCodec.decodeEnvelope (message_codecs.dart:652)
MethodChannel._invokeMethod (platform_channel.dart:310)

InAppUpdate.checkForUpdate (in_app_update.dart:62)

IAUpdateService.init (iaupdate_service.dart:11)
GetInstance.putAsync (get_instance.dart:62)
.main (main.dart:69)

Key - flutter_error_exception Value - PlatformException(TASK_FAILURE, Failed to bind to the service., null, null)

My code

void main() async {
  WidgetsBinding widgetsBinding = WidgetsFlutterBinding.ensureInitialized();

  lgS.i('FlutterNativeSplash.preserve()\n'
      '- will be removed in HomeController');
  FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);

  // Orientation
  await SystemChrome.setPreferredOrientations([
    DeviceOrientation.portraitUp,
    DeviceOrientation.portraitDown,
  ]);

  // Firebase
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  await Get.putAsync<AnalyticsService>(() => AnalyticsService().init());
  await Get.putAsync<CrashlyticsService>(() => CrashlyticsService().init());

  await Get.putAsync<IAUpdateService>(() => IAUpdateService().init());

  runApp(
    GetMaterialApp(
      debugShowCheckedModeBanner: false,
      title: Get.find<ConfigService>().title,
      // Localization
      locale: Get.find<SettingsService>().model.locale,
      fallbackLocale: L.fallbackLocale,
      translationsKeys: AppTranslation.translations,
      // Theming
      theme: Themes.lightThemeData,
      darkTheme: Themes.darkThemeData,
      themeMode: Get.find<SettingsService>().model.themeMode,
      // Routing
      initialRoute: AppPages.INITIAL,
      getPages: AppPages.routes,
      // defaultTransition: Transition.fadeIn, //TODO: определить позже defaultTransition
      // EasyLoading package
      builder: EasyLoading.init(),
    ),
  );
}

class IAUpdateService extends GetxService {
  late final AppUpdateInfo _updateInfo;

  Future<IAUpdateService> init() async {
    _updateInfo = await InAppUpdate.checkForUpdate();
    lgS.i(_updateInfo);

    return this;
  }

  @override
  void onReady() {
    if (_updateInfo.updateAvailability == UpdateAvailability.updateAvailable) {
      if (_updateInfo.flexibleUpdateAllowed) {
        lgS.i('InAppUpdate.startFlexibleUpdate()');
        InAppUpdate.startFlexibleUpdate().then((result) {
          if (result == AppUpdateResult.success) {
            Get.snackbar(
              "",
              "An update has just been downloaded.",
              duration: const Duration(hours: 1),
              mainButton: TextButton(
                child: const Text("Install"),
                onPressed: () async =>
                    await InAppUpdate.completeFlexibleUpdate(),
              ),
            );
          } else {
            //TODO обработать другие enum в analytics & crashlytics
            lgS.w(result);
          }
        }).catchError((e) {
          //TODO сделать вывод в analytics & crashlytics
          lgS.e(e, error: e);
        });
      } else if (_updateInfo.immediateUpdateAllowed) {
        lgS.i('InAppUpdate.performImmediateUpdate()');
        InAppUpdate.performImmediateUpdate()
            .then((value) => null)
            .catchError((e) {
          //TODO сделать вывод в analytics & crashlytics
          lgS.e(e, error: e);
        });
      } else {
        lgS.w('flexibleUpdateAllowed & immediateUpdateAllowed != true');
      }
    } else {
      lgS.w('updateAvailability != UpdateAvailability.updateAvailable');
    }
    super.onReady();
  }
}

Maybe this is because await InAppUpdate.checkForUpdate() is used before running the application runApp(MyApp()?

ProZhar avatar Nov 03 '23 07:11 ProZhar

Did you try changing it according to your assumption?

jonasbark avatar Nov 05 '23 09:11 jonasbark