Skip to content
This repository was archived by the owner on May 15, 2024. It is now read-only.

Commit 6f527db

Browse files
authored
Merge pull request #1739 from leonluc-dev/LocationAccuracyHandling
Added support for reduced accuracy detection on iOS 14
2 parents d521376 + abb0864 commit 6f527db

File tree

7 files changed

+36
-4
lines changed

7 files changed

+36
-4
lines changed

DeviceTests/DeviceTests.Shared/Geolocation_Tests.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,13 @@ await MainThread.InvokeOnMainThreadAsync(async () =>
6969
});
7070

7171
var request = new GeolocationRequest(GeolocationAccuracy.Best);
72+
request.RequestFullAccuracy = true;
7273
var location = await Geolocation.GetLocationAsync(request);
7374

7475
Assert.NotNull(location);
7576

7677
Assert.True(location.Accuracy > 0);
78+
Assert.False(location.ReducedAccuracy);
7779
Assert.NotEqual(0.0, location.Latitude);
7880
Assert.NotEqual(0.0, location.Longitude);
7981

Xamarin.Essentials/Geolocation/Geolocation.ios.macos.cs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,14 @@ static async Task<Location> PlatformLastKnownLocationAsync()
1919
var manager = new CLLocationManager();
2020
var location = manager.Location;
2121

22-
return location?.ToLocation();
22+
var reducedAccuracy = false;
23+
#if __IOS__
24+
if (Platform.HasOSVersion(14, 0))
25+
{
26+
reducedAccuracy = manager.AccuracyAuthorization == CLAccuracyAuthorization.ReducedAccuracy;
27+
}
28+
#endif
29+
return location?.ToLocation(reducedAccuracy);
2330
}
2431

2532
static async Task<Location> PlatformLocationAsync(GeolocationRequest request, CancellationToken cancellationToken)
@@ -51,9 +58,22 @@ static async Task<Location> PlatformLocationAsync(GeolocationRequest request, Ca
5158

5259
manager.StartUpdatingLocation();
5360

61+
var reducedAccuracy = false;
62+
#if __IOS__
63+
if (Platform.HasOSVersion(14, 0))
64+
{
65+
if (request.RequestFullAccuracy && manager.AccuracyAuthorization == CLAccuracyAuthorization.ReducedAccuracy)
66+
{
67+
await manager.RequestTemporaryFullAccuracyAuthorizationAsync("XamarinEssentialsFullAccuracyUsageDescription");
68+
}
69+
70+
reducedAccuracy = manager.AccuracyAuthorization == CLAccuracyAuthorization.ReducedAccuracy;
71+
}
72+
#endif
73+
5474
var clLocation = await tcs.Task;
5575

56-
return clLocation?.ToLocation();
76+
return clLocation?.ToLocation(reducedAccuracy);
5777

5878
void HandleLocation(CLLocation location)
5979
{

Xamarin.Essentials/Geolocation/GeolocationRequest.shared.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ public GeolocationRequest(GeolocationAccuracy accuracy, TimeSpan timeout)
5757

5858
public GeolocationAccuracy DesiredAccuracy { get; set; }
5959

60+
public bool RequestFullAccuracy { get; set; }
61+
6062
public override string ToString() =>
6163
$"{nameof(DesiredAccuracy)}: {DesiredAccuracy}, {nameof(Timeout)}: {Timeout}";
6264
}

Xamarin.Essentials/Types/Location.shared.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public Location(Location point)
5858
Altitude = point.Altitude;
5959
Accuracy = point.Accuracy;
6060
VerticalAccuracy = point.VerticalAccuracy;
61+
ReducedAccuracy = point.ReducedAccuracy;
6162
Speed = point.Speed;
6263
Course = point.Course;
6364
IsFromMockProvider = point.IsFromMockProvider;
@@ -75,6 +76,8 @@ public Location(Location point)
7576

7677
public double? VerticalAccuracy { get; set; }
7778

79+
public bool ReducedAccuracy { get; set; }
80+
7881
public double? Speed { get; set; }
7982

8083
public double? Course { get; set; }

Xamarin.Essentials/Types/LocationExtensions.android.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ internal static Location ToLocation(this AndroidLocation location) =>
3434
#else
3535
default(float?),
3636
#endif
37+
ReducedAccuracy = false,
3738
Course = location.HasBearing ? location.Bearing : default(double?),
3839
Speed = location.HasSpeed ? location.Speed : default(double?),
3940
#pragma warning disable CS0618 // Type or member is obsolete

Xamarin.Essentials/Types/LocationExtensions.ios.tvos.watchos.macos.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,22 @@ internal static Location ToLocation(this CLPlacemark placemark) =>
1818
Longitude = placemark.Location.Coordinate.Longitude,
1919
Altitude = placemark.Location.Altitude,
2020
AltitudeReferenceSystem = AltitudeReferenceSystem.Geoid,
21-
Timestamp = DateTimeOffset.UtcNow
21+
Timestamp = DateTimeOffset.UtcNow,
22+
ReducedAccuracy = false,
2223
};
2324

2425
internal static IEnumerable<Location> ToLocations(this IEnumerable<CLPlacemark> placemarks) =>
2526
placemarks?.Select(a => a.ToLocation());
2627

27-
internal static Location ToLocation(this CLLocation location) =>
28+
internal static Location ToLocation(this CLLocation location, bool reducedAccuracy) =>
2829
new Location
2930
{
3031
Latitude = location.Coordinate.Latitude,
3132
Longitude = location.Coordinate.Longitude,
3233
Altitude = location.VerticalAccuracy < 0 ? default(double?) : location.Altitude,
3334
Accuracy = location.HorizontalAccuracy,
3435
VerticalAccuracy = location.VerticalAccuracy,
36+
ReducedAccuracy = reducedAccuracy,
3537
Timestamp = location.Timestamp.ToDateTime(),
3638
#if __IOS__ || __WATCHOS__
3739
Course = location.Course < 0 ? default(double?) : location.Course,

Xamarin.Essentials/Types/LocationExtensions.uwp.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ internal static Location ToLocation(this Geoposition location) =>
3434
Altitude = location.Coordinate.Point.Position.Altitude,
3535
Accuracy = location.Coordinate.Accuracy,
3636
VerticalAccuracy = location.Coordinate.AltitudeAccuracy,
37+
ReducedAccuracy = false,
3738
Speed = (!location.Coordinate.Speed.HasValue || double.IsNaN(location.Coordinate.Speed.Value)) ? default : location.Coordinate.Speed,
3839
Course = (!location.Coordinate.Heading.HasValue || double.IsNaN(location.Coordinate.Heading.Value)) ? default : location.Coordinate.Heading,
3940
IsFromMockProvider = false,
@@ -49,6 +50,7 @@ internal static Location ToLocation(this Geocoordinate coordinate) =>
4950
Altitude = coordinate.Point.Position.Altitude,
5051
Accuracy = coordinate.Accuracy,
5152
VerticalAccuracy = coordinate.AltitudeAccuracy,
53+
ReducedAccuracy = false,
5254
Speed = (!coordinate.Speed.HasValue || double.IsNaN(coordinate.Speed.Value)) ? default : coordinate.Speed,
5355
Course = (!coordinate.Heading.HasValue || double.IsNaN(coordinate.Heading.Value)) ? default : coordinate.Heading,
5456
AltitudeReferenceSystem = coordinate.Point.AltitudeReferenceSystem.ToEssentials()

0 commit comments

Comments
 (0)