рдКрд░реНрдЬрд╛-рдмрдЪрдд рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдерд╛рди + рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рд╕рд░реНрд╡рд░ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬ рд░рд╣рд╛ рд╣реИ

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реЛ (рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде), рдФрд░ рдпрд╣ рднреА рдХрд┐ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдХреНрд░рд┐рдп рд╣реЛ (рдЙрдЪреНрдЪ рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде)ред

рдирд┐рд░реНрдгрдп

рдорд╛рдереЗ рдХрд╛ рд╕рдорд╛рдзрд╛рди [CLLocationManagerInstance startUpdatingLocation] рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдФрд░ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдХреНрд░рд┐рдп рд╣реИ, рджреЛрдиреЛрдВ рдореЗрдВ рдХреЙрд▓рдмреИрдХ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкрд╣рд▓рд╛ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЛрд╖ рдЗрд╕рдХреА рдЙрдЪреНрдЪ рдмрд┐рдЬрд▓реА рдХреА рдЦрдкрдд рд╣реИ (рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ, iPhone рдмреИрдЯрд░реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рд╕рдХрддреА рд╣реИ)ред рджреВрд╕рд░рд╛ - рдпрджрд┐ рдЖрд╡реЗрджрди рдХрдо рд╕реЗ рдХрдо рдФрд░ 'рдорд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛' рд╣реИ, рддреЛ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреЛрдИ рднреА рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗред

рдЗрди рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕рдХреНрд░рд┐рдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЛрдб рдореЗрдВ [CLLocationManagerInstance startUpdatingLocation] рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ [CLLocationManManInstance startMonitoringSignificantLocationChanges] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдШрдЯрдХ рдореЗрдВ рджреЛ рдмреНрд▓реЙрдХ рд╣реЛрдВрдЧреЗ, рдЬрд┐рдиреНрд╣реЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди

рдЕрдЧреНрд░рднреВрдорд┐

рдПрдХ рд╕рдХреНрд░рд┐рдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдзрд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ - рд╣рдореЗрдВ рдПрдХ CLLocationManager рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдФрд░ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВред рдПрдХ рдЖрд╡рд░рдг рд╡рд╕реНрддреБ рдмрдирд╛рдПрдБ:

#import <CoreLocation/CoreLocation.h> typedef void(^locationHandler)(CLLocation *location); @interface DLLocationTracker : NSObject <CLLocationManagerDelegate> @property (nonatomic, strong) CLLocationManager *locationManager; @property (nonatomic, copy) locationHandler locationUpdatedInForeground; - (void)startUpdatingLocation; - (void)stopUpdatingLocation; @end 


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ LocationUpdatedInForeground рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ред рдСрдмреНрдЬреЗрдХреНрдЯ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП startUpdatingLocation рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдкреГрд╖реНрдарднреВрдорд┐

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╕рдордиреНрд╡рдп рдЕрдкрдбреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рджреЛ рдореБрдЦреНрдп рддрд░реАрдХреЗ рд╣реИрдВ:

рд╣рдо рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ рд╣реЗрдбрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

 #import <CoreLocation/CoreLocation.h> typedef void(^locationHandler)(CLLocation *location); @interface DLLocationTracker : NSObject <CLLocationManagerDelegate> @property (nonatomic, strong) CLLocationManager *locationManager; @property (nonatomic, copy) locationHandler locationUpdatedInForeground; @property (nonatomic, copy) locationHandler locationUpdatedInBackground; - (void)startUpdatingLocation; - (void)stopUpdatingLocation; - (void)endBackgroundTask; @end 


рдЬрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдПрдХ рд╕рдордиреНрд╡рдп рдЕрджреНрдпрддрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ locationUpdatedInBackground рдмреНрд▓реЙрдХ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
endBackgroundTask - рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рдЖрдкрдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рд╣рдо рдмрд╛рдж рдореЗрдВ рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВрдЧреЗ )ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ * .plist рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЛрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ = {рд╕реНрдерд╛рди рдЕрдкрдбреЗрдЯ рдХреЗ рд▓рд┐рдП рдРрдк рд░рдЬрд┐рд╕реНрдЯрд░} ред

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд╛рди рдкрд░рд┐рд╡рд░реНрддрди рддрдВрддреНрд░ рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рднреА рд╕реНрдерд╛рди рдЕрдкрдбреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдирдХ рд╡рд┐рдзрд┐ appDelegate applicationDidFinishLaunchingWithOptions рд╕реЗ рдереЛрдбрд╝рд╛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ:

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) { self.locationTracker = [[DLLocationTracker alloc] init]; [self.locationTracker setLocationUpdatedInBackground:^(CLLocation *location) { // ,   local notification   UILocalNotification *notification = [[UILocalNotification alloc] init]; notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:15]; notification.alertBody = [NSString stringWithFormat:@"New location: %@", location]; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; }]; [self.locationTracker startUpdatingLocation]; } ..... } 


UIApplicationLaunchOptionsLocationKey - рдПрдХ рдХреБрдВрдЬреА рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдкреНрд░рд╛рдкреНрдд рд╕реНрдерд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдШрдЯрдирд╛ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдШрдЯрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЬрдм рдШрдЯрдХ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ CLLocationManager рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЙрд╕рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ (рд╕рдХреНрд░рд┐рдп / рдкреГрд╖реНрдарднреВрдорд┐) рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред

 - (id)init { if (self = [super init]) { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidEnterBackground) name: UIApplicationDidEnterBackgroundNotification object:nil]; self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; } return self; } 


рдЕрдЧрд▓рд╛, startUpdatingLocation рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:

 - (void)startUpdatingLocation { [self stopUpdatingLocation]; [self isInBackground] ? [self.locationManager startMonitoringSignificantLocationChanges] : [self.locationManager startUpdatingLocation]; } 

рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрд╡рд╛ рд╕рдХреНрд░рд┐рдп рд╣реИред
рд╕рднреА рдордЬрд╝рд╛ CLLocationManager рдХреЙрд▓рдмреИрдХ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ:

 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { //          if (oldLocation && ([newLocation.timestamp timeIntervalSinceDate:oldLocation.timestamp] < kMinUpdateTime || [newLocation distanceFromLocation:oldLocation] < kMinUpdateDistance)) { return; } if ([self isInBackground]) { if (self.locationUpdatedInBackground) { bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{ [[UIApplication sharedApplication] endBackgroundTask:bgTask]; }]; self.locationUpdatedInBackground(newLocation); [self endBackgroundTask]; } } else { //   -    if (self.locationUpdatedInForeground) { self.locationUpdatedInForeground(newLocation); } } } 

рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╢реБрд░реБрдЖрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ BackBackWithExpirationHandler рд╡рд┐рдзрд┐ рдФрд░ bgTask рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ (UIBackgroundTaskIdentifier рдХреЛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ)ред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЛ EndBackgroundTask рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рд╕рдВрддреБрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЬреЛ рдХрд┐ рд╣реЛрддрд╛ рд╣реИ [self endBackgroundTask] :

 - (void)endBackgroundTask { if (bgTask != UIBackgroundTaskInvalid) { [[UIApplication sharedApplication] endBackgroundTask:bgTask]; bgTask = UIBackgroundTaskInvalid; } } 

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдпрд╣ рд╣реИ рдХрд┐ locationUpdatedInBackground block рдХреЛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рдо рдЗрд╕реЗ рддрдм рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдореЗрдВ рд╣реЛрдВ), рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдмреНрд▓реЙрдХ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдХрдо рд╕реЗ рдХрдо / рдиреНрдпреВрдирддрдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрджрд┐ рдмреНрд▓реЙрдХ 10 рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛

рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдореВрдХ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдШрдЯрдХ рдХрд╛ рдХреЛрдб рдмрджрд▓ рджреЗрдВрдЧреЗ:

  if ([self isInBackground]) { if (self.locationUpdatedInBackground) { bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler: ^{ [[UIApplication sharedApplication] endBackgroundTask:bgTask]; }]; self.locationUpdatedInBackground(newLocation); //[self endBackgroundTask]; -            } 

LocationUpdatedInBackground рдмреНрд▓реЙрдХ:

  __weak DLLocationTracker *lc = self.locationTracker; [self.locationTracker setLocationUpdatedInBackground:^ (CLLocation *location) { //,       completion  fail     [self sendLocationToServer:location completion:^{ [lc endBackGroundTask]; } fail:^(NSError *fail) { [lc endBackGroundTask]; }]; }]; 


рдирд┐рд╖реНрдХрд░реНрд╖

рдПрдХ рд╕рдорд╛рди рдКрд░реНрдЬрд╛-рдХреБрд╢рд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдлрд╝реЙрд░реНрд╕рдХреНрд╡рд╛рд░ рдореЗрдВ рд░рдбрд╛рд░ рдХреА рд╕реБрд╡рд┐рдзрд╛ред рдкрд░реАрдХреНрд╖рд╛ рдЖрд╡реЗрджрди рдХрд╛ рдХреЛрдб рдЬреАрдердм рдкрд░ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In149836/


All Articles