ios objective-c nsurl ios10

openURL: desaprobado en iOS 10



objective-c nsurl (4)

// C objetivo

UIApplication *application = [UIApplication sharedApplication]; [application openURL:URL options:@{} completionHandler:nil];

// Swift

UIApplication.shared.open(url, options: [:], completionHandler: nil)

Apple con iOS 10 ha dejado de usar openURL: for openURL: option: completedHandler Si tengo:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"]];

¿Cómo se convertirá? opciones: <# (no NSDictionary *) #> en detalle

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.google.com"] options:<#(nonnull NSDictionary<NSString *,id> *)#> completionHandler:nil];

Gracias

Opciones de actualización: @ {} Para diccionario vacío sin clave ni valor http://useyourloaf.com/blog/querying-url-schemes-with-canopenurl/


Apple introdujo el método openURL: como una forma de abrir enlaces externos con iOS 2. La función relacionada canOpenURL: obtuvo algunos controles de privacidad en iOS 9 para evitar que consulte dispositivos para aplicaciones instaladas. Ahora, con iOS 10, Apple ha desaprobado el simple openURL para openURL:options:completionHandler:

Aquí está mi guía rápida de lo que necesita saber para abrir un enlace externo con iOS 10.

El método ahora en desuso tiene un único parámetro para que se abra la URL y devuelve un booleano para informar sobre el éxito o el fracaso:

// Objective-C - (BOOL)openURL:(NSURL*)url // Swift open func canOpenURL(_ url: URL) -> Bool

El nuevo método en iOS 10:

// Objective-C - (void)openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options completionHandler:(void (^ __nullable)(BOOL success))completion // Swift open func open(_ url: URL, options: [String : Any] = [:], completionHandler completion: (@escaping (Bool) -> Swift.Void)? = nil)

Ahora hay tres parámetros:

  • La URL para abrir
  • Un diccionario de opciones (ver más abajo para las entradas válidas). Use un diccionario vacío para el mismo comportamiento que openURL:
  • Un controlador de finalización llamó a la cola principal con éxito. Anulable si no estás interesado en el estado.

Abriendo una URL con iOS 10

¿Qué significa esto si tienes una aplicación solo para iOS 10, no te importan las opciones y el estado de finalización y solo quieres detener las quejas de Xcode:

// Objective-C UIApplication *application = [UIApplication sharedApplication]; [application openURL:URL options:@{} completionHandler:nil]; // Swift UIApplication.shared.open(url, options: [:], completionHandler: nil)

En la práctica, siempre y cuando aún sea compatible con iOS 9 o anterior, querrá volver al método simple de openURL . Veamos un ejemplo donde hacemos eso y también usamos el controlador de finalización para verificar el estado de la apertura:

Primero con Objective-C:

- (void)openScheme:(NSString *)scheme { UIApplication *application = [UIApplication sharedApplication]; NSURL *URL = [NSURL URLWithString:scheme]; if ([application respondsToSelector:@selector(openURL:options:completionHandler:)]) { [application openURL:URL options:@{} completionHandler:^(BOOL success) { NSLog(@"Open %@: %d",scheme,success); }]; } else { BOOL success = [application openURL:URL]; NSLog(@"Open %@: %d",scheme,success); } } // Typical usage [self openScheme:@"tweetbot://timeline"];

Estoy pasando un diccionario vacío para las opciones y no hago nada útil en el controlador de finalización que no sea registrar el éxito. La versión Swift:

func open(scheme: String) { if let url = URL(string: scheme) { if #available(iOS 10, *) { UIApplication.shared.open(url, options: [:], completionHandler: { (success) in print("Open /(scheme): /(success)") }) } else { let success = UIApplication.shared.openURL(url) print("Open /(scheme): /(success)") } } } // Typical usage open(scheme: "tweetbot://timeline")

Opciones
El archivo de encabezado UIApplication enumera una sola clave para el diccionario de opciones:

  • UIApplicationOpenURLOptionUniversalLinksOnly : use un valor booleano establecido en verdadero (SÍ) para abrir solo la URL si es un enlace universal válido con una aplicación configurada para abrirla. Si no hay una aplicación configurada o el usuario la deshabilitó para abrir el enlace, se llama al controlador de finalización con falso (NO).

Para anular el comportamiento predeterminado, cree un diccionario con la clave establecida en verdadero (SÍ) y pásela como el parámetro de opciones:

// Objective-C NSDictionary *options = @{UIApplicationOpenURLOptionUniversalLinksOnly : @YES}; [application openURL:URL options:options completionHandler:nil]; // Swift let options = [UIApplicationOpenURLOptionUniversalLinksOnly : true] UIApplication.shared.open(url, options: options, completionHandler: nil)

Por ejemplo, si configuro esto como verdadero e intento abrir la URL https://twitter.com/kharrison , fallará si no tengo instalada la aplicación Twitter en lugar de abrir el enlace en Safari.

Refrence : openURL: obsoleto en iOS 10


Escribe de esta manera.

Manejar finalizaciónHandler

UIApplication *application = [UIApplication sharedApplication]; NSURL *URL = [NSURL URLWithString:@"http://www.google.com"]; [application openURL:URL options:@{} completionHandler:^(BOOL success) { if (success) { NSLog(@"Opened url"); } }];

Sin manipular la finalizaciónHandler

[application openURL:URL options:@{} completionHandler:nil];


// In Xcode 9 and iOS 11 UIApplication *application = [UIApplication sharedApplication]; NSURL *URL = [NSURL URLWithString:@"http://facebook.com"]; [application openURL:URL options:@{} completionHandler:^(BOOL success) { if (success) { NSLog(@"Opened url"); } }];