startUpdatingLocation LocationManager через автоматическое push-уведомление

Я создаю приложение, которое должно просыпаться в фоновом режиме в определенное время.

Я пытался:

  1. UILocalNotification: Но я не хочу использовать UILocalNotification, потому что для взаимодействия с уведомлением требуется взаимодействие с пользователем, а затем проснется только приложение и запустит диспетчер местоположения.

  2. Я также использовал [locationManager startUpdatingLocation]; включается с фоновыми обновлениями режимов, это работает, но это займет много батареи.

Так что с использованием новой функции iOS 7 Silent pushNotification а также didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler: метод мне нужно запустить диспетчер местоположения в фоновом режиме,

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{

    NSLog(@"Receive RemoteNotification in fetchCompletionHandler with UserInfo:%@",userInfo);
    application.applicationIconBadgeNumber=0;
    __block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{

        [self.locationManager startUpdatingLocation];

        [application endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

}

Silent Push-уведомление работает правильно,

Полезная нагрузка для PushNotification:

{"aps" : {"content-available" : 1},"SilentPushId" : "07"}

Но это не запустит менеджер местоположения, пожалуйста, кто-нибудь, помогите мне.

РЕДАКТИРОВАТЬ:

Если это невозможно, пожалуйста, дайте мне несколько советов.

4 ответа

Решение

Я успешно реализовал это, используя Silent Pushnotification, и он вызывает startUpdatingLocation, и я могу получить данные о местоположении в методе делегата:

Используя эту полезную нагрузку:

{
    "aps": {
        "content-available": 1
    },
    "SilentPush": "4"
}

Я включил местоположение и удаленное уведомление для фонового режима:

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler
{
     __block UIBackgroundTaskIdentifier bgTask =0;
    UIApplication  *app = [UIApplication sharedApplication];
     bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [self.locationManager startUpdatingLocation];

 }];

didUpdateLocations

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
        lastLoc=[locations lastObject];
        [logFile addLocObject:[NSString stringWithFormat:@"Loc: %@",lastLoc]];
}

Ты не можешь. Запрещается запускать службы определения местоположения, пока приложение находится в фоновом режиме. Пользователь должен знать о начале работы с открытым приложением.

Представьте, какое подрывное отслеживание было бы доступно, если бы вы могли отправлять уведомления в режиме без вывода сообщений, чтобы инициировать обновление местоположения обратно на сервер без уведомления пользователя об этом...

В фоновом режиме вы можете получать важные локальные события и граничные события. Я могу вообразить, что можно использовать эту возможность для ведения журнала недавних местоположений. Когда ваше удаленное уведомление получено, ответьте, отправив последнее известное местоположение. Немного поэкспериментировав, я уверен, что вы могли бы уточнить это, чтобы быть достаточно точным с небольшим воздействием на батарею.

Если вы хотите обновить местоположение в фоновом режиме, просто включите UIBackgroundModes в plist-файле. См. Описание startUpdatingLocation в документе Apple.

Если вы запускаете эту службу и ваше приложение приостанавливается, система останавливает доставку событий до тех пор, пока ваше приложение не запустится снова (на переднем или на заднем плане). Если ваше приложение прекращается, доставка новых событий местоположения полностью прекращается. Следовательно, если вашему приложению необходимо получать события местоположения в фоновом режиме, оно должно включить ключ UIBackgroundModes (со значением местоположения) в свой файл Info.plist.

Вы можете включить это для фонового обновления в вашем xcode5+, как показано ниже.

Другие вопросы по тегам