Как мне получать обновления местоположения в режиме реального времени в 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
1
1
210
0

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