web-dev-qa-db-fra.com

Comment lancer safari et ouvrir une URL depuis une application iOS

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

  • Mon site de support d'applications
  • Tutoriel d'application YouTube
  • Mon site principal (lié à un label "Créé par Dale Dietrich".)

J'ai effectué des recherches sur ce site, sur le Web et dans ma documentation et je n'ai rien trouvé qui soit évident.

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

204
Dale Dietrich

Voici ce que j'ai fait:

  1. J'ai créé une action 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 vers lequel je veux faire un lien.

  3. J'ai connecté le bouton à IBAction dans File Owner de manière appropriée.

  4. Puis implémentez ce qui suit:

Obj C

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

rapide

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

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

Syntaxe Swift:

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

Nouvelle Swift Syntaxe pour iOS 9.3 et versions antérieures

À partir de la nouvelle version de Swift (éventuellement Swift 2?), UIApplication.sharedApplication () est maintenant UIApplication.shared (en exploitant mieux les propriétés calculées que je devine). De plus, l'URL n'est plus convertible implicitement en NSURL, elle doit être explicitement convertie avec as!

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

Nouvelle Swift Syntaxe à partir de iOS 10.

La méthode openURL est obsolète et remplacée par une méthode plus polyvalente, qui utilise un objet options et un gestionnaire d'achèvement asynchrone à partir de iOS 10.0.

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

Ici, il suffit de vérifier que l’url qui va être ouvert est capable de s’ouvrir par appareil, simulateur ou non. Parce que parfois (majorité dans le simulateur), j'ai trouvé que cela provoquait des plantages.

Objective-C

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

Swift 2.

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)
}
50
Chetan Prajapati

Jetez un coup d’œil à la méthode -openURL: sur UIApplication. Cela devrait vous permettre de transmettre une instance NSURL au système, ce qui déterminera quelle application l'ouvrir et le lancer. (N'oubliez pas que vous voudrez probablement vérifier _-canOpenURL:_ d'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 Plain _http://_ liens.)

20
Tim

Et, si vous n'êtes pas sûr si l'URL fournie text a 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];
17
meaning-matters

La version non obsolète d'Objective-C serait:

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

Swift Solution avec un bouton Terminé

N'oubliez pas de import SafariServices

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

Swift 3.

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 plus anciennes d’iOS.

9
Greg T

Puisque 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 Objective-c

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

openURL (:) était obsolète dans iOS 10.0, vous devriez plutôt utilisez la méthode d'instance suivante sur UIApplication: open (: options: completionHandler:)

Exemple d'utilisation de Swift
Ceci 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

3
Ryan H.

Dans Swift 3.

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

Essaye ça:

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

Dans Swift 1.2 , essayez ceci:

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