xcode - program - Aplicación para iOS: establezca el tiempo de espera para la carga de UIWebView
subir app a app store 2018 (4)
El timeoutInterval es para la conexión. Una vez que webview esté conectado a la URL, deberá iniciar NSTimer y realizar su propio manejo del tiempo de espera. Algo como:
// define NSTimer *timer; somewhere in your class
- (void)cancelWeb
{
NSLog(@"didn''t finish loading within 20 sec");
// do anything error
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[timer invalidate];
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
// webView connected
timer = [NSTimer scheduledTimerWithTimeInterval:20.0 target:self selector:@selector(cancelWeb) userInfo:nil repeats:NO];
}
Tengo una aplicación nativa de iOS simple que carga un solo UIWebView. Me gustaría que webView muestre un mensaje de error si la aplicación no termina de cargar la página inicial en 20 segundos.
Cargo mi URL para el webView dentro de mi viewDidLoad
como este (simplificado):
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.com"] cachePolicy:NSURLCacheStorageAllowed timeoutInterval:20.0]];
El timeoutInterval
dentro del código anterior no "hace" nada en realidad, ya que Apple lo ha configurado dentro del sistema operativo para que no se agote por 240 segundos.
Tengo mi conjunto de acciones webView didFailLoadWithError
, pero si el usuario TIENE una conexión de red, esto nunca se llama. El webView simplemente sigue intentando cargar con mi networkActivityIndicator spinning.
¿Hay alguna manera de establecer un tiempo de espera para la vista web?
Los codificadores Swift pueden hacerlo de la siguiente manera:
var timeOut: NSTimer!
func webViewDidStartLoad(webView: UIWebView) {
self.timeOut = NSTimer.scheduledTimerWithTimeInterval(7.0, target: self, selector: "cancelWeb", userInfo: nil, repeats: false)
}
func webViewDidFinishLoad(webView: UIWebView) {
self.timeOut.invalidate()
}
func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
self.timeOut.invalidate()
}
func cancelWeb() {
print("cancelWeb")
}
Mi forma es similar a la respuesta aceptada, pero simplemente deja de Cargar cuando se agota el tiempo de espera y el control en didFailLoadWithError.
- (void)timeout{
if ([self.webView isLoading]) {
[self.webView stopLoading];//fire in didFailLoadWithError
}
}
- (void)webViewDidStartLoad:(UIWebView *)webView{
self.timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(timeout) userInfo:nil repeats:NO];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView{
[self.timer invalidate];
}
- (void)webView:(UIWebView *)webView didFailLoadWithError:(nullable NSError *)error{
//Error 999 fire when stopLoading
[self.timer invalidate];//invalidate for other errors, not time out.
}
Todas las soluciones sugeridas no son ideales. La forma correcta de manejar esto es usando el timeoutInterval en el NSMutableURLRequest
:
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://web.site"]];
request.timeoutInterval = 10;
[webview loadRequest:request];