Проект, над которым я работаю, поддерживает отслеживание местоположения, и недавно мы приняли решение добавить поддержку отслеживания местоположения, когда наше приложение находится в фоновом режиме.Мы поддерживаем следующие платформы: iOS, Android и UWP.Как видно из названия, я ищу помощь в реализации этой функции в UWP (как на компьютере, так и на телефоне).Мне было интересно, может ли кто-нибудь помочь мне или указать какой-нибудь код для кого-то, кто написал приложение GPS / Run Tracking для UWP.
Я экспериментировал как с расширенными сеансами выполнения, так и с фоновой задачей.На самом деле, я сейчас использую оба в своем приложении, и ни одному из них не повезло, если бы фоновое отслеживание работало на UWP.Служба определения местоположения, которую мы используем, представляет собой пользовательский код, основанный на MvvmCross UWP Location Watcher .Для справки некоторые выдержки из проекта 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();
}
Спасибо всем большое заранее.Пожалуйста, дайте мне знать, если вам, ребята, нужно что-нибудь еще!