Alternative for GeoFence Monitoring with Location Permission is "While In Use"

We are having geofence monitoring in our iOS App.

Until iOS 11 We were only prompting AlwaysOn & Never Prompt for Location Service Permission.

With iOS 11 now user have a option to use "WhileInUse" with that any kind of Region Monitoring will not work.

So We have implemented following alternative to manually do region monitoring as follows:


- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
           
            if([locations count]) {
                CLLocation *newLocation = [locations lastObject];
                self.latitude = newLocation.coordinate.latitude;
                self.longitude = newLocation.coordinate.longitude;
               
                printf("Locatio %f - %f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
                /*
                 To avoid logging and showing cached locations, we filter the location by timestamp.
                 We calculate elapsed time since this timestamp property by using timeIntervalSinceNow, and if the elapsed time is more than 60 seconds, filter the location out.
                 */
                NSTimeInterval interval = [newLocation.timestamp timeIntervalSinceNow];
                //check against absolute value of the interval
                if (fabs(interval)>60) {
                   
                    return;
                }
                /*
                 horizontalAccuracy is the value indicating which accuracy range (in meters) the location would be in. Say if the value is 20, the actual user’s position can be within a circle with the radius of 20 meters from the location value.
                 We first validate the horizontalAccuracy to be equal to or more than 0 meter.
                 Apple’s document says,
                 */
                if (newLocation.horizontalAccuracy < 0){
                    return;
                }
                /*
                 If horizontalAccuracy is non negative value, we will further examine the value.
                 In this sample if horizontalAccuracy is more than 150 meters, we filter the location out (which means we log locations with their accuracy value less than 100 meters).
                 */
                if (newLocation.horizontalAccuracy > 150){
                    return;
                }
                _lastLocation = newLocation;
                 //in meters
            }
        }

Following is the method that will check if current location of user is inside of any region?

-(void)checkIfUserIsInRegion{
       
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSArray *arrGeofence = [GEOFENCE_MANAGER getSavedGeoFences];
        for (GeoFencing *geofence in arrGeofence) {
           
            CLLocation *locationGeoFence = [[CLLocation alloc] initWithLatitude:geofence.lattitude.doubleValue longitude:geofence.longitude.doubleValue];
           
            //Get Distance of current location & set Geofence Location
            double distance = [[CasinoLocationManager sharedInstance].lastLocation distanceFromLocation:locationGeoFence];
           
           
            //Get Already Detected GeoFence list
            Boolean isEnteredBefore = [[GeoFenceManager sharedInstance] checkIfGeoFenceExist:[NSString stringWithFormat:@"%f",geofence.geoFencingIdentifier]];
           
           
            //If Distance is within expected radius then consider as Enter
            if(distance<=geofence.radius){
                //Check in localy stored Geofence which are already detected and synced with server
                if(!isEnteredBefore){
                    [[GeoFenceManager sharedInstance] notifyWebForGeoFenceRegion:geofence.region state:CLRegionStateInside];
                }
            }{
                //If Distance is not within expected radius then consider as Exit
                //If region is considered Inside before then set them exit and sync to server
                if(isEnteredBefore){
                [[GeoFenceManager sharedInstance] notifyWebForGeoFenceRegion:geofence.region state:CLRegionStateOutside];
                }
               
            }
           
           
        }
        });
        //
    }

Let me know if this will be the right approach that will not lead to rejection of my app to the appstore. Also want to know what will be the standard place where I can call my following method which will in all case sync all geofence region state with minimum time...

checkIfUserIsInRegion()


Thanks in Advance.Any Suggestion or improvement or idea is most welcome.