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.


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

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)

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

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


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

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

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


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

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

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


2

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

Stosowanie:

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

Odniesienie:

OpenURL w iOS10


1

Spróbuj tego:

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

0

W Swift 1.2 spróbuj tego:

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

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)

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.