ios - tutorial - ¿Cuándo puedo usar un SFSafariViewController, WKWebView o UIWebView con enlaces universales?
universal links ios tutorial (2)
En la sección de enlaces universales de la Guía de programación de búsqueda de aplicaciones iOS , Apple dice:
Si crea una instancia de un objeto SFSafariViewController, WKWebView o UIWebView para manejar un enlace universal, iOS abre su sitio web en Safari en lugar de abrir su aplicación. Sin embargo, si el usuario toca un enlace universal desde un objeto SFSafariViewController, WKWebView o UIWebView incrustado, iOS abre su aplicación.
¿Qué significa "manejar un enlace universal"? ¿No puedo abrir la URL dada con un SFSafariViewController
, WKWebView
o UIWebView
? ¿Se aplica solo durante -[UIApplicationDelegate application:continueUserActivity:restorationHandler:]
, o hay un tiempo de espera agotado? ¿Significa esto que no podemos abrir la URL en un SFSafariViewController
, WKWebView
o UIWebView
?
No estoy seguro de entender completamente tu pregunta.
Solo para cubrir lo básico, permitiré que Apple explique qué es un Enlace Universal :
Los enlaces universales permiten a los usuarios abrir su aplicación cuando tocan enlaces a su sitio web dentro de las vistas WKWebView y UIWebView y las páginas de Safari, además de los enlaces que resultan en una llamada a openURL :, como las que se producen en Correo, Mensajes y otras aplicaciones.
Básicamente, imagina que estás trabajando en un cliente de Twitter y en la línea de tiempo, encuentras un tweet con el siguiente enlace de video de YouTube: https://youtu.be/ejQod8liXm0
Si lo tocas, ya que es una URL HTTP, esperarías que Safari abra el enlace. Sin embargo, creo que todos los desarrolladores de iOS podemos estar de acuerdo en el hecho de que las aplicaciones nativas son mejores , por lo que una mejor experiencia para el usuario sería que la aplicación oficial de YouTube abra el video , incluso desde un cliente externo.
Esto es lo que permiten "Universal Links"; Si la aplicación de YouTube se registra en iOS como la aplicación responsable del manejo de los enlaces https://www.youtube.com (*), todos en el ecosistema de iOS se benefician si seguimos las reglas de la API . Lo mismo sucede si ejecuta un sitio web y desea que cualquiera de su contenido active su aplicación oficial de iOS para que se abra si su usuario lo tiene instalado, o para que se le pregunte si desea instalarlo para un mejor usuario. experiencia (y para ayudar a su negocio, por supuesto).
Entonces, con todo esto fuera del camino, volvamos al texto original:
Si crea una instancia de un objeto SFSafariViewController, WKWebView o UIWebView para manejar un enlace universal, iOS abre su sitio web en Safari en lugar de abrir su aplicación. Sin embargo, si el usuario toca un enlace universal desde un objeto SFSafariViewController, WKWebView o UIWebView incrustado, iOS abre su aplicación.
Lo que esto significa es que, si desde su aplicación, su usuario toca un Enlace Universal a su contenido (ejemplo: http://www.your-company.com/foo ), y no lo detecta en el código de su aplicación a través de una expresión regular, por ejemplo, y en lugar de crear una instancia de un SFSafariViewController
, WKWebView
o UIWebView
para abrirlo como si fuera un enlace regular a The New York Times o algo así, el sistema operativo comprenderá que, en lugar de abrir esto en su aplicación, quiere que Safari maneja esto por ti Recuerde : todo el propósito de Universal Links es que el usuario obtenga una mejor experiencia al tener la URL manejada por una aplicación nativa, no por el navegador.
Esto es lo que dice la primera oración. En cuanto a la segunda, aclara una posible pregunta de seguimiento: ¿qué sucede si el usuario pulsa un enlace universal a mi contenido desde un navegador integrado desde otra aplicación que no es mía? Luego, dice la oración, el sistema operativo se comportará normalmente: abrirá su aplicación, respetando las reglas de Universal Link.
TL; DR: también debe detectar los enlaces universales a su contenido desde su aplicación, en el código, y manejarlos . iOS no manejará esto por ti. En cambio, si le dice al sistema operativo que abra un enlace universal al contenido de su aplicación en un navegador integrado desde su aplicación, hará exactamente lo que se le indica.
EDITAR: Si necesita ayuda para decidir entre solicitar SFSafariViewController
o la -openURL:options:completitionHandler:
API para abrir una URL, este enlace le ayudará ; Mi recomendación sería usar -openURL:options:completitionHandler:
primero, y si no tiene éxito, use SFSafariViewController
o similar .
Espero que esto ayude y que he entendido correctamente su pregunta.
¡Aclamaciones! ¡Y feliz programación iOS 11! :)
Resolví este problema con mi clase de Swift 4 a continuación. También utiliza el navegador Safari integrado si es posible. Puedes seguir un método similar en tu caso también.
import UIKit
import SafariServices
class OpenLink {
static func inAnyNativeWay(url: URL, dontPreferEmbeddedBrowser: Bool = false) { // OPEN AS UNIVERSAL LINK IF EXISTS else : EMBEDDED or EXTERNAL
if #available(iOS 10.0, *) {
// Try to open with owner universal link app
UIApplication.shared.open(url, options: [UIApplication.OpenExternalURLOptionsKey.universalLinksOnly : true]) { (success) in
if !success {
if dontPreferEmbeddedBrowser {
withRegularWay(url: url)
} else {
inAnyNativeBrowser(url: url)
}
}
}
} else {
if dontPreferEmbeddedBrowser {
withRegularWay(url: url)
} else {
inAnyNativeBrowser(url: url)
}
}
}
private static func isItOkayToOpenUrlInSafariController(url: URL) -> Bool {
return url.host != nil && (url.scheme == "http" || url.scheme == "https") //url.host!.contains("twitter.com") == false
}
static func inAnyNativeBrowser(url: URL) { // EMBEDDED or EXTERNAL BROWSER
if isItOkayToOpenUrlInSafariController(url: url) {
inEmbeddedSafariController(url: url)
} else {
withRegularWay(url: url)
}
}
static func inEmbeddedSafariController(url: URL) { // EMBEDDED BROWSER ONLY
let vc = SFSafariViewController(url: url, entersReaderIfAvailable: false)
if #available(iOS 11.0, *) {
vc.dismissButtonStyle = SFSafariViewController.DismissButtonStyle.close
}
mainViewControllerReference.present(vc, animated: true)
}
static func withRegularWay(url: URL) { // EXTERNAL BROWSER ONLY
if #available(iOS 10.0, *) {
UIApplication.shared.open(url, options: [UIApplication.OpenExternalURLOptionsKey(rawValue: "no"):"options"]) { (good) in
if !good {
Logger.log(text: "There is no application on your device to open this link.")
}
}
} else {
UIApplication.shared.openURL(url)
}
}
}