Приложение My Apple Watch требует некоторых данных и запрашивает их из соответствующего приложения iPhone. Для выполнения запроса приложению iPhone требуется местоположение пользователя. После получения и тестирования с настоящими Apple Watch я обнаружил, что мое приложение для iPhone не получает обновления местоположения при работе в фоновом режиме. Если приложение iPhone активно на переднем плане, оно работает без проблем. С симулятором в обоих случаях все получилось.
В обоих случаях (активном и фоновом) расширение WatchKit вызывает и успешно запускает приложение iPhone и работает до тех пор, пока в приложении iPhone не будет вызван startUpdatingLocation. Но если приложение работает в фоновом режиме, didUpdateLocations никогда не вызывается.
Я пробовал использовать requestAlwaysAuthorization, а также requestWhenInUseAuthorization. Нет разницы. Я также активировал фоновый режим "обновления местоположения" в пределах возможностей. Но опять же без разницы.
Кто-нибудь еще сталкивался с такой же проблемой и нашел способ получить местоположение также в фоновом режиме?
Вот код. Сначала проверьте, требуется ли авторизация.
// iOS 8 check to avoid crash on older iOS
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
{
[self requestLocationAlwaysAuthorization];
}
else
{
[self runLocationUpdate];
}
Здесь проверка правильности прав диспетчера местоположения.
- (void)requestLocationAlwaysAuthorization
{
CLAuthorizationStatus currentAuthStatus = [CLLocationManager authorizationStatus];
if (currentAuthStatus == kCLAuthorizationStatusDenied)
{
//request user to change setting
}
else if (currentAuthStatus == kCLAuthorizationStatusRestricted)
{
//request user to change setting
}
else if (currentAuthStatus == kCLAuthorizationStatusNotDetermined)
{
[self.locationManager requestAlwaysAuthorization];
[self runLocationUpdate];
}
else if (currentAuthStatus == kCLAuthorizationStatusAuthorizedWhenInUse)
{
//maybe when in use is also enough?
[self runLocationUpdate];
}
else if (currentAuthStatus == kCLAuthorizationStatusAuthorizedAlways)
{
//all ok
[self runLocationUpdate];
}
}
Здесь вызов startUpdatingLocation. Делегат didUpdateLocations будет вызываться только тогда, когда приложение iPhone активно.
-(void)runLocationUpdate
{
[self.locationManager startUpdatingLocation];
}