Come avviare Safari e aprire l'URL dall'app iOS


215

Nella pagina delle impostazioni, voglio includere tre collegamenti a

  • Il mio sito di supporto per le app
  • Tutorial app YouTube
  • Il mio sito principale (ovvero: collegato a un'etichetta "Creato da Dale Dietrich").

Ho cercato questo sito, il web e la mia documentazione e non ho trovato nulla di ovvio.

NOTA: non desidero aprire pagine Web all'interno della mia app. Voglio solo inviare il link a Safari e quel link deve essere aperto lì. Ho visto diverse app fare la stessa cosa nella loro pagina Impostazioni, quindi deve essere possibile.


Stesso problema che sto affrontando nello sviluppo ibrido utilizzando l'app Ionic Cordova
Sopo

Risposte:


387

Ecco cosa ho fatto:

  1. Ho creato un IBAction nei file .h dell'intestazione come segue:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Ho aggiunto un pulsante UIB nella pagina Impostazioni contenente il testo a cui voglio collegarmi.

  3. Ho collegato il pulsante a IBAction in File Owner in modo appropriato.

  4. Quindi implementare quanto segue:

Objective-C

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

veloce

(IBAction in viewController, anziché file di intestazione)

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

8
Ma questo non è al 100%, perché se qualcuno usa un iOS con jailbreak e usa Chrome o qualcosa come browser predefinito, questo aprirà questo, non Safari
Laszlo

214
Mi sento come se qualcuno si fosse sforzato di eseguire il jailbreak del telefono per rendere Chrome il browser predefinito, onorare che l'impostazione è probabilmente il comportamento ideale.
rpowell,

L'ho capito, ma se apro un sito Web e l'utente sta navigando nel sito ora se si ferma su una determinata pagina, posso ottenere il collegamento alla pagina Web corrente nel mio codice?
Varun Jain,

3
Il metodo sopra è deprecato ora usa quanto segue. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertisement.url] opzioni: @ {} completamentoHandler: ^ (successo BOOL) {}];
Mashhadi,

@Laszlo Inoltre, nelle impostazioni possiamo disabilitare Safari in Restrizioni. Ho codificato un'app con come schemi URL http e https per aprire altri browser quando viene aperto un URL http o https e Safari è disabilitato. Quindi, anche senza il jailbreak, possiamo tecnicamente cambiare il browser Web predefinito.
ColdGrub1384,

164

Sintassi rapida:

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

Nuova sintassi Swift per iOS 9.3 e precedenti

A partire da alcune nuove versioni di Swift (possibilmente swift 2?), UIApplication.sharedApplication () è ora UIApplication.shared (sto facendo un miglior uso delle proprietà calcolate, suppongo). Inoltre l'URL non è più implicitamente convertibile in NSURL, deve essere esplicitamente convertito con as!

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

Nuova sintassi Swift a partire da iOS 10.0

Il metodo openURL è stato deprecato e sostituito con un metodo più versatile che accetta un oggetto opzioni e un gestore di completamento asincrono a partire da iOS 10.0

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

31
Le versioni Swift delle risposte sono estremamente utili per gli sviluppatori Swift, è una nuova lingua senza molta documentazione, esp. sulla risoluzione dei problemi iOS reali. Nel mio caso, il completamento automatico aveva scelto il selettore "fileURLWithPath:" e non mi rendevo conto che era per questo che il mio URL non si apriva, solo leggendo la risposta di Dustin ho visto che avrei dovuto usare il selettore "string:" . Quindi Dustin dovrebbe essere votato, non castigato.
SafeFastExpressive

3
@g_fred. Perché non dovrebbe essere in grado di includere una versione di Swift?
ericgu,

2
openURL(_:)era obsoleto in iOS 10.0, invece dovresti chiamare il metodo di istanza open(_:options:completionHandler:)su UIApplication.
Ryan H.

2
È possibile utilizzare direttamente l'URL anziché NSURL in modo da poter salvare il cast.
Marsbear,

1
Consiglio di non forzare mai lo scartamento. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }servirà sempre il tuo meglio. Potrebbe voler asserted errore elsenell'istruzione per catturare errori di battitura.
philipp

53

Qui è richiesto un controllo che l'URL che sarà aperto sia in grado di aprire per dispositivo o simulatore o meno. Perché alcune volte (la maggior parte nel simulatore) ho scoperto che provoca arresti anomali.

Objective-C

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

Rapido 4.2

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

1
Puoi sempre aprire HTTP / HTTPS. A partire da iOS 9, devi inserire nella whitelist qualsiasi URL che desideri chiamare canOpenURL. Non vedo perché non chiameresti semplicemente openURL:urle se fallisce, gestisci il fallimento. canOpenURLviene utilizzato principalmente per rilevare l'installazione di un'app senza uscire dall'app corrente.
Ben Flynn,

1
openURL(_:)era obsoleto in iOS 10.0, invece dovresti chiamare il metodo di istanza open(_:options:completionHandler:)su UIApplication.
Ryan H.

20

Dai un'occhiata al -openURL:metodo su UIApplication. Dovrebbe consentire di passare un'istanza NSURL al sistema, che determinerà in quale app aprirla e lanciare tale applicazione. (Tieni presente che probabilmente vorrai verificare -canOpenURL:prima, nel caso in cui l'URL non possa essere gestito da app attualmente installate sul sistema, anche se questo probabilmente non è un problema per i http://link semplici .)


Grazie Tim. Hai ragione. Stavo aggiungendo la mia risposta appena arrivata la tua. Mi dispiace per quello. Ma almeno adesso c'è un facile how-to per quelli che mi seguono.
Dale Dietrich,

Nessun problema - felice di aver trovato la soluzione!
Tim

1
openURL(_:)era obsoleto in iOS 10.0, invece dovresti chiamare il metodo di istanza open(_:options:completionHandler:)su UIApplication.
Ryan H.

17

E, nel caso in cui non sei sicuro che l'URL fornito textabbia uno schema:

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 Questo è solo un esempio codificato. Spesso la stringa dell'URL ( textqui) non è codificata e hai bisogno di un codice come questo.
significato-materia

@Vlad Eri frustrato, e se sì come / perché? Presumo che le persone non si limitino a copiare oltre il codice sopra.
significato-questioni

1
significato-importa Dipende da te :)
Vlad

13

La versione non deprecata di Objective-C sarebbe:

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

Questo supporta anche i dispositivi che eseguono versioni precedenti di iOS


10

Soluzione Swift 3 con un pulsante Fine

Non dimenticare di import SafariServices

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

Questa è la risposta perfetta che funziona in entrambe le estensioni iOS e iOS. Altre risposte funzionano solo nelle app e non possono essere utilizzate nelle estensioni.
Owen Zhao,

5

Poiché questa risposta è obsoleta da iOS 10.0, una risposta migliore sarebbe:

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

y it Obiettivo-c

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


2

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

Riferimento:

OpenURL in iOS10


1

Prova questo:

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

0

In Swift 1.2 , prova questo:

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

per favore dimmi qual è la novità del codice che hai scritto e mi hai segnato il voto contrario
Dilip Tiwari

-2

Soluzione Swift 4:

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

1
Una versione corretta di Swift 4 userebbe l'URL e non NSURL. E trasmettere NSURL come URL non è lo stesso. Consulta stackoverflow.com/a/37812485/2227743 per una spiegazione. Inoltre, forzare lo scartamento è negativo.
Eric Aya
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.