Comment lancer Safari et ouvrir l'URL depuis l'application iOS

215

Sur la page des paramètres, je souhaite inclure trois liens vers

  • Mon site de support d'application
  • Tutoriel de l'application YouTube
  • Mon site principal (c.-à-d. Lié à un label «Créé par Dale Dietrich».)

J'ai recherché ce site et le Web et ma documentation et je n'ai rien trouvé d'évident.

REMARQUE: je ne souhaite pas ouvrir de pages Web dans mon application. Je veux juste envoyer le lien vers Safari et ce lien doit y être ouvert. J'ai vu un certain nombre d'applications faire la même chose dans leur page Paramètres, cela doit donc être possible.

Dale Dietrich
la source
Même problème que je rencontre dans le développement hybride à l'aide de l'application Ionic Cordova
Sopo

Réponses:

387

Voici ce que j'ai fait:

  1. J'ai créé une IBAction dans les fichiers d'en-tête .h comme suit:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. J'ai ajouté un UIButton sur la page Paramètres contenant le texte auquel je veux créer un lien.

  3. J'ai correctement connecté le bouton à IBAction dans File Owner.

  4. Ensuite, implémentez les éléments suivants:

Objectif c

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

Rapide

(IBAction dans viewController, plutôt que dans le fichier d'en-tête)

if let link = URL(string: "https://yoursite.com") {
  UIApplication.shared.open(link)
}
Dale Dietrich
la source
8
Mais ce n'est pas à 100%, car si quelqu'un utilise un iOS jailbreaké et utilise Chrome ou quelque chose comme navigateur par défaut, cela ouvrira cela, pas Safari
Laszlo
214
J'ai l'impression que si quelqu'un a fait l'effort de jailbreaker son téléphone pour faire de Chrome son navigateur par défaut, honorer ce paramètre est probablement le comportement idéal.
rpowell
J'ai compris cela, mais si j'ouvre un site Web et que l'utilisateur surfe sur le site Web maintenant s'il s'arrête sur une page particulière, puis-je obtenir le lien de la page Web actuelle dans mon code?
Varun Jain
3
La méthode ci-dessus est obsolète, utilisez maintenant la méthode suivante. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertisement.url] options: @ {} complétéHandler: ^ (BOOL success) {}];
Mashhadi
@Laszlo En outre, dans les paramètres, nous pouvons désactiver Safari dans les restrictions. J'ai codé une application avec comme schémas d'URL http et https pour ouvrir d'autres navigateurs lorsqu'une URL http ou https est ouverte et que Safari est désactivé. Ainsi, même sans Jailbreak, nous pouvons techniquement changer le navigateur Web par défaut.
ColdGrub1384
164

Syntaxe rapide:

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

Nouvelle syntaxe Swift pour iOS 9.3 et versions antérieures

À partir d'une nouvelle version de Swift (peut-être swift 2?), UIApplication.sharedApplication () est maintenant UIApplication.shared (en faisant un meilleur usage des propriétés calculées, je suppose). De plus, l'URL n'est plus implicitement convertible en NSURL, doit être explicitement convertie avec as!

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

Nouvelle syntaxe Swift à partir d'iOS 10.0

La méthode openURL a été déconseillée et remplacée par une méthode plus polyvalente qui prend un objet options et un gestionnaire de complétion asynchrone à partir d'iOS 10.0

UIApplication.shared.open(NSURL(string:"http://www.reddit.com/")! as URL)
Dustin Williams
la source
31
Les versions Swift des réponses sont extrêmement utiles aux développeurs Swift, c'est un nouveau langage sans beaucoup de documentation, en particulier. sur la résolution de problèmes iOS réels. Dans mon cas, la saisie semi-automatique avait choisi le sélecteur "fileURLWithPath:" et je ne savais pas que c'était la raison pour laquelle mon URL ne s'ouvrait pas, c'est seulement en lisant la réponse de Dustin que j'ai vu que j'aurais dû utiliser le sélecteur "string:" . Donc Dustin devrait être voté, pas châtié.
SafeFastExpressive
3
@g_fred. Pourquoi ne pourrait-il pas inclure une version Swift?
ericgu
2
openURL(_:)a été déconseillé dans iOS 10.0, à la place, vous devez appeler la méthode d'instance open(_:options:completionHandler:)sur UIApplication.
Ryan H.
2
Vous pouvez utiliser directement l'URL au lieu de NSURL afin de pouvoir enregistrer la distribution.
marsbear
1
Je recommande de ne jamais forcer le déballage. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }vous servira toujours mieux. Pourrait vouloir assertet erreur dans l' elseinstruction pour attraper les fautes de frappe.
philipp
53

Ici, une vérification est nécessaire pour que l'url qui va être ouverte puisse s'ouvrir par un appareil ou un simulateur ou non. Parce que parfois (majorité dans le simulateur), j'ai trouvé que cela provoquait des plantages.

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

Swift 4.2

guard let url = URL(string: "some url") else {
    return
}
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}
Chetan Prajapati
la source
1
Vous pouvez toujours ouvrir HTTP / HTTPS. Depuis iOS 9, vous devez ajouter à la liste blanche toutes les URL que vous souhaitez appeler canOpenURL. Je ne vois pas pourquoi vous n'appeleriez pas simplement openURL:urlet si cela échoue, faites face à l'échec. canOpenURLest principalement utilisé pour détecter l'installation d'une application sans quitter l'application actuelle.
Ben Flynn
1
openURL(_:)a été déconseillé dans iOS 10.0, à la place, vous devez appeler la méthode d'instance open(_:options:completionHandler:)sur UIApplication.
Ryan H.
20

Jetez un œil à la -openURL:méthode sur UIApplication. Il devrait vous permettre de transmettre une instance NSURL au système, qui déterminera dans quelle application l'ouvrir et lancer cette application. (Gardez à l'esprit que vous voudrez probablement vérifier d' -canOpenURL:abord, juste au cas où l'URL ne pourrait pas être gérée par les applications actuellement installées sur le système - bien que ce ne soit probablement pas un problème pour les http://liens simples .)

Tim
la source
Merci Tim. Vous avez raison. J'ajoutais ma propre réponse lorsque la vôtre est arrivée. Désolé pour cela. Mais au moins, il existe maintenant un mode d'emploi facile pour ceux qui me suivent.
Dale Dietrich
Pas de soucis - heureux d'avoir trouvé la solution!
Tim
1
openURL(_:)a été déconseillé dans iOS 10.0, à la place, vous devez appeler la méthode d'instance open(_:options:completionHandler:)sur UIApplication.
Ryan H.
17

Et, au cas où vous ne seriez pas sûr si l'URL fournie texta un schéma:

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];
le sens compte
la source
@Vlad Ce n'est qu'un exemple codé en dur. Souvent, la chaîne d'URL ( textici) ne sera pas codée en dur et vous aurez besoin d'un code comme celui-ci.
sens-importe
@Vlad Avez-vous été frustré, et si oui, comment / pourquoi? Je suppose que les gens ne se contentent pas de copier après le code ci-dessus.
signification est importante le
1
c'est important pour vous :)
Vlad
13

La version Objective-C non déconseillée serait:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://apple.com"] options:@{} completionHandler:nil];
Antzi
la source
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)
    }
}

Cela prend également en charge les appareils exécutant des versions antérieures d'iOS

Greg T
la source
10

Solution Swift 3 avec un bouton Terminé

N'oubliez pas import SafariServices

if let url = URL(string: "http://www.yoururl.com/") {
            let vc = SFSafariViewController(url: url, entersReaderIfAvailable: true)
            present(vc, animated: true)
        }
Baher A
la source
C'est la réponse parfaite qui fonctionne dans les extensions iOS et iOS. Les autres réponses ne fonctionnent que dans les applications et ne peuvent pas être utilisées dans les extensions.
Owen Zhao
5

Étant donné que cette réponse est obsolète depuis iOS 10.0, une meilleure réponse serait:

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

y en Objectif-c

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

openURL ( :) était obsolète dans iOS 10.0, à la place, vous devez utiliser la méthode d'instance suivante sur UIApplication: open ( : options: complétHandler :)

Exemple utilisant Swift
Cela ouvrira " https://apple.com " dans Safari.

if let url = URL(string: "https://apple.com") {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

https://developer.apple.com/reference/uikit/uiapplication/1648685-open

Ryan H.
la source
2

Dans SWIFT 3.0

               if let url = URL(string: "https://www.google.com") {
                 UIApplication.shared.open(url, options: [:])
               }
Ourang-Zeb Khan
la source
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)")
     }
   }
 }

Usage:

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

Référence:

OpenURL dans iOS10

Zgpeace
la source
1

Essaye ça:

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

Dans Swift 1.2, essayez ceci:

let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
Dilip Tiwari
la source
plz dites-moi quelle est la nouvelle dans le code que vous avez écrit et vous m'avez marqué vote
Dilip Tiwari
-2

Solution Swift 4:

UIApplication.shared.open(NSURL(string:"http://yo.lo")! as URL, options: [String : Any](), completionHandler: nil)
Kevin ABRIOUX
la source
1
Une bonne version de Swift 4 utiliserait l'URL et non NSURL. Et la diffusion de NSURL en URL n'est pas la même. Voir stackoverflow.com/a/37812485/2227743 pour une explication. En outre, le déballage forcé est mauvais.
Eric Aya