Jak uruchomić Safari i otworzyć URL z aplikacji na iOS

215

Na stronie ustawień chcę dołączyć trzy linki do

  • Moja witryna pomocy dla aplikacji
  • Samouczek aplikacji YouTube
  • Moja podstawowa witryna (tj. Link do etykiety „Created by Dale Dietrich”).

Przeszukałem tę stronę, Internet i moją dokumentację i nie znalazłem nic oczywistego.

UWAGA: Nie chcę otwierać stron internetowych w mojej aplikacji. Chcę tylko wysłać link do Safari, a ten link będzie tam otwarty. Widziałem wiele aplikacji, które robią to samo na stronie Ustawienia, więc musi to być możliwe.

Dale Dietrich
źródło
Ten sam problem, z którym borykam się w rozwoju hybrydowym za pomocą aplikacji Ionic Cordova
Sopo

Odpowiedzi:

386

Oto co zrobiłem:

  1. Utworzyłem IBAction w plikach nagłówka .h w następujący sposób:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Dodałem UIButton na stronie Ustawienia zawierającej tekst, który chcę połączyć.

  3. Odpowiednio podłączyłem przycisk do IBAction w File Owner.

  4. Następnie wykonaj następujące czynności:

Cel C

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

Szybki

(IBAction w viewController, a nie w pliku nagłówkowym)

if let link = URL(string: "https://yoursite.com") {
  UIApplication.shared.open(link)
}
Dale Dietrich
źródło
8
Ale to nie jest 100%, ponieważ jeśli ktoś użyje zepsutego iOS i użyje Chrome lub czegoś jako domyślnej przeglądarki, to otworzy to, a nie Safari
Laszlo
214
Wydaje mi się, że jeśli ktoś włamał się do swojego telefonu, by Chrome stał się domyślną przeglądarką, to uznanie tego ustawienia jest prawdopodobnie idealnym zachowaniem.
rpowell
Zrozumiałem to, ale jeśli otwieram stronę internetową i użytkownik surfuje teraz po niej, jeśli zatrzyma się na określonej stronie, czy mogę uzyskać bieżący link do strony w moim kodzie?
Varun Jain
3
Powyższa metoda jest przestarzała, użyj teraz następujących. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertisement.url] opcje: @ {} completeHandler: ^ (sukces BOOL) {}];
Mashhadi,
@Laszlo Również w ustawieniach możemy wyłączyć Safari w Ograniczeniach. Kodowałem aplikację jako schematy URL http i https, aby otwierać inne przeglądarki, gdy URL http lub https jest otwarty i Safari jest wyłączone. Nawet bez Jailbreaka możemy technicznie zmienić domyślną przeglądarkę internetową.
ColdGrub1384,
164

Szybka składnia:

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

Nowa składnia Swift dla iOS 9.3 i wcześniejszych

Począwszy od jakiejś nowej wersji Swift (być może swift 2?), UIApplication.sharedApplication () jest teraz UIApplication.shared (domyślam się, że lepiej wykorzystuję obliczone właściwości). Dodatkowo adres URL nie jest już domyślnie konwertowany na NSURL, należy jawnie przekonwertować za pomocą as!

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

Nowa składnia Swift od iOS 10.0

Metoda openURL została uznana za przestarzałą i zastąpiona bardziej uniwersalną metodą, która pobiera obiekt opcji i procedurę asynchronicznego uzupełniania od iOS 10.0

UIApplication.shared.open(NSURL(string:"http://www.reddit.com/")! as URL)
Dustin Williams
źródło
31
Szybkie wersje odpowiedzi są niezwykle przydatne dla programistów Swift, jest to nowy język bez dużej ilości dokumentacji, szczególnie. na rozwiązywaniu problemów iOS z prawdziwego świata. W moim przypadku autouzupełnianie wybrało selektor „fileURLWithPath:” i nie zdawałem sobie sprawy, że właśnie dlatego mój adres URL się nie otwiera, tylko czytając odpowiedź Dustina, zauważyłem, że powinienem był użyć selektora „string:” . Więc Dustin powinien być głosowany, a nie karany.
SafeFastExpressive
3
@g_fred. Dlaczego nie mógłby dołączyć wersji Swift?
ericgu
2
openURL(_:)był przestarzały w iOS 10.0, zamiast tego powinieneś wywołać metodę instancji open(_:options:completionHandler:)na UIApplication.
Ryan H.
2
Możesz bezpośrednio użyć adresu URL zamiast NSURL, aby zapisać rzutowanie.
marsbear
1
Zalecam, aby nigdy nie wymuszać rozpakowywania. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }zawsze będzie służyć lepiej. Może chcę asserti błąd w elseinstrukcji, aby złapać literówki.
philipp
53

Tutaj wymagane jest jedno sprawdzenie, czy adres URL, który ma być otwarty, można otworzyć za pomocą urządzenia lub symulatora, czy też nie. Ponieważ czasami (większość w symulatorze) znalazłem, że powoduje awarie.

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

