Cómo iniciar Safari y abrir URL desde la aplicación iOS


215

En la página de configuración, quiero incluir tres enlaces a

  • Mi sitio de soporte de aplicaciones
  • Tutorial de la aplicación de YouTube
  • Mi sitio principal (es decir, vinculado a una etiqueta 'Creado por Dale Dietrich').

He buscado este sitio y la web y mi documentación y no he encontrado nada que sea obvio.

NOTA: No quiero abrir páginas web dentro de mi aplicación. Solo quiero enviar el enlace a Safari y ese enlace estará abierto allí. He visto varias aplicaciones que hacen lo mismo en su página de Configuración, por lo que debe ser posible.


Mismo problema que estoy enfrentando en el desarrollo híbrido usando la aplicación Ionic Cordova
Sopo

Respuestas:


386

Esto es lo que hice:

  1. Creé una IBAction en los archivos de encabezado .h de la siguiente manera:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Agregué un UIButton en la página de Configuración que contiene el texto al que quiero vincular.

  3. Conecté el botón a IBAction en File Owner adecuadamente.

  4. Luego implemente lo siguiente:

C objetivo

- (IBAction)openDaleDietrichDotCom:(id)sender {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.daledietrich.com"]];
}

Rápido

(IBAction en viewController, en lugar del archivo de encabezado)

if let link = URL(string: "https://yoursite.com") {
  UIApplication.shared.open(link)
}

8
Pero esto no es 100%, porque si alguien usa un iOS liberado y usa Chrome o algo como navegador predeterminado, esto abrirá eso, no Safari
Laszlo

214
Siento que si alguien se ha esforzado por liberar su teléfono para hacer que Chrome sea su navegador predeterminado, honrando esa configuración es probablemente el comportamiento ideal.
rpowell

Entendí esto, pero si estoy abriendo un sitio web y el usuario está navegando por el sitio web ahora si se detiene en una página en particular, ¿puedo obtener el enlace de la página web actual en mi código?
Varun Jain

3
El método anterior está en desuso ahora usa el siguiente. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertisement.url] opciones: @ {} completeHandler: ^ (BOOL success) {}];
Mashhadi

@Laszlo Además, en la configuración podemos deshabilitar Safari en Restricciones. Codifiqué una aplicación con esquemas de URL http y https para abrir otros navegadores cuando se abre una URL http o https y Safari está desactivado. Entonces, incluso sin Jailbreak, técnicamente podemos cambiar el navegador web predeterminado.
ColdGrub1384

164

Sintaxis rápida:

UIApplication.sharedApplication().openURL(NSURL(string:"http://www.reddit.com/")!)

Nueva sintaxis Swift para iOS 9.3 y versiones anteriores

A partir de una nueva versión de Swift (¿posiblemente swift 2?), UIApplication.sharedApplication () ahora es UIApplication.shared (supongo que se hace un mejor uso de las propiedades calculadas). Además, la URL ya no es convertible implícitamente a NSURL, ¡debe convertirse explícitamente con as!

UIApplication.sharedApplication.openURL(NSURL(string:"http://www.reddit.com/") as! URL)

Nueva sintaxis Swift a partir de iOS 10.0

El método openURL ha quedado obsoleto y reemplazado por un método más versátil que toma un objeto de opciones y un controlador de finalización asíncrono a partir de iOS 10.0

UIApplication.shared.open(NSURL(string:"http://www.reddit.com/")! as URL)

31
Las versiones de respuestas rápidas son extremadamente útiles para los desarrolladores de Swift, es un nuevo lenguaje sin mucha documentación, especialmente. en resolver problemas de iOS del mundo real. En mi caso, autocompletar había elegido el selector "fileURLWithPath:" y no me di cuenta de que esa era la razón por la cual mi URL no se abría, fue solo al leer la respuesta de Dustin que vi que debería haber estado usando el selector "string:" . Entonces Dustin debería ser votado, no castigado.
SafeFastExpressive

3
@g_fred. ¿Por qué no podría incluir una versión Swift?
ericgu

2
openURL(_:)fue desaprobado en iOS 10.0, en su lugar, debe llamar al método de instancia open(_:options:completionHandler:)en UIApplication.
Ryan H.

2
Puede usar directamente la URL en lugar de NSURL para poder guardar el elenco.
marsbear

1
Recomiendo nunca forzar el desenvolvimiento. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }siempre te servirá mejor. Puede querer asserty error en la elsedeclaración para detectar errores tipográficos.
philipp

53

Aquí se requiere una comprobación de que la url que se abrirá puede abrirse por dispositivo o simulador o no. Porque algunas veces (la mayoría en el simulador) descubrí que causa accidentes.

C objetivo

NSURL *url = [NSURL URLWithString:@"some url"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
   [[UIApplication sharedApplication] openURL:url];
}

