Запуск приложения iPhone в фоновом режиме прекращается через 10 минут - PullRequest
0 голосов
/ 23 сентября 2010

Я работаю над приложением, которое должно работать в фоновом режиме на iOS4.Я хочу, чтобы это было похоже на обычное приложение на основе местоположения, поэтому BackgroundMode установлен на местоположение.Приложение работает хорошо, когда входит в фоновое состояние, но через 10 минут перестает отвечать на запросы.Возможно, это будет приостановлено / прекращено.То, что я хочу сделать, - это запускать приложение в фоновом режиме без ограничений по времени, пока пользователь не прекратит работу исключительно.Пожалуйста, объясните мне, как я могу этого достичь.Здесь я выскакиваю локальное уведомление, когда GPS обновляется в новом месте.Здесь приведен фрагмент кода:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    /*
     Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
     If your application supports background execution, called instead of applicationWillTerminate: when the user quits.
     */


 UIApplication*    app = [UIApplication sharedApplication];

    // Request permission to run in the background. Provide an
    // expiration handler in case the task runs long.
    NSAssert(bgTask == UIBackgroundTaskInvalid, nil);

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        // Synchronize the cleanup call on the main thread in case
        // the task actually finishes at around the same time.
        dispatch_async(dispatch_get_main_queue(), ^{

            if (bgTask != UIBackgroundTaskInvalid)
            {
                [app endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            }
        });
    }];

    // Start the long-running task and return immediately.

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Do the work associated with the task.

  locmanager = [[CLLocationManager alloc] init];
  [locmanager setDelegate:self];
  [locmanager setDesiredAccuracy:kCLLocationAccuracyBest];
  locmanager.distanceFilter = 20;
  [locmanager startUpdatingLocation];

  NSLog(@"App staus: applicationDidEnterBackground");
        // Synchronize the cleanup call on the main thread in case
        // the expiration handler is fired at the same time.
        dispatch_async(dispatch_get_main_queue(), ^{
            if (bgTask != UIBackgroundTaskInvalid)
            {
                [app endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid; 
            }
        });  
    });
 NSLog(@"backgroundTimeRemaining: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);
}

and

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{ 
 // Log the kind of accuracy we got from this
 NSLog(@"Accuracy-------- %f %f", [newLocation horizontalAccuracy], [newLocation verticalAccuracy]);

 CLLocationCoordinate2D loc = [newLocation coordinate];
 userCurrentLocation = newLocation;
 lat = loc.latitude;
 lon = loc.longitude;

 UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    if (localNotif == nil)
        return;
 NSDate *now = [NSDate dateWithTimeIntervalSinceNow:10]; 

 NSLog(@"Now is %@",now); 

 localNotif.fireDate = now;

    localNotif.timeZone = [NSTimeZone defaultTimeZone];

 // Notification details
    localNotif.alertBody = [NSString stringWithFormat:@"Latitude = %f, Longitude = %f", lat, lon];
 // Set the action button
    localNotif.alertAction = @"View";

    localNotif.soundName = UILocalNotificationDefaultSoundName;
    localNotif.applicationIconBadgeNumber = 1;

 // Specify custom data for the notification
    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"someValue" forKey:@"someKey"];
    localNotif.userInfo = infoDict;

 // Schedule the notification
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];
    [localNotif release];

}

Пожалуйста, подскажите, как это сделать?

Ответы [ 2 ]

3 голосов
/ 23 сентября 2010

Ваш info.plist содержит этот материал?

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

http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html%23//apple_ref/doc/uid/TP40007072-CH5

1 голос
/ 18 декабря 2010

Вам не нужно делать beginBackgroundTask ... (на самом деле, вы не должны), подписавшись на обновления местоположения (см. Пост выше этого), ваше приложение будет автоматически пробуждено и уведомлено об изменениях местоположения,Фоновые задачи предназначены для другой цели (расширенная загрузка и т. Д.), И у вас есть только ограниченное время для их выполнения (около 10 минут), если вы попытаетесь оставить фоновую задачу открытой дольше, ваше приложение будет закрыто.

В основном избавьтесь от материала beginBackgroundTask и добавьте ключ местоположения UIBackgroundModes -> в ваш info.plist, чтобы вы зарегистрировались, чтобы приложение уведомлялось об изменениях местоположения даже в фоновом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...