2014-09-29 5 views
0

В моем приложении.Long running Фоновая задача Периодически остановлена ​​iOS

Я использовал следующий код для обновления координат местоположения на сервере с интервалом 1 мин. Интервал. Его рабочий тон в течение 10-20 часов. но его время остановилось Периодически Пожалуйста, помогите мне.

UIApplication *application1 = [UIApplication sharedApplication]; 


__block UIBackgroundTaskIdentifier background_task; 
background_task = [application1 beginBackgroundTaskWithExpirationHandler:^ { 


    [application1 endBackgroundTask: background_task]; 
    background_task = UIBackgroundTaskInvalid; 
}]; 


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    //### background task starts 
    //NSLog(@"Running in the background\n"); 
    while(TRUE) 
    { 


     [locationManager startMonitoringSignificantLocationChanges]; 
     [locationManager startUpdatingLocation]; 





     NSUserDefaults *addValue=[NSUserDefaults standardUserDefaults]; 



     NSString *oldLat=[addValue stringForKey:@"OLD_LAT"]; 
     NSString *oldLong=[addValue stringForKey:@"OLD_LONG"]; 





     CLLocationManager *manager = [[CLLocationManager alloc] init]; 
     manager.desiredAccuracy=kCLLocationAccuracyBestForNavigation; 







     NSString *locLat = [NSString stringWithFormat:@"%lf",manager.location.coordinate.latitude]; 
     NSString * locLong = [NSString stringWithFormat:@"%lf",manager.location.coordinate.longitude]; 





     float lat_new=[locLat floatValue]; 
     float lang_new=[locLong floatValue]; 
     float lat_old=[oldLat floatValue]; 
     float lang_old=[oldLong floatValue]; 



     if (lat_new>0 && lang_new>0) { 





        //NSLog(@"location changed"); 
        [addValue setObject:locLat forKey:@"OLD_LAT"]; 
        [addValue setObject:locLong forKey:@"OLD_LONG"]; 








        float from_lat_value=[locLat floatValue]; 
        float from_long_value=[locLong floatValue]; 


        locLat=[NSString stringWithFormat:@"%f",from_lat_value]; 
        locLong=[NSString stringWithFormat:@"%f",from_long_value]; 


        //NSLog(@"LST:%@,%@",locLat,locLong); 

        NSUserDefaults *addLat=[NSUserDefaults standardUserDefaults]; 

        [addLat setObject:locLat forKey:@"FROM_LAT"]; 
        [addLat setObject:locLong forKey:@"FROM_LONG"]; 




        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/user/insertUserLocation",CONFIG_BASE_URL]]; 

        // //NSLog(@"URL:%@",url); 

        __block ASIFormDataRequest *requestmethod = [ASIFormDataRequest requestWithURL:url]; 



        NSUserDefaults *userValue=[NSUserDefaults standardUserDefaults]; 

        NSString *deviceToken=[NSString stringWithFormat:@"%@",[userValue objectForKey:@"DEVICE_TOKEN"]]; 
        NSString *loginValidation=[userValue objectForKey:@"USER_ID"]; 






        [requestmethod setValidatesSecureCertificate:NO]; 
        [requestmethod setPostValue:deviceToken forKey:@"deviceToken"]; 
        [requestmethod setPostValue:locLat forKey:@"latitude"]; 
        [requestmethod setPostValue:locLong forKey:@"longitude"]; 
        [requestmethod setPostValue:loginValidation forKey:@"userID"]; 




        [requestmethod setTimeOutSeconds:180]; 




        [requestmethod setCompletionBlock:^{ 
         NSString *responseString23 = [requestmethod responseString]; 


         //NSLog(@"BACKGROUND RESPONCE:%@",responseString23); 


        }]; 
        [requestmethod setFailedBlock:^{ 
         NSError *error = [requestmethod error]; 


         if ([[NSString stringWithFormat:@"%@",error.localizedDescription] isEqualToString:@"The request timed out"]||[[NSString stringWithFormat:@"%@",error.localizedDescription] isEqualToString:@"Please connect online to use the app"]) 
         { 




         } 
         else 
         { 

          UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Alert-360" 
                       message:[NSString stringWithFormat:@"%@",error.localizedDescription] delegate:self 
                     cancelButtonTitle:@"OK" otherButtonTitles:nil]; 



          [alertView show]; 

         } 

         // [self endBackgroundUpdateTask]; 

        }]; 

        [requestmethod startAsynchronous]; 

       } 





      [locationManager stopMonitoringSignificantLocationChanges]; 
      [locationManager stopUpdatingLocation]; 

     } 





     [NSThread sleepForTimeInterval:BACKGROUND_INTERVAL_CHECKIN]; //wait for 1 sec 



    //Clean up code. Tell the system that we are done. 
    [application1 endBackgroundTask: background_task]; 
    background_task = UIBackgroundTaskInvalid; 
    //NSLog(@"background Task finished"); 

}); 

ответ

0

Отметьте мои оценки.

  1. After App Входит в фон, мы можем получить значения широты и долготы. Но мы не можем размещать эти данные на сервере. Apple ограничила это.

  2. Я подсчитал, как цвет переднего плана и фона время оставшегося код, я получил следующие результаты передний план: Foreground оставшегося времени >>>>: 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 секунд (2147483647 минут)

    фон: времени Фонового остальное >>> >: 159,223682 секунд (2 минуты)

  3. Для моей последней оценки: мы не можем запустить обновление фонового местоположения на сервер долгое время.

-1

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

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

Смежные вопросы