diff --git a/RadarSDK/Radar.m b/RadarSDK/Radar.m index fefa312e5..4358a5f6a 100644 --- a/RadarSDK/Radar.m +++ b/RadarSDK/Radar.m @@ -1505,6 +1505,12 @@ + (void) __writeToLogBufferWithLevel:(RadarLogLevel)level type:(RadarLogType)typ } + (void)requestMotionActivityPermission { + if ([RadarState promptedForMotionUsage]) { + return; + } + if ([RadarSettings delayedMotionUsage]) { + [RadarState setPromptedForMotionUsage:YES]; + } [[RadarActivityManager sharedInstance] requestPermission]; } diff --git a/RadarSDK/RadarAPIClient.m b/RadarSDK/RadarAPIClient.m index 048abf30c..3c165900f 100644 --- a/RadarSDK/RadarAPIClient.m +++ b/RadarSDK/RadarAPIClient.m @@ -395,7 +395,9 @@ - (void)trackWithLocation:(CLLocation *_Nonnull)location } NSMutableDictionary *locationMetadata = [NSMutableDictionary new]; - if (options.useMotion) { + BOOL useMotion = options.useMotion && ([RadarState promptedForMotionUsage] || ![RadarSettings delayedMotionUsage]); + BOOL usePressure = options.usePressure && ([RadarState promptedForMotionUsage] || ![RadarSettings delayedMotionUsage]); + if (useMotion) { locationMetadata[@"motionActivityData"] = [RadarState lastMotionActivityData]; locationMetadata[@"heading"] = [RadarState lastHeadingData]; locationMetadata[@"speed"] = @(location.speed); @@ -416,13 +418,13 @@ - (void)trackWithLocation:(CLLocation *_Nonnull)location } } - if (options.usePressure) { + if (usePressure) { locationMetadata[@"altitude"] = @(location.altitude); locationMetadata[@"floor"] = @([location.floor level]); locationMetadata[@"pressureHPa"] = [RadarState lastRelativeAltitudeData]; } - if (options.usePressure || options.useMotion) { + if (usePressure || useMotion) { params[@"locationMetadata"] = locationMetadata; } diff --git a/RadarSDK/RadarLocationManager.m b/RadarSDK/RadarLocationManager.m index 514506869..b35df9a9c 100644 --- a/RadarSDK/RadarLocationManager.m +++ b/RadarSDK/RadarLocationManager.m @@ -350,7 +350,7 @@ - (void)updateTracking:(CLLocation *)location fromInitialize:(BOOL)fromInitializ - if (options.useMotion) { + if (options.useMotion && ([RadarState promptedForMotionUsage] || ![RadarSettings delayedMotionUsage])) { self.activityManager = [RadarActivityManager sharedInstance]; self.locationManager.headingFilter = 5; [self.locationManager startUpdatingHeading]; @@ -391,7 +391,7 @@ - (void)updateTracking:(CLLocation *)location fromInitialize:(BOOL)fromInitializ }]; } - if (options.usePressure) { + if (options.usePressure && ([RadarState promptedForMotionUsage] || ![RadarSettings delayedMotionUsage])) { self.activityManager = [RadarActivityManager sharedInstance]; [self.activityManager startRelativeAltitudeWithHandler: ^(CMAltitudeData * _Nullable altitudeData) { diff --git a/RadarSDK/RadarSdkConfiguration.h b/RadarSDK/RadarSdkConfiguration.h index 233c22d0f..32d50eda1 100644 --- a/RadarSDK/RadarSdkConfiguration.h +++ b/RadarSDK/RadarSdkConfiguration.h @@ -39,6 +39,8 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) BOOL syncAfterSetUser; +@property (nonatomic, assign) BOOL delayedMotionUsage; + /** Initializes a new RadarSdkConfiguration object with given value. */ diff --git a/RadarSDK/RadarSdkConfiguration.m b/RadarSDK/RadarSdkConfiguration.m index 1f0dbebca..e2803009c 100644 --- a/RadarSDK/RadarSdkConfiguration.m +++ b/RadarSDK/RadarSdkConfiguration.m @@ -33,6 +33,7 @@ - (instancetype)initWithDict:(NSDictionary *)dict { _useForegroundLocationUpdatedAtMsDiff = NO; _useNotificationDiff = NO; _syncAfterSetUser = NO; + _delayedMotionUsage = NO; if (dict == nil) { return self; @@ -93,6 +94,11 @@ - (instancetype)initWithDict:(NSDictionary *)dict { _syncAfterSetUser = [(NSNumber *)syncAfterSetUserObj boolValue]; } + NSObject *delayedMotionUsageObj = dict[@"delayedMotionUsage"]; + if (delayedMotionUsageObj && [delayedMotionUsageObj isKindOfClass:[NSNumber class]]) { + _delayedMotionUsage = [(NSNumber *)delayedMotionUsageObj boolValue]; + } + return self; } @@ -110,7 +116,7 @@ - (NSDictionary *)dictionaryValue { dict[@"useForegroundLocationUpdatedAtMsDiff"] = @(_useForegroundLocationUpdatedAtMsDiff); dict[@"useNotificationDiff"] = @(_useNotificationDiff); dict[@"syncAfterSetUser"] = @(_syncAfterSetUser); - + dict[@"delayedMotionUsage"] = @(_delayedMotionUsage); return dict; } diff --git a/RadarSDK/RadarSettings.h b/RadarSDK/RadarSettings.h index 2ff3b647d..5f76d10f8 100644 --- a/RadarSDK/RadarSettings.h +++ b/RadarSDK/RadarSettings.h @@ -65,6 +65,7 @@ NS_ASSUME_NONNULL_BEGIN + (void)updateLastAppOpenTime; + (NSDate *)lastAppOpenTime; + (BOOL)useRadarModifiedBeacon; ++ (BOOL)delayedMotionUsage; + (BOOL)xPlatform; + (NSString *)xPlatformSDKType; + (NSString *)xPlatformSDKVersion; diff --git a/RadarSDK/RadarSettings.m b/RadarSDK/RadarSettings.m index 0f44934b6..758a7c6b7 100644 --- a/RadarSDK/RadarSettings.m +++ b/RadarSDK/RadarSettings.m @@ -343,6 +343,10 @@ + (BOOL)useRadarModifiedBeacon { return [[self sdkConfiguration] useRadarModifiedBeacon]; } ++ (BOOL)delayedMotionUsage { + return [[self sdkConfiguration] delayedMotionUsage]; +} + + (BOOL)xPlatform { return [[NSUserDefaults standardUserDefaults] stringForKey:kXPlatformSDKType] != nil && [[NSUserDefaults standardUserDefaults] stringForKey:kXPlatformSDKVersion]; diff --git a/RadarSDK/RadarState.h b/RadarSDK/RadarState.h index 7514f64ef..be41c28ec 100644 --- a/RadarSDK/RadarState.h +++ b/RadarSDK/RadarState.h @@ -45,6 +45,8 @@ NS_ASSUME_NONNULL_BEGIN + (void)addRegisteredNotification:(NSDictionary *)registeredNotification; + (NSDictionary *)lastRelativeAltitudeData; + (void)setLastRelativeAltitudeData:(NSDictionary *_Nullable)lastRelativeAltitudeData; ++ (void)setPromptedForMotionUsage:(BOOL)promptedForMotionUsage; ++ (BOOL)promptedForMotionUsage; @end diff --git a/RadarSDK/RadarState.m b/RadarSDK/RadarState.m index ed80eaeec..afc3f561f 100644 --- a/RadarSDK/RadarState.m +++ b/RadarSDK/RadarState.m @@ -27,6 +27,7 @@ @implementation RadarState static NSString *const kLastPressureData = @"radar-lastPressureData"; static NSString *const kNotificationPermissionGranted = @"radar-notificationPermissionGranted"; static NSString *const kRegisteredNotifications = @"radar-registeredNotifications"; +static NSString *const kPromptedForMotionUsage = @"radar-promptedForMotionUsage"; static NSDictionary *_lastRelativeAltitudeDataInMemory = nil; static NSDate *_lastPressureBackupTime = nil; static NSTimeInterval const kBackupInterval = 2.0; // 2 seconds @@ -249,4 +250,12 @@ + (void)addRegisteredNotification:(NSDictionary *)notification { [RadarState setRegisteredNotifications:registeredNotifications]; } ++ (void)setPromptedForMotionUsage:(BOOL)promptedForMotionUsage { + [[NSUserDefaults standardUserDefaults] setBool:promptedForMotionUsage forKey:kPromptedForMotionUsage]; +} + ++ (BOOL)promptedForMotionUsage { + return [[NSUserDefaults standardUserDefaults] boolForKey:kPromptedForMotionUsage]; +} + @end diff --git a/RadarSDKTests/RadarSDKTests.m b/RadarSDKTests/RadarSDKTests.m index fb6a977e5..0bafa5f70 100644 --- a/RadarSDKTests/RadarSDKTests.m +++ b/RadarSDKTests/RadarSDKTests.m @@ -1668,7 +1668,8 @@ - (void)test_RadarSdkConfiguration { @"extendFlushReplays": @(NO), @"useLogPersistence": @(NO), @"useRadarModifiedBeacon": @(NO), - @"syncAfterSetUser": @(NO) + @"syncAfterSetUser": @(NO), + @"delayedMotionUsage": @(YES), }]; [RadarSettings setSdkConfiguration:sdkConfiguration];