static async Task <GeoPosition> TryGetCurrentPosition(double desiredAccuracy, int timeout) { if (!IsTracking) { return(await ObtainCurrentPosition(desiredAccuracy, timeout)); } var source = new TaskCompletionSource <GeoPosition>(); // We're already listening, just use the current listener if (LastPosition == null) { Task gotPosition(GeoPosition p) { source.TrySetResult(p); PositionChanged.RemoveHandler(gotPosition); return(Task.CompletedTask); } PositionChanged.Handle(gotPosition); } else { source.TrySetResult(LastPosition); } return(await source.Task); }
static async Task <GeoPosition> TryGetCurrentPosition(double desiredAccuracy, int timeout) { TaskCompletionSource <GeoPosition> tcs; if (!IsTracking) { var manager = await CreateManager(); if (manager == null) { return(null); } if (await Device.Permissions.Check(Permission.BackgroundLocation) == PermissionResult.Granted) { manager.AllowsBackgroundLocationUpdates = true; } // We need a single update. if (Device.OS.IsAtLeastiOS(6)) { manager.PausesLocationUpdatesAutomatically = false; } tcs = new TaskCompletionSource <GeoPosition>(manager); using (var singleListener = new GeoLocationSingleUpdateDelegate(manager, desiredAccuracy, timeout)) { manager.AuthorizationChanged += (object sender, CLAuthorizationChangedEventArgs e) => singleListener.AuthorizationChanged(manager, e.Status); manager.Failed += (object sender, NSErrorEventArgs e) => singleListener.Failed(manager, e.Error); manager.UpdatedHeading += (object sender, CLHeadingUpdatedEventArgs e) => singleListener.UpdatedHeading(manager, e.NewHeading); manager.UpdatedLocation += (object sender, CLLocationUpdatedEventArgs e) => singleListener.UpdatedLocation(manager, e.NewLocation, e.OldLocation); manager.StartUpdatingLocation(); var result = await singleListener.TaskSource.Task; } } tcs = new TaskCompletionSource <GeoPosition>(); Task gotError(Exception ex) { tcs.TrySetException(ex); PositionError.RemoveHandler(gotError); return(Task.CompletedTask); } PositionError.Handle(gotError); Task gotPosition(GeoPosition position) { tcs.TrySetResult(position); PositionChanged.RemoveHandler(gotPosition); return(Task.CompletedTask); } PositionChanged.Handle(gotPosition); return(await tcs.Task); }