/// <summary> /// Gets position async with specified parameters /// </summary> /// <param name="timeout">Timeout to wait, Default Infinite</param> /// <param name="cancelToken">Cancelation token</param> /// <param name="includeHeading">If you would like to include heading</param> /// <returns>Position</returns> public async Task <Position> GetPositionAsync(TimeSpan?timeout, CancellationToken?cancelToken = null, bool includeHeading = false) { #if __IOS__ //if older then just check location, else check if background mode exists var permission = Permission.Location; // permit background updates if background location mode is enabled if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0)) { permission = Permission.LocationWhenInUse; } var hasPermission = await CheckPermissions(permission); if (!hasPermission) { throw new GeolocationException(GeolocationError.Unauthorized); } #endif var timeoutMilliseconds = timeout.HasValue ? (int)timeout.Value.TotalMilliseconds : Timeout.Infinite; if (timeoutMilliseconds <= 0 && timeoutMilliseconds != Timeout.Infinite) { throw new ArgumentOutOfRangeException(nameof(timeout), "Timeout must be positive or Timeout.Infinite"); } if (!cancelToken.HasValue) { cancelToken = CancellationToken.None; } TaskCompletionSource <Position> tcs; if (!IsListening) { var m = GetManager(); m.DesiredAccuracy = DesiredAccuracy; #if __IOS__ // permit background updates if background location mode is enabled if (UIDevice.CurrentDevice.CheckSystemVersion(9, 0)) { var backgroundModes = NSBundle.MainBundle.InfoDictionary[(NSString)"UIBackgroundModes"] as NSArray; m.AllowsBackgroundLocationUpdates = backgroundModes != null && (backgroundModes.Contains((NSString)"Location") || backgroundModes.Contains((NSString)"location")); } // always prevent location update pausing since we're only listening for a single update. if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) { m.PausesLocationUpdatesAutomatically = false; } #endif tcs = new TaskCompletionSource <Position>(m); var singleListener = new GeolocationSingleUpdateDelegate(m, DesiredAccuracy, includeHeading, timeoutMilliseconds, cancelToken.Value); m.Delegate = singleListener; #if __IOS__ || __MACOS__ m.StartUpdatingLocation(); #elif __TVOS__ m.RequestLocation(); #endif #if __IOS__ if (includeHeading && SupportsHeading) { m.StartUpdatingHeading(); } #endif return(await singleListener.Task); } tcs = new TaskCompletionSource <Position>(); if (lastPosition == null) { if (cancelToken != CancellationToken.None) { cancelToken.Value.Register(() => tcs.TrySetCanceled()); } EventHandler <PositionErrorEventArgs> gotError = null; gotError = (s, e) => { tcs.TrySetException(new GeolocationException(e.Error)); PositionError -= gotError; }; PositionError += gotError; EventHandler <PositionEventArgs> gotPosition = null; gotPosition = (s, e) => { tcs.TrySetResult(e.Position); PositionChanged -= gotPosition; }; PositionChanged += gotPosition; } else { tcs.SetResult(lastPosition); } return(await tcs.Task); }
/// <inheritdoc/> public Task<Position> GetPositionAsync(int timeoutMilliseconds = Timeout.Infinite, CancellationToken? cancelToken = null, bool includeHeading = false) { if (timeoutMilliseconds <= 0 && timeoutMilliseconds != Timeout.Infinite) throw new ArgumentOutOfRangeException("timeoutMilliseconds", "Timeout must be positive or Timeout.Infinite"); if (!cancelToken.HasValue) cancelToken = CancellationToken.None; TaskCompletionSource<Position> tcs; if (!IsListening) { var m = GetManager(); if (UIDevice.CurrentDevice.CheckSystemVersion (9, 0)) { m.AllowsBackgroundLocationUpdates = AllowsBackgroundUpdates; } if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) { m.PausesLocationUpdatesAutomatically = PausesLocationUpdatesAutomatically; } tcs = new TaskCompletionSource<Position> (m); var singleListener = new GeolocationSingleUpdateDelegate(m, DesiredAccuracy, includeHeading, timeoutMilliseconds, cancelToken.Value); m.Delegate = singleListener; m.StartUpdatingLocation (); if (includeHeading && SupportsHeading) m.StartUpdatingHeading (); return singleListener.Task; } else { tcs = new TaskCompletionSource<Position>(); if (this.position == null) { EventHandler<PositionErrorEventArgs> gotError = null; gotError = (s,e) => { tcs.TrySetException (new GeolocationException (e.Error)); PositionError -= gotError; }; PositionError += gotError; EventHandler<PositionEventArgs> gotPosition = null; gotPosition = (s, e) => { tcs.TrySetResult (e.Position); PositionChanged -= gotPosition; }; PositionChanged += gotPosition; } else tcs.SetResult (this.position); } return tcs.Task; }
/// <inheritdoc/> public Task<Position> GetPositionAsync(int timeoutMilliseconds = Timeout.Infinite, CancellationToken? cancelToken = null, bool includeHeading = false) { if (timeoutMilliseconds <= 0 && timeoutMilliseconds != Timeout.Infinite) throw new ArgumentOutOfRangeException("timeoutMilliseconds", "Timeout must be positive or Timeout.Infinite"); if (!cancelToken.HasValue) cancelToken = CancellationToken.None; TaskCompletionSource<Position> tcs; if (!IsListening) { var m = GetManager(); // permit background updates if background location mode is enabled if (UIDevice.CurrentDevice.CheckSystemVersion(9, 0)) { NSArray backgroundModes = NSBundle.MainBundle.InfoDictionary[(NSString)"UIBackgroundModes"] as NSArray; m.AllowsBackgroundLocationUpdates = backgroundModes != null && (backgroundModes.Contains((NSString)"Location") || backgroundModes.Contains((NSString)"location")); } // always prevent location update pausing since we're only listening for a single update. if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) m.PausesLocationUpdatesAutomatically = false; tcs = new TaskCompletionSource<Position>(m); var singleListener = new GeolocationSingleUpdateDelegate(m, DesiredAccuracy, includeHeading, timeoutMilliseconds, cancelToken.Value); m.Delegate = singleListener; m.StartUpdatingLocation(); if (includeHeading && SupportsHeading) m.StartUpdatingHeading(); return singleListener.Task; } tcs = new TaskCompletionSource<Position>(); if (position == null) { EventHandler<PositionErrorEventArgs> gotError = null; gotError = (s, e) => { tcs.TrySetException(new GeolocationException(e.Error)); PositionError -= gotError; }; PositionError += gotError; EventHandler<PositionEventArgs> gotPosition = null; gotPosition = (s, e) => { tcs.TrySetResult(e.Position); PositionChanged -= gotPosition; }; PositionChanged += gotPosition; } else tcs.SetResult(position); return tcs.Task; }
/// <summary> /// Gets position async with specified parameters /// </summary> /// <param name="timeout">Timeout to wait, Default Infinite</param> /// <param name="cancelToken">Cancelation token</param> /// <param name="includeHeading">If you would like to include heading</param> /// <returns>Position</returns> public async Task <Position> GetPositionAsync(TimeSpan?timeout, CancellationToken?cancelToken = null, bool includeHeading = false) { #if __IOS__ var permission = Permission.LocationWhenInUse; var hasPermission = await CheckPermissions(permission); if (!hasPermission) { throw new GeolocationException(GeolocationError.Unauthorized); } #endif var timeoutMilliseconds = timeout.HasValue ? (int)timeout.Value.TotalMilliseconds : Timeout.Infinite; if (timeoutMilliseconds <= 0 && timeoutMilliseconds != Timeout.Infinite) { throw new ArgumentOutOfRangeException(nameof(timeout), "Timeout must be positive or Timeout.Infinite"); } if (!cancelToken.HasValue) { cancelToken = CancellationToken.None; } TaskCompletionSource <Position> tcs; if (!IsListening) { var m = GetManager(); m.DesiredAccuracy = DesiredAccuracy; tcs = new TaskCompletionSource <Position>(m); var singleListener = new GeolocationSingleUpdateDelegate(m, DesiredAccuracy, includeHeading, timeoutMilliseconds, cancelToken.Value); m.Delegate = singleListener; #if __IOS__ || __MACOS__ m.StartUpdatingLocation(); #elif __TVOS__ m.RequestLocation(); #endif #if __IOS__ if (includeHeading && SupportsHeading) { m.StartUpdatingHeading(); } #endif return(await singleListener.Task); } tcs = new TaskCompletionSource <Position>(); if (lastPosition == null) { if (cancelToken != CancellationToken.None) { cancelToken.Value.Register(() => tcs.TrySetCanceled()); } EventHandler <PositionErrorEventArgs> gotError = null; gotError = (s, e) => { tcs.TrySetException(new GeolocationException(e.Error)); PositionError -= gotError; }; PositionError += gotError; EventHandler <PositionEventArgs> gotPosition = null; gotPosition = (s, e) => { tcs.TrySetResult(e.Position); PositionChanged -= gotPosition; }; PositionChanged += gotPosition; } else { tcs.SetResult(lastPosition); } return(await tcs.Task); }
/// <inheritdoc/> public Task <Position> GetPositionAsync(int timeoutMilliseconds = Timeout.Infinite, CancellationToken?cancelToken = null, bool includeHeading = false) { if (timeoutMilliseconds <= 0 && timeoutMilliseconds != Timeout.Infinite) { throw new ArgumentOutOfRangeException("timeoutMilliseconds", "Timeout must be positive or Timeout.Infinite"); } if (!cancelToken.HasValue) { cancelToken = CancellationToken.None; } TaskCompletionSource <Position> tcs; if (!IsListening) { var m = GetManager(); // permit background updates if background location mode is enabled if (UIDevice.CurrentDevice.CheckSystemVersion(9, 0)) { NSArray backgroundModes = NSBundle.MainBundle.InfoDictionary[(NSString)"UIBackgroundModes"] as NSArray; m.AllowsBackgroundLocationUpdates = backgroundModes.Contains((NSString)"Location") || backgroundModes.Contains((NSString)"location"); } // always prevent location update pausing since we're only listening for a single update. if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) { m.PausesLocationUpdatesAutomatically = false; } tcs = new TaskCompletionSource <Position>(m); var singleListener = new GeolocationSingleUpdateDelegate(m, DesiredAccuracy, includeHeading, timeoutMilliseconds, cancelToken.Value); m.Delegate = singleListener; m.StartUpdatingLocation(); if (includeHeading && SupportsHeading) { m.StartUpdatingHeading(); } return(singleListener.Task); } tcs = new TaskCompletionSource <Position>(); if (position == null) { EventHandler <PositionErrorEventArgs> gotError = null; gotError = (s, e) => { tcs.TrySetException(new GeolocationException(e.Error)); PositionError -= gotError; }; PositionError += gotError; EventHandler <PositionEventArgs> gotPosition = null; gotPosition = (s, e) => { tcs.TrySetResult(e.Position); PositionChanged -= gotPosition; }; PositionChanged += gotPosition; } else { tcs.SetResult(position); } return(tcs.Task); }