Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iOS 14 compatibility fix. #133

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions LocationManager/INTULocationManager/INTULocationManager.h
Expand Up @@ -50,6 +50,7 @@ NS_ASSUME_NONNULL_BEGIN
+ (instancetype)sharedInstance;

@property (nonatomic, assign) INTUAuthorizationType preferredAuthorizationType;
@property (nonatomic, assign) INTUAccuracyAuthorization accuracyAuthorization;

#pragma mark Location Requests

Expand Down Expand Up @@ -185,6 +186,8 @@ NS_ASSUME_NONNULL_BEGIN
/** Immediately cancels the heading subscription request with the given requestID (if it exists), without executing the original request block. */
- (void)cancelHeadingRequest:(INTUHeadingRequestID)requestID;

- (void)requestTemporaryFullAccuracyAuthorizationWithPurposeKey:(nonnull NSString *)purposeKey completion:(void (^ _Nullable)(NSError * _Nullable))completion;

#pragma mark - Additions

/** It is possible to force enable background location fetch even if your set any kind of Authorizations */
Expand Down
80 changes: 64 additions & 16 deletions LocationManager/INTULocationManager/INTULocationManager.m
Expand Up @@ -83,15 +83,26 @@ + (INTULocationServicesState)locationServicesState
{
if ([CLLocationManager locationServicesEnabled] == NO) {
return INTULocationServicesStateDisabled;
}
else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
return INTULocationServicesStateNotDetermined;
}
else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
return INTULocationServicesStateDenied;
}
else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusRestricted) {
return INTULocationServicesStateRestricted;
} else if (@available(iOS 14.0, *)) {
if (CLLocationManager.authorizationStatus == kCLAuthorizationStatusNotDetermined) {
return INTULocationServicesStateNotDetermined;
}
else if (CLLocationManager.authorizationStatus == kCLAuthorizationStatusDenied) {
return INTULocationServicesStateDenied;
}
else if (CLLocationManager.authorizationStatus == kCLAuthorizationStatusRestricted) {
return INTULocationServicesStateRestricted;
}
} else {
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
return INTULocationServicesStateNotDetermined;
}
else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied) {
return INTULocationServicesStateDenied;
}
else if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusRestricted) {
return INTULocationServicesStateRestricted;
}
}

return INTULocationServicesStateAvailable;
Expand Down Expand Up @@ -267,9 +278,16 @@ - (INTULocationRequestID)requestLocationWithDesiredAccuracy:(INTULocationAccurac
locationRequest.block = block;
locationRequest.desiredActivityType = desiredActivityType;

BOOL deferTimeout = delayUntilAuthorized && ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined);
if (!deferTimeout) {
[locationRequest startTimeoutTimerIfNeeded];
if (@available(iOS 14.0, *)) {
BOOL deferTimeout = delayUntilAuthorized && (CLLocationManager.authorizationStatus == kCLAuthorizationStatusNotDetermined);
if (!deferTimeout) {
[locationRequest startTimeoutTimerIfNeeded];
}
} else {
BOOL deferTimeout = delayUntilAuthorized && ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined);
if (!deferTimeout) {
[locationRequest startTimeoutTimerIfNeeded];
}
}

[self addLocationRequest:locationRequest];
Expand Down Expand Up @@ -404,6 +422,10 @@ - (void)cancelLocationRequest:(INTULocationRequestID)requestID
}
}

- (void)requestTemporaryFullAccuracyAuthorizationWithPurposeKey:(nonnull NSString *)purposeKey completion:(void (^ _Nullable)(NSError * _Nullable))completion {
[self.locationManager requestTemporaryFullAccuracyAuthorizationWithPurposeKey:purposeKey completion:completion];
}

#pragma mark Public heading methods

/**
Expand Down Expand Up @@ -547,7 +569,14 @@ - (void)requestAuthorizationIfNeeded

double iOSVersion = floor(NSFoundationVersionNumber);
BOOL isiOSVersion7to10 = iOSVersion > NSFoundationVersionNumber_iOS_7_1 && iOSVersion <= NSFoundationVersionNumber10_11_Max;
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) {
BOOL isAuthorizationStatusNotDetermined = NO;
if (@available(iOS 14.0, *)) {
isAuthorizationStatusNotDetermined = (CLLocationManager.authorizationStatus == kCLAuthorizationStatusNotDetermined);
} else {
isAuthorizationStatusNotDetermined = ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined);
}

if (isAuthorizationStatusNotDetermined) {
BOOL canRequestAlways = NO;
BOOL canRequestWhenInUse = NO;
if (isiOSVersion7to10) {
Expand Down Expand Up @@ -649,9 +678,14 @@ - (void)updateWithDesiredActivityType:(CLActivityType)desiredActivityType
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
INTULMLog(@"Changing location services activity type to: automotive navigation.");
break;
case CLActivityTypeAirborne:
self.locationManager.activityType = CLActivityTypeAirborne;
INTULMLog(@"Changing location services activity type to: airborne.");
case CLActivityTypeAirborne: {
if (@available(iOS 12.0, *)) {
self.locationManager.activityType = CLActivityTypeAirborne;
INTULMLog(@"Changing location services activity type to: airborne.");
} else {
// Fallback on earlier versions
}
}
break;
case CLActivityTypeOtherNavigation:
self.locationManager.activityType = CLActivityTypeOtherNavigation;
Expand Down Expand Up @@ -1134,6 +1168,20 @@ - (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatu
}
}

- (void)locationManagerDidChangeAuthorization:(CLLocationManager *)manager API_AVAILABLE(ios(14.0)) {
[self locationManager:manager didChangeAuthorizationStatus:manager.authorizationStatus];
switch (manager.accuracyAuthorization) {
case CLAccuracyAuthorizationFullAccuracy:
self.accuracyAuthorization = INTUAccuracyAuthorizationFullAccuracy;
break;
case CLAccuracyAuthorizationReducedAccuracy:
self.accuracyAuthorization = INTUAccuracyAuthorizationReducedAccuracy;
break;
default:
break;
}
}

#pragma mark - Additions
/** It is possible to force enable background location fetch even if your set any kind of Authorizations */
- (void)setBackgroundLocationUpdate:(BOOL) enabled {
Expand Down
Expand Up @@ -127,6 +127,11 @@ typedef NS_ENUM(NSInteger, INTULocationStatus) {
INTULocationStatusError
};

typedef NS_ENUM(NSInteger, INTUAccuracyAuthorization) {
INTUAccuracyAuthorizationFullAccuracy = 0,
INTUAccuracyAuthorizationReducedAccuracy
};

/** A status that will be passed in to the completion block of a heading request. */
typedef NS_ENUM(NSInteger, INTUHeadingStatus) {
// These statuses will accompany a valid heading.
Expand Down