Determining the availability of regional monitoring
Before trying to control any regions, your application must check whether region monitoring is supported on the current device. Here are some reasons why monitoring a region might not be available:
The device does not have the necessary equipment to support regional monitoring. The user denied the application permission to use region monitoring. The user has disabled location services in the Settings app. The user has disabled updating the background application in the Settings application for both the device and your application. The device is in an airplane and cannot turn on the necessary equipment. In iOS 7.0 and later, always call the methods of the isMonitoringAvailableForClass: class and the authorizationStatus of the CLLocationManager class before trying to control the regions. (In OS X version 10.8 and later and in previous versions of iOS, use the regionMonitoringAvailable class instead.) The isMonitoringAvailableForClass: method indicates whether the underlying hardware supports area monitoring for the specified class at all. If this method returns NO, your application cannot use region monitoring on the device. If it returns YES, call the authorizationStatus method to determine if the application is currently allowed to use location services. If the authorization status is kCLAuthorizationStatusAuthorized, your application may receive border notifications for any regions that it has registered. If the authorization status is set to any other value, the application does not receive these notifications.
Note. Even if the application does not have the right to use region monitoring, it can register regions for use later. If the user subsequently grants permission for the application, monitoring will begin for these regions and will generate subsequent border crossing notifications. If you do not want the regions to remain set until your application is authorized, you can use the locationManager: didChangeAuthorizationStatus: delegate method to detect changes in the status of your applications and, if necessary, delete regions. Finally, if your application needs to process location updates in the background, be sure to check the backgroundRefreshStatus property of the UIApplication class. You can use the value of this property to determine if it is possible to do this, and to alert the user if this is not the case. Please note that the system does not wake up your application for region notifications when the background application update option is disabled globally or specifically for your application.
See Apple docs for more information.
To prevent false notifications, iOS does not deliver region notifications until certain threshold conditions are met. In particular, the location of users must cross the border of the region and move away from this border to a minimum distance and remain at that minimum distance for at least 20 seconds before notifications are sent.
Certain threshold distances are determined by the equipment and location technologies that are currently available. For example, if Wi-Fi is disabled, area monitoring is much less accurate. However, for testing purposes, you can assume that the minimum distance is about 200 meters.
Geographic region monitoring begins immediately after registration for authorized applications. However, do not expect to receive the event immediately, because only border crossings generate the event. In particular, if the user's location is already in the region during registration, the location manager does not automatically generate an event. Instead, your application should wait for the user to cross the border of the region before the event is generated and sent to the delegate. To check if the user is already on the border of the region, use the requestStateForRegion: class CLLocationManager method.
Be reasonable when specifying a set of regions to monitor. Regions are a common system resource, and the total number of regions available throughout the system is limited. For this reason, Core Location limits to 20 the number of regions that can be simultaneously controlled by one application. To get around this limit, consider registering only those regions in close proximity to users. As the location of users changes, you can delete the areas that are now further away and add regions located in the users' path. If you try to register a region and the space is unavailable, the location manager calls the locationManager: monitoringDidFailForRegion: withError: method of its delegate with the error code kCLErrorRegionMonitoringFailure.