Szybki 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
źródło
1
Zawsze możesz otworzyć HTTP / HTTPS. Począwszy od systemu iOS 9, musisz dodać do białej listy dowolny adres URL, który chcesz wywołać canOpenURL. Nie rozumiem, dlaczego po prostu nie zadzwonisz, openURL:urla jeśli zawiedzie, poradzisz sobie z niepowodzeniem. canOpenURLsłuży głównie do wykrywania instalacji aplikacji bez opuszczania bieżącej aplikacji.
Ben Flynn
1
openURL(_:)był przestarzały w iOS 10.0, zamiast tego powinieneś wywołać metodę instancji open(_:options:completionHandler:)na UIApplication.
Ryan H.
20

Spójrz na -openURL:metodę UIApplication. Powinno to pozwolić na przekazanie instancji NSURL do systemu, która określi, w której aplikacji ją otworzyć i uruchomić tę aplikację. (Pamiętaj, że prawdopodobnie będziesz chciał -canOpenURL:najpierw sprawdzić , na wypadek gdyby adres URL nie był obsługiwany przez aplikacje aktualnie zainstalowane w systemie - chociaż nie jest to problem w przypadku zwykłych http://linków).

Tim
źródło
Dzięki Tim. Znajduje się na miejscu. Dodawałem własną odpowiedź w momencie, gdy pojawiła się Twoja. Przepraszam za to. Ale przynajmniej jest teraz łatwe instrukcje dla tych, którzy za mną podążają.
Dale Dietrich,
Bez obaw - cieszę się, że znalazłeś rozwiązanie!
Tim
1
openURL(_:)był przestarzały w iOS 10.0, zamiast tego powinieneś wywołać metodę instancji open(_:options:completionHandler:)na UIApplication.
Ryan H.
17

A jeśli nie masz pewności, czy podany adres URL textma schemat:

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];
znaczenie ma znaczenie
źródło
@Vlad To tylko zakodowany przykład. Często ciąg adresu URL ( texttutaj) nie jest zakodowany na stałe i potrzebujesz takiego kodu.
znaczenie ma znaczenie
@Vlad Czy byłeś sfrustrowany, a jeśli tak, to w jaki sposób / dlaczego? Zakładam, że ludzie nie tylko kopiują powyższy kod.
znaczenie ma znaczenie
1
znaczenie-sprawy To zależy od ciebie :)
Vlad
13

Nieaktualna wersja Celu C to:

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://apple.com"] options:@{} completionHandler:nil];
Antzi
źródło
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)
    }
}

Obsługuje również urządzenia ze starszymi wersjami iOS

Greg T.
źródło
10

Rozwiązanie Swift 3 z przyciskiem Gotowe

Nie zapomnij import SafariServices

if let url = URL(string: "http://www.yoururl.com/") {
            let vc = SFSafariViewController(url: url, entersReaderIfAvailable: true)
            present(vc, animated: true)
        }
Baher A.
źródło
To idealna odpowiedź, która działa zarówno na iOS, jak i na iOS. Inne odpowiedzi działają tylko w aplikacjach i nie można ich używać w rozszerzeniach.
Owen Zhao,
5

Ponieważ ta odpowiedź jest przestarzała od iOS 10.0, lepsza odpowiedź to:

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

y en Cel-c

[[UIApplication sharedApplication] openURL:@"url string" options:@{} completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"Opened url");
        }
    }];
wazowski
źródło
3

openURL ( :) został uznany za przestarzały w iOS 10.0, zamiast tego powinieneś użyć następującej metody instancji na UIApplication: open ( : options: completeHandler :)

Przykład użycia Swift
Spowoduje to otwarcie „ https://apple.com ” w 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.
źródło
2

W SWIFT 3.0

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

Stosowanie:

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

Odniesienie:

OpenURL w iOS10

Zgpeace
źródło
1

Spróbuj tego:

NSString *URL = @"xyz.com";
if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:URL]])
{
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:URL]];
}
Shubham JAin
źródło
0

W Swift 1.2 spróbuj tego:

let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
Dilip Tiwari
źródło
proszę powiedz mi, jaki jest nowy kod, który napisałeś i zaznaczyłeś mnie głosowaniem
Dilip Tiwari
-2

Rozwiązanie Swift 4:

UIApplication.shared.open(NSURL(string:"http://yo.lo")! as URL, options: [String : Any](), completionHandler: nil)
Kevin ABRIOUX
źródło
1
Odpowiednia wersja Swift 4 używałaby adresu URL, a nie NSURL. Przesyłanie NSURL jako URL nie jest takie samo. Wyjaśnienie znajduje się na stackoverflow.com/a/37812485/2227743. Również wymuszanie rozpakowywania jest złe.
Eric Aya