So starten Sie Safari und öffnen die URL über die iOS-App


215

Auf der Einstellungsseite möchte ich drei Links zu einfügen

  • Meine App-Support-Site
  • YouTube App Tutorial
  • Meine primäre Site (dh: verknüpft mit einem Label "Erstellt von Dale Dietrich".)

Ich habe diese Site und das Web sowie meine Dokumentation durchsucht und nichts Offensichtliches gefunden.

HINWEIS: Ich möchte keine Webseiten in meiner App öffnen. Ich möchte nur den Link zu Safari senden und dieser Link ist dort offen. Ich habe auf der Seite "Einstellungen" eine Reihe von Apps gesehen, die dasselbe tun. Es muss also möglich sein.


Das gleiche Problem, mit dem ich in der Hybrid-Entwicklung mit der Ionic Cordova App konfrontiert bin
Sopo

Antworten:


386

Folgendes habe ich getan:

  1. Ich habe eine IBAction in den Header-H-Dateien wie folgt erstellt:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Ich habe auf der Seite "Einstellungen" einen UIButton hinzugefügt, der den Text enthält, zu dem ich einen Link erstellen möchte.

  3. Ich habe die Schaltfläche entsprechend mit IBAction im Dateibesitzer verbunden.

  4. Implementieren Sie dann Folgendes:

Ziel c

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

Schnell

(IBAction in viewController anstelle der Header-Datei)

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

8
Aber das ist nicht 100%, denn wenn jemand ein iOS mit Jailbreak verwendet und Chrome oder etwas anderes als Standardbrowser verwendet, wird dies geöffnet, nicht Safari
Laszlo

214
Ich habe das Gefühl, dass jemand, der sich die Mühe gemacht hat, sein Handy zu jailbreaken, um Chrome zu seinem Standardbrowser zu machen, diese Einstellung zu beachten wahrscheinlich das ideale Verhalten ist.
Rpowell

Ich habe das verstanden, aber wenn ich eine Website öffne und der Benutzer jetzt auf der Website surft, wenn er auf einer bestimmten Seite vorbeischaut, kann ich dann den aktuellen Webseiten-Link in meinem Code erhalten?
Varun Jain

3
Die obige Methode ist veraltet. Verwenden Sie nun Folgendes. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertisement.url] Optionen: @ {} CompletionHandler: ^ (BOOL-Erfolg) {}];
Mashhadi

@ Laszlo Außerdem können wir in den Einstellungen Safari in Einschränkungen deaktivieren. Ich habe eine App mit den URL-Schemata http und https codiert, um andere Browser zu öffnen, wenn eine http- oder https-URL geöffnet und Safari deaktiviert ist. Selbst ohne Jailbreak können wir den Standard-Webbrowser technisch ändern.
ColdGrub1384

164

Schnelle Syntax:

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

Neue Swift-Syntax für iOS 9.3 und früher

Ab einer neuen Version von Swift (möglicherweise Swift 2?) Ist UIApplication.sharedApplication () jetzt UIApplication.shared (ich vermute, die berechneten Eigenschaften werden besser genutzt). Außerdem ist die URL nicht mehr implizit in NSURL konvertierbar, sondern muss explizit mit as konvertiert werden!

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

Neue Swift-Syntax ab iOS 10.0

Die openURL-Methode wurde veraltet und durch eine vielseitigere Methode ersetzt, die ab iOS 10.0 ein Optionsobjekt und einen asynchronen Abschlusshandler verwendet

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

31
Schnelle Versionen von Antworten sind für Swift-Entwickler äußerst nützlich. Es ist eine neue Sprache ohne viel Dokumentation, insb. zur Lösung realer iOS-Probleme. In meinem Fall hatte Autocomplete den Selektor "fileURLWithPath:" ausgewählt, und ich wusste nicht, dass meine URL aus diesem Grund nicht geöffnet wurde. Erst als ich Dustins Antwort las, sah ich, dass ich den Selektor "string:" hätte verwenden sollen . Also sollte Dustin aufgewertet und nicht bestraft werden.
SafeFastExpressive

3
@g_fred. Warum sollte er keine Swift-Version aufnehmen können?
Ericgu

2
openURL(_:)wurde in iOS 10.0 veraltet, stattdessen sollten Sie die Instanzmethode open(_:options:completionHandler:)für UIApplication aufrufen.
Ryan H.

