diff --git a/Libraries/Geolocation/Geolocation.js b/Libraries/Geolocation/Geolocation.js index 251666f4b1f9c1..7efa7b9e88c2e9 100644 --- a/Libraries/Geolocation/Geolocation.js +++ b/Libraries/Geolocation/Geolocation.js @@ -26,6 +26,10 @@ const PermissionsAndroid = require('PermissionsAndroid'); var subscriptions = []; var updatesEnabled = false; +type GeoConfiguration = { + skipPermissionRequests: bool; +} + type GeoOptions = { timeout?: number, maximumAge?: number, @@ -75,6 +79,25 @@ type GeoOptions = { */ var Geolocation = { + /* + * Sets configuration options that will be used in all location requests. + * + * ### Options + * + * #### iOS + * + * - `skipPermissionRequests` - defaults to `false`, if `true` you must request permissions + * before using Geolocation APIs. + * + */ + setRNConfiguration: function( + config: GeoConfiguration + ) { + if (RCTLocationObserver.setConfiguration) { + RCTLocationObserver.setConfiguration(config); + } + }, + /* * Request suitable Location permission based on the key configured on pList. * If NSLocationAlwaysUsageDescription is set, it will request Always authorization, diff --git a/Libraries/Geolocation/RCTLocationObserver.m b/Libraries/Geolocation/RCTLocationObserver.m index f30a7b9dd736bb..4ea8a57dc1ea56 100644 --- a/Libraries/Geolocation/RCTLocationObserver.m +++ b/Libraries/Geolocation/RCTLocationObserver.m @@ -27,6 +27,10 @@ typedef NS_ENUM(NSInteger, RCTPositionErrorCode) { #define RCT_DEFAULT_LOCATION_ACCURACY kCLLocationAccuracyHundredMeters +typedef struct { + BOOL skipPermissionRequests; +} RCTLocationConfiguration; + typedef struct { double timeout; double maximumAge; @@ -37,6 +41,15 @@ typedef NS_ENUM(NSInteger, RCTPositionErrorCode) { @implementation RCTConvert (RCTLocationOptions) ++ (RCTLocationConfiguration)RCTLocationConfiguration:(id)json +{ + NSDictionary *options = [RCTConvert NSDictionary:json]; + + return (RCTLocationConfiguration) { + .skipPermissionRequests = [RCTConvert BOOL:options[@"skipPermissionRequests"]] + }; +} + + (RCTLocationOptions)RCTLocationOptions:(id)json { NSDictionary *options = [RCTConvert NSDictionary:json]; @@ -111,6 +124,7 @@ @implementation RCTLocationObserver NSMutableArray *_pendingRequests; BOOL _observingLocation; BOOL _usingSignificantChanges; + RCTLocationConfiguration _locationConfiguration; RCTLocationOptions _observerOptions; } @@ -141,7 +155,9 @@ - (dispatch_queue_t)methodQueue - (void)beginLocationUpdatesWithDesiredAccuracy:(CLLocationAccuracy)desiredAccuracy distanceFilter:(CLLocationDistance)distanceFilter useSignificantChanges:(BOOL)useSignificantChanges { - [self requestAuthorization]; + if (!_locationConfiguration.skipPermissionRequests) { + [self requestAuthorization]; + } _locationManager.distanceFilter = distanceFilter; _locationManager.desiredAccuracy = desiredAccuracy; @@ -172,6 +188,11 @@ - (void)timeout:(NSTimer *)timer #pragma mark - Public API +RCT_EXPORT_METHOD(setConfiguration:(RCTLocationConfiguration)config) +{ + _locationConfiguration = config; +} + RCT_EXPORT_METHOD(requestAuthorization) { if (!_locationManager) {