open app ios ios7 openurl

app - swift open url in browser ios



OpenUrl congela la aplicación por más de 10 segundos (10)

Actualmente estoy desarrollando una aplicación que necesita abrir un navegador para mostrar una página web. Para hacer eso, uso el [UIApplication sharedApplication] openURL con una url.

En iOS 6, esto funciona perfectamente, pero en iOS 7 congela la aplicación por más de 10 segundos, luego abre el navegador y todo está bien.

Esto sucede usando el aprovisionamiento ad hoc. Alguien en internet comentó que este era un problema conocido, sin embargo, un comentario fue todo lo que pude encontrar con respecto a este problema.


Aquí está la respuesta en Swift 3.0 con un cheque para ver si podemos abrir la URL o no.

guard let url = URL(string: myURLString) else { return } if UIApplication.shared.canOpenURL(url) { DispatchQueue.main.async { UIApplication.shared.openURL(url) } }


Descubrí que será mejor usar esto desde iOS 10.

dispatch_async(dispatch_get_main_queue(), ^{ if ([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."].firstObject integerValue] < 10) { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:..."]]; } else { [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel:..."] options:@{} completionHandler:^(BOOL success) { }]; } });


Después de hacer un benchmarking muy rápido, encontré que el método @lidsinkers es claramente el más rápido. Especialmente cuando reemplacé el retraso de 0.1 con 0.001 .

Por lo tanto, decidí convertirlo en código Swift:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.001 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { UIApplication.sharedApplication().openURL(url) }

Método completo:

/// An attempt at solving ''openUrl()'' freeze problem func lidsinkerOpenURL(url: NSURL) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.001 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { UIApplication.sharedApplication().openURL(url) } }


Gracias por el consejo de todos los chicos de arriba, así es como lo resolví en Xamarin.iOS (y Xamarin.Forms). La solución está inspirada en lo que los muchachos han discutido anteriormente, y espero que ayude a otros a enfrentar el mismo problema pero usando Xamarin.

[Register("AppDelegate")] public class AppDelegate { ....

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation) { // We do some logic to respond to launching app, and return to that app. Task.Delay(500).ContinueWith(_ => { this.InvokeOnMainThread( () => { UIApplication.SharedApplication.OpenUrl(NSUrl.FromString(openUri)); }); }); }

}


He visto el mismo problema en iOS 7. Mi solución es solo ligeramente diferente de las propuestas. Al usar performSelector con solo un retraso de 0.1 segundos, la aplicación abre inmediatamente la URL.

[self performSelector:@selector(methodToRedirectToURL:) withObject:url afterDelay:0.1];


Me di cuenta del mismo problema al llamar - [UIApplication openUrl:] del delegado de la aplicación didReceiveRemoteNotification: o didFinishLaunchingWithOptions: desde iOS 7.

Lo solucioné retrasando la llamada un poco usando GCD:

// objc dispatch_async(dispatch_get_main_queue(), ^{ [[UIApplication sharedApplication] openURL:url]; });

Dejó iOS un tiempo para finalizar la inicialización de la aplicación y la llamada se realiza sin ningún problema. No me preguntes por qué.

Te funciona esto ?

Como a menudo se ve esta respuesta, agregué la versión rápida:

// swift dispatch_async(dispatch_get_main_queue()) { UIApplication.sharedApplication().openURL(url) }


Para ios 9

if([[UIApplication sharedApplication] canOpenURL:url]){ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[UIApplication sharedApplication] openURL:url]; }); }

esto parece haber funcionado para mí


Si pone la acción "openURL" en el método viewDidLoad, entonces seguro se ejecutará lentamente. Puedes ponerlo en el método viewDidAppear. O bien, puede usar el GCD en el método viewDidLoad como se muestra a continuación:

dispatch_async(dispatch_get_main_queue(), ^{ [[UIApplication sharedApplication] openURL:url]; });


Swift 4.1 con verificación de versión del sistema operativo.

DispatchQueue.main.async() { if #available(iOS 10.0, *) { UIApplication.shared.open(url) } else { UIApplication.shared.openURL(url) } }


Tenía exactamente los mismos síntomas que describió: funcionó bien en iOS6, pero ~ 10 segundos se cuelgan en iOS7. Resulta ser un problema de enhebrado.

Estábamos emitiendo la aplicación [UIApplication sharedApplication] openURL directamente desde el método AppDelegate applicationDidBecomeActive() . Mover esto a un hilo de fondo resolvió instantáneamente el problema:

- (void)applicationDidBecomeActive:(UIApplication *)application { ... // hangs for 10 seconds // [[UIApplication sharedApplication] openURL:[NSURL URLWithString: url]]; // Fix: use threads! [NSThread detachNewThreadSelector:@selector(openbrowser_in_background:) toTarget:self withObject:url]; ... } - (void)openbrowser_in_background:(NSString *)url { [[UIApplication sharedApplication] openURL:[NSURL URLWithString: url]]; }