2013-04-11 2 views
1

У меня есть многочисленные UIWebViews в моем приложении iOS (версии 5-6.2). Когда приложение входит в фоновый режим, все работает плавно. Однако, когда он выходит на передний план через ~ 10 минут, я получаю сообщение об ошибке, говорящее что-то вроде «допустимое имя хоста не может быть найдено» или «таймаут соединения».Убивать соединения, поскольку приложение входит в фон

Я предполагаю, что это связано с моим отсутствием действий в отношении этих UIWebViews, когда вызывается applicationDidEnterBackground:. Как я могу убить эти соединения? Я понимаю, что мне нужно использовать центр уведомлений, но в отличие от предыдущих вопросов, подобных этому, я использую ARC, поэтому нет метода dealloc, в котором я могу удалить наблюдателей.

EDIT

Вот некоторые из моих веб-кода вида: WebViewController.m

NSURLRequest *request = [NSURLRequest requestWithURL:urlToLoad cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:30.0f]; 
// load the request to the UIWebView _webView 
[_webView loadRequest:request]; 

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:TRUE]; 
if (connection) { 
    receivedData = [NSMutableData data]; 
} 

Любая помощь очень ценится. Спасибо.

+0

Периодически загружайте страницы, которые вы загружаете? Если вы действительно видите ошибки в виде сообщений, они, скорее всего, поступают из javascript на странице. – SVD

+0

Нет, они не требуют чего-то периодически. Появляющиеся сообщения - это просто UIAlertViews, которые я установил, когда соединение терпит неудачу. Но вместо того, чтобы заполнять это сообщение чем-то, что я пишу, я просто использую localizedDescription из NSError. – eulr

+0

Завершают ли они загрузку перед перемещением приложения в фоновом режиме? Если нет, возможно, стоит попросить некоторое время от ОС, как показывает другой ответ. Если вы просто хотите остановить загрузку, работает ли [webview stopLoading]? – SVD

ответ

0

Если вы выполняете какую-либо важную или важную операцию загрузки или загрузки, и ваше приложение входит в фон, в этом случае вы можете запросить дополнительное время с «IOS», чтобы завершить свою работу, он предоставляет дополнительные 10 минут, чтобы завершить это, пока ваш приложение находится в фоновом режиме.

Но помните, что ваша Операция должна быть важной и приемлемой, иначе ваше приложение может быть отклонено от Apple Review Process.

Для более подробной информации обратитесь Apple, документ для Background Execution and Multitasking

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

if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4 
    if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking 
     UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance 
     __block UIBackgroundTaskIdentifier background_task; //Create a task object 
     background_task = [application beginBackgroundTaskWithExpirationHandler:^{ 
      [application endBackgroundTask: background_task]; //Tell the system that we are done with the tasks 
      background_task = UIBackgroundTaskInvalid; //Set the task to be invalid 
      //System will be shutting down the app at any point in time now 
     }]; 
     //Background tasks require you to use asyncrous tasks 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
      //Perform your tasks that your application requires 
      NSLog(@"\n\nRunning in the background!\n\n"); 

      NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"YOUR HOST URL"]]; 
      NSURLResponse *response = nil; 
      NSError *requestError = nil; 
      NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError]; 

      NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
      NSLog(@"ResponseString:%@",responseString); 

      [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform 
      background_task = UIBackgroundTaskInvalid; //Invalidate the background_task 
     }); 
    } 
} 
+0

Хммм. Это кажется довольно здоровенным и приспособленным для приложений, которые должны что-то сделать после того, как они войдут в фон. Я не хочу что-то делать, я просто хочу остановить загрузку различных веб-представлений или всех подключений в целом. – eulr

+0

В веб-обзоре такого механизма нет, насколько мне известно, но вы можете остановить NSURLConnection с NSURLConnection * cn = [NSURLConnection connectionWithRequest: request delegate: nil]; [cn cancel]; –

+0

как я могу вызвать глобальную переменную экземпляра из одного контроллера просмотра в AppDelegate? Будет ли эффективно импортировать все эти заголовки? – eulr

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