Как мне получать обновления местоположения в режиме реального времени в UWP, когда мое приложение работает в фоновом режиме?

Проект, над которым я работаю, поддерживает отслеживание местоположения, и недавно мы приняли решение добавить поддержку отслеживания местоположения, пока наше приложение работает в фоновом режиме. Мы поддерживаем следующие платформы: iOS, Android и UWP. Как следует из названия, мне нужна помощь в реализации этой функции в UWP (как на компьютере, так и на телефоне). Мне было интересно, может ли кто-нибудь помочь мне или указать мне код для того, кто написал приложение GPS / отслеживания бега для UWP.

Я экспериментировал как с сеансами расширенного выполнения, так и с фоновыми задачами. Фактически, в настоящее время я использую оба в своем приложении, и ни одному из них не удалось добиться фонового отслеживания для работы в UWP. Используемая нами служба определения местоположения представляет собой специальный код, основанный на MvvmCross Наблюдатель за расположением UWP. Для справки несколько отрывков из проекта App.xaml.cs:

// This method is associated with the LeavingBackground event
private async void WillEnterForeground(object sender, LeavingBackgroundEventArgs e)
{
        if (_trackingNotificationTask == null)
        {
            await BackgroundExecutionManager.RequestAccessAsync();
            RegisterTrackingNotificationTask();
        }

        if (_backgroundTrackingSession == null)
        {
            using (var backgroundSession = new ExtendedExecutionSession())
            {
                backgroundSession.Reason = ExtendedExecutionReason.LocationTracking;
                backgroundSession.Description = "Track Responder Location in Background";
                backgroundSession.Revoked += OnSessionRevoked;

                var result = await backgroundSession.RequestExtensionAsync();

                switch (result)
                {
                    case ExtendedExecutionResult.Allowed:
                        _backgroundTrackingSession = backgroundSession;
                        break;
                }
            }
        }

        var locationService = Mvx.Resolve<ILocationService>();
        locationService?.Resume();

        if (_appInBackground)
        {
            ClearAllNotifications();

            if (_backgroundTrackingTask != null)
            {
                _backgroundTrackingTask.Unregister(true);
                _backgroundTrackingTask = null;
            }

            await Mvx.Resolve<IEventInformationSyncService>().SyncUserSetting();
            await Mvx.Resolve<IAppService>().IsMobileStatusGood();
            _appInBackground = false;
        }
}

// This Method is associated with the EnteredBackground event
private void DidEnterBackground(object sender, EnteredBackgroundEventArgs e)
{
        var deferral = e.GetDeferral();

        // Request permission for background tracking
        RegisterBackgroundTrackingTask();

        var appSettingService = Mvx.Resolve<IAppSettingService>();

        if (!NeedToUpgradeWindows() && Core.App.IsResponderTrackingEnabled()) // Are we in an event and is responder tracking enabled?
        {
            ShowNotification();
        }

        _appInBackground = true;

        deferral.Complete();
}

private void RegisterBackgroundTrackingTask()
{
        if (NeedToUpgradeWindows())
        {
            if (!_shownUpgradeMessage)
            {
                Mvx.Resolve<IUserInteraction>().Alert("Your current windows version does not support background tasks. Please upgrade to windows version 1709 or above to utilize background tasks.", () => { _shownUpgradeMessage = true; });
            }
            return;
        }
        var backgroundTrackingBuilder = new BackgroundTaskBuilder()
        {
            Name = BackgroundTrackingTask.Name,
            TaskEntryPoint = typeof(BackgroundTrackingTask).FullName,
            IsNetworkRequested = true
        };

        backgroundTrackingBuilder.SetTrigger(new TimeTrigger(15, false));
        _backgroundTrackingTask = backgroundTrackingBuilder.Register();

        _backgroundTrackingTask.Completed += OnBackgroundTrackingTaskCompleted;


}

private void RegisterTrackingNotificationTask()
{
        if (NeedToUpgradeWindows())
        {
            if (!_shownUpgradeMessage)
            {
                Mvx.Resolve<IUserInteraction>().Alert("Your current windows version does not support background tasks. Please upgrade to windows version 1709 or above to utilize background tasks.", () => { _shownUpgradeMessage = true; });
            }
            return;
        }
        if (IsTaskRegistered(TrackingNotificationHandlerTask.Name))
        {
            return;
        }
        var notificationTaskBuilder = new BackgroundTaskBuilder()
        {
            Name = TrackingNotificationHandlerTask.Name,
            TaskEntryPoint = typeof(TrackingNotificationHandlerTask).FullName
        };

        notificationTaskBuilder.SetTrigger(new ToastNotificationActionTrigger());
        _trackingNotificationTask = notificationTaskBuilder.Register();

        _trackingNotificationTask.Completed += OnNotificationActivated;
}

private void OnBackgroundTrackingTaskCompleted(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
{
        var settingValues = ApplicationData.Current.LocalSettings.Values;

        var success = (bool)settingValues["Success"];

        if (success)
        {
            var locationService = Mvx.Resolve<ILocationService>();

            var location = new MvxGeoLocation
            {
                Coordinates = new MvxCoordinates
                {
                    Latitude = (double)settingValues["Latitude"],
                    Longitude = (double)settingValues["Longitude"],
                    Accuracy = (double)settingValues["Accuracy"]
                },
                Timestamp = new DateTimeOffset(DateTime.Parse((string)settingValues["Time"]))
            };

            locationService.OnLocation(location, true);
        }
}

private void OnNotificationActivated(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
{
        var settings = ApplicationData.Current.LocalSettings;
        var action = (string)settings.Values["NotificationAction"];

        var locationService = Mvx.Resolve<ILocationService>();

        switch (action)
        {
            case "pause":
                locationService?.ClearResponderTrackingOptions();
                break;
            case "resume":
                locationService?.RecycleResponderTracking();
                break;
        }

        ClearAllNotifications();
        ShowNotification();
}

Заранее всем большое спасибо. Пожалуйста, дайте мне знать, если вам еще что-нибудь понадобится!

Исходя из этот ответ, лучший способ получить информацию о текущем местоположении в реальном времени - использовать Extended Execution. и отслеживание местоположения поддерживается сеансом. Я не мог понять, в чем проблема с вашим кодом, похоже, это правильно. Пожалуйста, проверьте этот блог, в котором подробно описывается сценарий использования Extended Execution.

Nico Zhu - MSFT 14.09.2018 08:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
210
0

Другие вопросы по теме