Swift 2.0

let url : NSURL = NSURL(string: "some url")!
if UIApplication.sharedApplication().canOpenURL(url) {
     UIApplication.sharedApplication().openURL(url)
}

Swift 4.2

guard let url = URL(string: "some url") else {
    return
}
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

1
Siempre puede abrir HTTP / HTTPS. A partir de iOS 9, debe incluir en la lista blanca cualquier URL a la que desee llamar canOpenURL. No veo por qué simplemente no llamarías openURL:urly si falla, lidia con la falla. canOpenURLse usa principalmente para detectar la instalación de una aplicación sin salir de la aplicación actual.
Ben Flynn

1
openURL(_:)fue desaprobado en iOS 10.0, en su lugar, debe llamar al método de instancia open(_:options:completionHandler:)en UIApplication.
Ryan H.

20

Eche un vistazo al -openURL:método en UIApplication. Debería permitirle pasar una instancia NSURL al sistema, que determinará en qué aplicación abrirla y ejecutar esa aplicación. (Tenga en cuenta que probablemente desee verificar -canOpenURL:primero, en caso de que la URL no pueda ser manejada por las aplicaciones instaladas actualmente en el sistema, aunque esto probablemente no sea un problema para los http://enlaces simples ).


Gracias Tim. Estás justo en el punto. Estaba agregando mi propia respuesta cuando llegó la suya. Lo siento. Pero al menos ahora hay un procedimiento fácil para aquellos que me siguen.
Dale Dietrich

No se preocupe, ¡me alegro de haber encontrado la solución!
Tim

1
openURL(_:)fue desaprobado en iOS 10.0, en su lugar, debe llamar al método de instancia open(_:options:completionHandler:)en UIApplication.
Ryan H.

17

Y, en caso de que no esté seguro de si la URL proporcionada texttiene un esquema:

NSString* text = @"www.apple.com";
NSURL*    url  = [[NSURL alloc] initWithString:text];

if (url.scheme.length == 0)
{
    text = [@"http://" stringByAppendingString:text];
    url  = [[NSURL alloc] initWithString:text];
}

[[UIApplication sharedApplication] openURL:url];

@Vlad Este es solo un ejemplo codificado. A menudo, la cadena de URL ( textaquí) no estará codificada y necesita un código como este.
significado-asuntos

@Vlad ¿Estaba frustrado y, en caso afirmativo, cómo / por qué? Supongo que las personas no solo copian el código anterior.
significado-asuntos

1
significado-asuntos Depende de usted :)
Vlad

13

La versión de Objective-C no obsoleta sería:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://apple.com"] options:@{} completionHandler:nil];

10

Swift 3.0

if let url = URL(string: "https://www.reddit.com") {
    if #available(iOS 10.0, *) {
        UIApplication.shared.open(url, options: [:])
    } else {
        UIApplication.shared.openURL(url)
    }
}

Esto también es compatible con dispositivos que ejecutan versiones anteriores de iOS


10

Solución Swift 3 con un botón Listo

No te olvides de import SafariServices

if let url = URL(string: "http://www.yoururl.com/") {
            let vc = SFSafariViewController(url: url, entersReaderIfAvailable: true)
            present(vc, animated: true)
        }

Esta es la respuesta perfecta que funciona tanto en iOS como en extensiones de iOS. Otras respuestas solo funcionan en aplicaciones y no se pueden usar en extensiones.
Owen Zhao

5

Debido a que esta respuesta está en desuso desde iOS 10.0, una mejor respuesta sería:

if #available(iOS 10.0, *) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}else{
    UIApplication.shared.openURL(url)
}

y en Objetivo-c

[[UIApplication sharedApplication] openURL:@"url string" options:@{} completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"Opened url");
        }
    }];


2

En SWIFT 3.0

               if let url = URL(string: "https://www.google.com") {
                 UIApplication.shared.open(url, options: [:])
               }

2

Swift 5:

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)")
     }
   }
 }

Uso:

open(scheme: "http://www.bing.com")

Referencia:

OpenURL en iOS10


1

Prueba esto:

NSString *URL = @"xyz.com";
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:URL]])
{
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:URL]];
}

0

En Swift 1.2, intente esto:

let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)

por favor, dime cuál es el nuevo código que has escrito y me diste voto
Dilip Tiwari

-2

Solución Swift 4:

UIApplication.shared.open(NSURL(string:"http://yo.lo")! as URL, options: [String : Any](), completionHandler: nil)

1
Una versión adecuada de Swift 4 usaría URL y no NSURL. Y transmitir NSURL como URL no es lo mismo. Consulte stackoverflow.com/a/37812485/2227743 para obtener una explicación. Además, el desenvolvimiento forzado es malo.
Eric Aya
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.