示例#1
0
        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);
        }
示例#2
0
        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);
        }