Я знаю, что если приложение использует службу значительного изменения местоположения, iOS разбудит ее, если будет обновлено местоположение, даже если приложение будет завершено.
Я не мог найти четкого ответа на этот вопрос, если приложение использует стандартные службы определения местоположения и указывает местоположение в качестве ключа для UIBackgroundModes: будет ли iOS пробуждать его, чтобы доставить обновление, даже если оно завершено? Или приложение должно работать в фоновом режиме, чтобы получить обратный вызов обновления местоположения?
ОБНОВЛЕНИЕ: В то время, когда я спрашивал об этом, у меня не было времени проверить его. Но после того, как я получил ответ здесь, я написал этот фрагмент кода в своем делетете приложения, чтобы узнать, будет ли мое завершенное приложение перезапущено, когда оно получит обновление местоположения. Я показываю UILocalNotification, когда меня уведомляют об обновлении. Однако, когда я прекратил свое приложение, а затем изменил свое местоположение в городе, приложение не было перезаписано, и я не получил никаких обновлений. Можете ли вы сказать мне, что я делаю неправильно?
ОБНОВЛЕНИЕ # 2:. Согласно окончательным выводам в этом Q & A, нет ничего плохого в этом коде, и это ожидаемое поведение для приложения, которое использует стандартные службы определения местоположения, а не перезапуска после прекращение.
Я добавил местоположение в качестве одного из UIBackgroundModes в файле Info.plist.
И это связанные с местоположением части моего делегата приложения:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
m_locManager = [[CLLocationManager alloc] init];
m_locManager.delegate = self;
[m_locManager startUpdatingLocation];
return YES;
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
[m_locManager startUpdatingLocation];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog("%@", [NSString stringWithFormat:@"Background Fail %@", [error localizedDescription]]);
}
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
UILocalNotification * theNotification = [[UILocalNotification alloc] init];
theNotification.alertBody = [NSString stringWithFormat:@"Background location %.06f %.06f %@" , newLocation.coordinate.latitude, newLocation.coordinate.longitude, newLocation.timestamp];
theNotification.alertAction = @"Ok";
theNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
[[UIApplication sharedApplication] scheduleLocalNotification:theNotification];
}