0

Я пытаюсь очистить, когда приложение вот-вот прекратит/войдет в фон.Почему UIWebView не загружает NSURLRequest в applicationWillTerminate: в моем делете приложения?

Но, когда следующий код называется,

- (void)applicationWillTerminate:(UIApplication *)application 
{ 
    NSURL* url = [NSURL URLWithString:@"http://www.mysite.com/mobile/home?sysmethod=proclogout&systype=mobile&pagetype=jquerymobile"]; 
    [self.webView loadRequest:[[NSURLRequest alloc] initWithURL:logoutURL]]; 
} 

... запрос начинает загрузку, но никогда не заканчивается. Я прочитал в документах Apple, что приложения имеют ~ 5 секунд, чтобы закончить то, что они делают, когда вызвано applicationWillTerminate:.

Я не верю, что процесс проходит примерно так долго, так как я загружаю этот же запрос в другое место приложения, и это всегда происходит всего за миллисекунды.

Я попытался это как синхронно, так и асинхронен, без везения либо образом.

Спасибо за любые мысли!

+0

Маловероятно, что 'applicationWillTerminate:' даже называется. Вы подтвердили, что это называется? И ваше приложение убито. Какой смысл обновлять веб-представление в то время? В следующий раз, когда пользователь загрузит ваше приложение, он будет запущен новым. – rmaddy

+0

applicationWillTerminate будет вызываться только в том случае, если ваше приложение переходит в фоновый режим (единственный вариант, нажав кнопку «Главная» устройства), а «Приложение не работает в фоновом режиме» в файле info.plist вашего приложения установлено в «YES». Иначе это никогда не будет вызвано. Вы используете что-то подобное? –

+0

@AyanSengupta Есть случаи, когда 'applicationWillTerminate' будет вызываться из фона - по крайней мере, с iOS 7. Я не уверен, когда именно, но я думал, что то же самое, пока iOS 7 не выйдет, и мое собственное приложение начало иметь этот метод делегирования называемой при определенных неизвестных условиях. – rmaddy

ответ

3

Запрос на загрузку в UIWebView является асинхронным. Это объясняет, почему запрос начинает для загрузки, но не заканчивается. Если вы хотите удостовериться, что определенный URL-адрес вызван или загружен, вам придется как-то удержать метод applicationWillTerminate: от выхода. Если вам не нужно действительно загружать запрос в веб-представление, вместо этого вы можете использовать [NSURLConnection sendSynchronousRequest:returningResponse:error:].

Кроме того, своего рода Hacky способ сделать это может быть таким:

[_webview stringByEvaluatingJavaScriptFromString:@"window.location.href=\"http://example.com/logout\""]; 

stringByEvaluatingJavaScriptFromString: является блокирующим, синхронный метод. Однако я не пробовал, если он действительно вернется только после полной загрузки запроса. Он может уже вернуться сразу после установки местоположения.

+1

Это заслуживает того, чтобы быть правильным ответом –

+1

Спасибо.Это и есть корень проблемы. Я загружал все свои запросы (во всем приложении) с помощью dispatch_async. Который, я вижу, теперь был лишним. Но, в приведенном выше случае, я удалил диспетчеризацию в applicationWillTerminate: думая, что я делаю синхронный вызов. [NSURLConnection sendSynchronousRequest: returnResponse: error:] работает, потому что все, что я действительно хотел сделать, это запросить, чтобы сервер убил мой сеанс (мне не нужно было загружать запрос). – Hap

+0

@ Хорошо, я рад, что это сработало! –