2
Sie können URL anstelle von NSURL direkt verwenden, um die Besetzung zu speichern.
Marsbear

1
Ich empfehle, niemals das Auspacken zu erzwingen. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }wird immer besser dienen. Möglicherweise möchten assertund Fehler in der elseAnweisung Tippfehler abfangen.
Philipp

53

Hier ist eine Überprüfung erforderlich, ob die zu öffnende URL von einem Gerät oder Simulator geöffnet werden kann oder nicht. Weil ich manchmal (Mehrheit im Simulator) festgestellt habe, dass es Abstürze verursacht.

Ziel 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
Sie können HTTP / HTTPS jederzeit öffnen. Ab iOS 9 müssen Sie eine beliebige URL auf die Whitelist setzen, die Sie aufrufen möchten canOpenURL. Ich verstehe nicht, warum Sie nicht einfach anrufen openURL:urlund wenn es fehlschlägt, behandeln Sie den Fehler. canOpenURLwird hauptsächlich verwendet, um die Installation einer App zu erkennen, ohne die aktuelle App zu verlassen.
Ben Flynn

1
openURL(_:)wurde in iOS 10.0 veraltet, stattdessen sollten Sie die Instanzmethode open(_:options:completionHandler:)für UIApplication aufrufen.
Ryan H.

20

Schauen Sie sich die -openURL:Methode für UIApplication an. Es sollte Ihnen ermöglichen, eine NSURL-Instanz an das System zu übergeben, die bestimmt, in welcher App sie geöffnet und diese Anwendung gestartet werden soll. (Denken Sie daran, dass Sie wahrscheinlich -canOpenURL:zuerst überprüfen möchten, falls die URL nicht von Apps verarbeitet werden kann, die derzeit auf dem System installiert sind. Dies ist jedoch wahrscheinlich kein Problem für einfache http://Links.)


Danke Tim. Sie sind genau richtig. Ich habe meine eigene Antwort hinzugefügt, als Ihre hereinkam. Tut mir leid. Aber zumindest gibt es jetzt eine einfache Anleitung für diejenigen, die mir folgen.
Dale Dietrich

Keine Sorge - ich bin froh, dass Sie die Lösung gefunden haben!
Tim

1
openURL(_:)wurde in iOS 10.0 veraltet, stattdessen sollten Sie die Instanzmethode open(_:options:completionHandler:)für UIApplication aufrufen.
Ryan H.

17

Und falls Sie nicht sicher sind, ob die angegebene URL textein Schema hat:

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 Dies ist nur ein fest codiertes Beispiel. Oft ist die URL-Zeichenfolge ( texthier) nicht fest codiert und Sie benötigen einen solchen Code.
Bedeutung-Angelegenheiten

@Vlad Warst du frustriert und wenn ja wie / warum? Ich gehe davon aus, dass die Leute nicht einfach über den obigen Code hinaus kopieren.
Bedeutung-Angelegenheiten

1
Bedeutung-Angelegenheiten Es liegt an Ihnen :)
Vlad

13

Die nicht veraltete Objective-C-Version wäre:

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

Dies unterstützt auch Geräte, auf denen ältere Versionen von iOS ausgeführt werden


10

Swift 3- Lösung mit einer Fertig-Taste

Vergiss es nicht import SafariServices

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

Dies ist die perfekte Antwort, die sowohl in iOS- als auch in iOS-Erweiterungen funktioniert. Andere Antworten funktionieren nur in Apps und können nicht in Erweiterungen verwendet werden.
Owen Zhao

5

Da diese Antwort seit iOS 10.0 veraltet ist, wäre eine bessere Antwort:

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

y en Ziel-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)")
     }
   }
 }

Verwendung:

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

Referenz:

OpenURL in iOS10


1

Versuche dies:

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

0

Versuchen Sie in Swift 1.2 Folgendes:

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

Bitte sagen Sie mir, was ist der neue Code, den Sie geschrieben haben und Sie haben mich als Abstimmungszeichen markiert
Dilip Tiwari

-2

Swift 4-Lösung:

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

1
Eine richtige Swift 4-Version würde URL und nicht NSURL verwenden. Und das Casting von NSURL als URL ist nicht dasselbe. Eine Erklärung finden Sie unter stackoverflow.com/a/37812485/2227743. Auch das gewaltsame Auspacken ist schlecht.
Eric Aya
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.