Как правильно запрашивать разрешения на определение местоположения для фоновых обновлений местоположения во Flutter? ⇐ IOS
Как правильно запрашивать разрешения на определение местоположения для фоновых обновлений местоположения во Flutter?
Я работаю над приложением Flutter, которому необходимо получать данные о местоположении в фоновом режиме как для iOS, так и для Android. Я обновил свои info.plist и AndroidManifest.xml с необходимыми разрешениями и включил геолокатор и workmanager пакеты. Однако я не уверен, правильно ли я настроил фоновую загрузку для обеих платформ.
Вот как я настроил свой info.plist:
NSLocationAlwaysAndWhenInUseUsageDescription Информация о местоположении необходима для проверки географических координат при отправке случайной посещаемости NSLocationWhenInUseUsageDescription Информация о местоположении необходима для проверки географических координат при отправке информации о посещаемости UIBackgroundModes выбрать местоположение обработка И для Android в AndroidManifest.xml:
Я также включил пакеты геолокатора и менеджера работ в свой pubspec.yml:
геолокатор: ^11.0.0 руководитель работ: ^0.5.2 Вот фрагмент кода Dart, с которым я работаю в main.dart. Я пытаюсь инициализировать фоновую задачу для получения обновлений о местоположении, но не уверен, правильно ли я ее настроил. Может ли кто-нибудь проверить, правильно ли реализована инициализация моей задачи и обработка обратного вызова для Flutter?
import 'dart:async'; импортировать «пакет: флаттер/материал.dart»; импортировать «пакет: flutter/services.dart»; импортировать «пакет: smartrac_blue_dart/splashscreen/splashscreen.dart»; импортировать «пакет: workmanager/workmanager.dart»; импортировать «пакет: smartrac_blue_dart/database/bluedart_db.dart»; импортировать 'locationService/locationService.dart'; // Имя задачи Workmanager const fetchLocationTask = "fetchLocationTask"; недействительный callbackDispatcher() { печать('Диспетчер обратного вызова'); Workmanager().executeTask((task, inputData) async { если (задача == fetchLocationTask) { ждут LocationService().fetchAndStoreLocation(); // Вызов статического метода для фонового выполнения } вернуть Future.value(истина); }); } void main() асинхронный { ВиджетыFlutterBinding.ensureInitialized(); // Убедитесь, что Flutter инициализирован дождитесь Workmanager().initialize(callbackDispatcher); // Регистрируем периодическую задачу вар uniqueID = «uniqueLocationTask»; // Рекомендуется использовать более статический идентификатор Workmanager().registerPeriodicTask( уникальный идентификатор, выборкаLocationTask, частота: Продолжительность (минут: 2), // Скорректирована на более разумный и совместимый с платформой интервал. ); SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]).затем((_) { запуститьApp(MyApp()); }); } класс MyApp расширяет StatefulWidget { MyApp({Key? key}) : super(key: key); @переопределить _MyAppState createState() => _MyAppState(); } класс _MyAppState расширяет State { // Этот виджет является корнем вашего приложения. Строковая широта = 'Неизвестно'; Строковая долгота = 'Неизвестно'; окончательный bludartDB db_blueDart = bludartDB(); Таймер? местоположениеТаймер; @переопределить недействительный initState() { супер.initState(); // Вызов веб-сервиса здесь StartLocationUpdates(); } недействительный startLocationUpdates () { print("startLocationUpdates"); // Пример периодического запуска обновлений местоположения Timer. periodic(Duration(минут: 5), (Таймер t) async { ждут LocationService().fetchAndStoreLocation(); }); } // @переопределить // недействительный метод удаления() { // locationTimer?.cancel(); // Отменяем таймер, когда виджет удаляется // супер.dispose(); // } @переопределить Сборка виджета (контекст BuildContext) { вернуть MaterialApp( название: «SmarTrac-BD», debugShowCheckedModeBanner: ложь, тема: ThemeData( первичный образец: Colors.blue, ), домашняя страница: SplashScreen(), ); } } класс MyHomePage расширяет StatefulWidget { MyHomePage({Ключ? Ключ}): супер(ключ: ключ); @переопределить _MyHomePageState createState() => _MyHomePageState(); } класс _MyHomePageState расширяет State { @переопределить Сборка виджета (контекст BuildContext) { вернуть эшафот( AppBar: AppBar( заголовок: Текст('Классико'), ), тело: Контейнер( цвет: Colors.blue.shade200, ), ); } }
Я работаю над приложением Flutter, которому необходимо получать данные о местоположении в фоновом режиме как для iOS, так и для Android. Я обновил свои info.plist и AndroidManifest.xml с необходимыми разрешениями и включил геолокатор и workmanager пакеты. Однако я не уверен, правильно ли я настроил фоновую загрузку для обеих платформ.
Вот как я настроил свой info.plist:
NSLocationAlwaysAndWhenInUseUsageDescription Информация о местоположении необходима для проверки географических координат при отправке случайной посещаемости NSLocationWhenInUseUsageDescription Информация о местоположении необходима для проверки географических координат при отправке информации о посещаемости UIBackgroundModes выбрать местоположение обработка И для Android в AndroidManifest.xml:
Я также включил пакеты геолокатора и менеджера работ в свой pubspec.yml:
геолокатор: ^11.0.0 руководитель работ: ^0.5.2 Вот фрагмент кода Dart, с которым я работаю в main.dart. Я пытаюсь инициализировать фоновую задачу для получения обновлений о местоположении, но не уверен, правильно ли я ее настроил. Может ли кто-нибудь проверить, правильно ли реализована инициализация моей задачи и обработка обратного вызова для Flutter?
import 'dart:async'; импортировать «пакет: флаттер/материал.dart»; импортировать «пакет: flutter/services.dart»; импортировать «пакет: smartrac_blue_dart/splashscreen/splashscreen.dart»; импортировать «пакет: workmanager/workmanager.dart»; импортировать «пакет: smartrac_blue_dart/database/bluedart_db.dart»; импортировать 'locationService/locationService.dart'; // Имя задачи Workmanager const fetchLocationTask = "fetchLocationTask"; недействительный callbackDispatcher() { печать('Диспетчер обратного вызова'); Workmanager().executeTask((task, inputData) async { если (задача == fetchLocationTask) { ждут LocationService().fetchAndStoreLocation(); // Вызов статического метода для фонового выполнения } вернуть Future.value(истина); }); } void main() асинхронный { ВиджетыFlutterBinding.ensureInitialized(); // Убедитесь, что Flutter инициализирован дождитесь Workmanager().initialize(callbackDispatcher); // Регистрируем периодическую задачу вар uniqueID = «uniqueLocationTask»; // Рекомендуется использовать более статический идентификатор Workmanager().registerPeriodicTask( уникальный идентификатор, выборкаLocationTask, частота: Продолжительность (минут: 2), // Скорректирована на более разумный и совместимый с платформой интервал. ); SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, DeviceOrientation.portraitDown, ]).затем((_) { запуститьApp(MyApp()); }); } класс MyApp расширяет StatefulWidget { MyApp({Key? key}) : super(key: key); @переопределить _MyAppState createState() => _MyAppState(); } класс _MyAppState расширяет State { // Этот виджет является корнем вашего приложения. Строковая широта = 'Неизвестно'; Строковая долгота = 'Неизвестно'; окончательный bludartDB db_blueDart = bludartDB(); Таймер? местоположениеТаймер; @переопределить недействительный initState() { супер.initState(); // Вызов веб-сервиса здесь StartLocationUpdates(); } недействительный startLocationUpdates () { print("startLocationUpdates"); // Пример периодического запуска обновлений местоположения Timer. periodic(Duration(минут: 5), (Таймер t) async { ждут LocationService().fetchAndStoreLocation(); }); } // @переопределить // недействительный метод удаления() { // locationTimer?.cancel(); // Отменяем таймер, когда виджет удаляется // супер.dispose(); // } @переопределить Сборка виджета (контекст BuildContext) { вернуть MaterialApp( название: «SmarTrac-BD», debugShowCheckedModeBanner: ложь, тема: ThemeData( первичный образец: Colors.blue, ), домашняя страница: SplashScreen(), ); } } класс MyHomePage расширяет StatefulWidget { MyHomePage({Ключ? Ключ}): супер(ключ: ключ); @переопределить _MyHomePageState createState() => _MyHomePageState(); } класс _MyHomePageState расширяет State { @переопределить Сборка виджета (контекст BuildContext) { вернуть эшафот( AppBar: AppBar( заголовок: Текст('Классико'), ), тело: Контейнер( цвет: Colors.blue.shade200, ), ); } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение