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.


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

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)

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

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


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];

@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];

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


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

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


2

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

Usage:

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

Référence:

OpenURL dans iOS10


1

Essaye ça:

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

0

Dans Swift 1.2, essayez ceci:

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

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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.