Background
unknown
dart
a year ago
6.2 kB
4
Indexable
Never
import 'dart:async'; import 'dart:developer'; import 'dart:io'; import 'dart:ui'; import 'package:device_info_plus/device_info_plus.dart'; // import 'package:easy_localization/easy_localization.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/material.dart'; import 'package:flutter_background_service_android/flutter_background_service_android.dart'; import 'package:flutter_background_service/flutter_background_service.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:to_walk/features/count_step/daily_bloc.dart'; // import 'package:to_walk/features/home/view.dart'; import 'package:to_walk/shared/foundation/helpers/functions/locator.dart'; import 'package:to_walk/shared/foundation/services/preferences_service.dart'; Future<void> initializeServiceGeneral() async { final service = FlutterBackgroundService(); /// OPTIONAL, using custom notification channel id const AndroidNotificationChannel channel = AndroidNotificationChannel( 'daily_step_foreground', // id '2Walk FOREGROUND SERVICE', // title description: 'This channel is used for important notifications.', // description importance: Importance.low, // importance must be at low or higher level ); final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); if (!locator.isRegistered<PreferencesService>()) { await setupLocator(); } if (Platform.isIOS) { // await flutterLocalNotificationsPlugin.initialize( // const InitializationSettings( // iOS: IOSInitializationSettings(), // ), // ); } await flutterLocalNotificationsPlugin .resolvePlatformSpecificImplementation< AndroidFlutterLocalNotificationsPlugin>() ?.createNotificationChannel(channel); await service.configure( androidConfiguration: AndroidConfiguration( // this will be executed when app is in foreground or background in separated isolate onStart: onStart, // auto start service autoStart: true, isForegroundMode: true, notificationChannelId: 'daily_step_foreground', initialNotificationTitle: '2Walk', initialNotificationContent: 'Initializing', foregroundServiceNotificationId: 888, ), iosConfiguration: IosConfiguration( // auto start service autoStart: true, // this will be executed when app is in foreground in separated isolate onForeground: onStart, // you have to enable background fetch capability on xcode project onBackground: onIosBackground, ), ); service.startService(); } // to ensure this is executed // run app from xcode, then from xcode menu, select Simulate Background Fetch @pragma('vm:entry-point') Future<bool> onIosBackground(ServiceInstance service) async { WidgetsFlutterBinding.ensureInitialized(); DartPluginRegistrant.ensureInitialized(); SharedPreferences preferences = await SharedPreferences.getInstance(); await preferences.reload(); final log = preferences.getStringList('log') ?? <String>[]; log.add(DateTime.now().toIso8601String()); await preferences.setStringList('log', log); return true; } @pragma('vm:entry-point') void onStart(ServiceInstance service) async { // Only available for flutter 3.0.0 and later DartPluginRegistrant.ensureInitialized(); // For flutter prior to version 3.0.0 // We have to register the plugin manually await setupLocator(); await Firebase.initializeApp(); log("message_onStart 2"); // For flutter prior to version 3.0.0 // We have to register the plugin manually // final bloc = locator<StepCounterBloc>(); // PreferencesService prefs = locator<PreferencesService>(); final blocDaily = locator<DailyStepCounterBloc>(); blocDaily.initPlatformState(); /// OPTIONAL when use custom notification final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); if (service is AndroidServiceInstance) { service.on('setAsForeground').listen((event) { service.setAsForegroundService(); }); service.on('setAsBackground').listen((event) { service.setAsBackgroundService(); }); } service.on('stopService').listen((event) { service.stopSelf(); }); // bring to foreground Timer.periodic(const Duration(seconds: 1), (timer) async { if (service is AndroidServiceInstance) { if (await service.isForegroundService()) { PreferencesService pref = locator<PreferencesService>(); log('stepCountToday = ${pref.stepCountToday.toString()} v3'); /// OPTIONAL for use custom notification /// the notification id must be equals with AndroidConfiguration when you call configure() method. flutterLocalNotificationsPlugin.show( 888, '2walk', // '${'Addımlarınız hesablanır'} ${pref.stepCountToday}👣', '${'Addımlarınız hesablanır'} 👣', const NotificationDetails( android: AndroidNotificationDetails( 'daily_step_foreground', '2Walk FOREGROUND SERVICE', icon: 'ic_bg_service_small', ongoing: true, ), ), ); // if you don't using custom notification, uncomment this // service.setForegroundNotificationInfo( // title: "My App Service", // content: "Updated at ${DateTime.now()}", // ); } } /// you can see this log in logcat log('2Walk BACKGROUND SERVICE: ${DateTime.now()}'); // test using external plugin final deviceInfo = DeviceInfoPlugin(); String? device; if (Platform.isAndroid) { final androidInfo = await deviceInfo.androidInfo; device = androidInfo.model; } if (Platform.isIOS) { final iosInfo = await deviceInfo.iosInfo; device = iosInfo.model; } service.invoke( 'update', { "current_date": DateTime.now().toIso8601String(), "device": device, }, ); }); }