İOS uygulamasından Safari nasıl başlatılır ve URL nasıl açılır


215

Ayarlar sayfasında üç bağlantı eklemek istiyorum

  • Uygulama destek sitem
  • YouTube uygulama eğitimi
  • Birincil sitem (ör: 'Dale Dietrich tarafından oluşturuldu' etiketine bağlı.)

Bu sitede, web'de ve belgelerimde arama yaptım ve açık olan hiçbir şey bulamadım.

NOT: Uygulamamda web sayfaları açmak istemiyorum. Bağlantıyı Safari'ye göndermek istiyorum ve bu bağlantı orada açık. Ayarlar sayfasında aynı şeyi yapan bir dizi uygulama gördüm, bu yüzden mümkün olmalı.


İyonik Cordova uygulamasını kullanarak Hibrit gelişiminde karşılaştığım aynı sorun
Sopo

Yanıtlar:


387

İşte yaptım:

  1. Başlık .h dosyalarında aşağıdaki gibi bir IBAction oluşturdum:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Bağlantı sayfasına, bağlamak istediğim metni içeren bir UIButton ekledim.

  3. Düğmeyi Dosya Sahibindeki IBAction'a uygun şekilde bağladım.

  4. Ardından aşağıdakileri uygulayın:

Objective-C

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

hızlı

(Başlık dosyası yerine viewController'da IBAction)

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

8
Ancak bu% 100 değil, çünkü birisi jailbreak yapılmış bir iOS kullanıyorsa ve Chrome veya varsayılan tarayıcı olarak bir şey kullanıyorsa, Safari açılmıyor, Safari açılmıyor
Laszlo

214
Birisi Chrome'u varsayılan tarayıcı yapmak için telefonlarını jailbreak yapmak için çaba sarf ediyorsa, bu ayarın muhtemelen ideal davranış olduğunu onurlandırmak gibi hissediyorum.
rpowell

Ben bunu anladım ama bir web sitesi açıyorum ve o belirli bir sayfa tarafından durursa kullanıcı şimdi web sitesinde sörf sonra kodumu geçerli web sayfası bağlantısını alabilir miyim?
Varun Jain

3
Yukarıdaki yöntem artık kullanımdan kaldırılmıştır. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.adAdvertising.url] seçenekleri: @ {} completionHandler: ^ (BOOL başarısı) {}];
Mashhadi

@Laszlo Ayrıca, ayarlarda Kısıtlamalar bölümünde Safari'yi devre dışı bırakabiliriz. Http veya https URL'si açıldığında ve Safari devre dışı bırakıldığında diğer tarayıcıları açmak için URL şemaları http ve https olarak kodladım. Böylece, Jailbreak olmadan bile, varsayılan web tarayıcısını teknik olarak değiştirebiliriz.
ColdGrub1384

164

Swift Sözdizimi:

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

İOS 9.3 ve öncesi için yeni Swift Sözdizimi

Swift'in bazı yeni sürümlerinden (muhtemelen hızlı? Ayrıca, URL artık dolaylı olarak NSURL'ye dönüştürülemez, açıkça!

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

İOS 10.0'dan itibaren yeni Swift Sözdizimi

OpenURL yöntemi kullanımdan kaldırıldı ve iOS 10.0'dan itibaren bir seçenekler nesnesi ve eşzamansız tamamlama işleyici alan daha çok yönlü bir yöntemle değiştirildi

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

31
Cevapların hızlı sürümleri Swift geliştiricileri için son derece yararlıdır, çok fazla belge içermeyen yeni bir dildir, esp. Gerçek iOS sorunları çözme konusunda Benim durumumda, otomatik tamamlama "fileURLWithPath:" seçicisini seçmişti ve URL'mizin açılmadığının farkında değildim, sadece Dustin'in cevabını okuyarak "string:" seçicisini kullanmam gerektiğini gördüm . Bu yüzden Dustin onaylanmamalı, azarlanmamalı.
15:50, SafeFastExpressive

3
@g_fred. Neden bir Swift sürümü ekleyemeyecekti?
ericgu

2
openURL(_:)iOS 10.0'da kullanımdan kaldırıldı, bunun yerine open(_:options:completionHandler:)UIApplication üzerinde örnek yöntemini çağırmalısınız .
Ryan H.

2
Oyuncuyu kaydedebilmek için NSURL yerine URL'yi doğrudan kullanabilirsiniz.
marsbear

1
Asla açmayı zorlamamanızı tavsiye ederim. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }her zaman daha iyi hizmet edecek. İsteyebilirsiniz assertve hata elseyakalamak yazım hatalarından açıklamada.
philipp

53

Burada, açık olacak URL'nin cihaz veya simülatör tarafından açılabildiğinden veya açılmadan kontrol edilmesi gerekir. Çünkü bazı zamanlarda (simülatörde çoğunluk) i çökmelere neden olduğunu buldum.

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

Hızlı 4.2

guard let url = URL(string: "some url") else {
    return
}
if UIApplication.shared.canOpenURL(url) {
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

1
Her zaman HTTP / HTTPS'yi açabilirsiniz. İOS 9'dan itibaren, aramak istediğiniz URL'leri beyaz listeye almanız gerekir canOpenURL. Neden sadece aramayacağınızı anlamıyorum openURL:urlve başarısız olursa, başarısızlıkla başa çıkın. canOpenURLöncelikle geçerli uygulamadan çıkmadan bir uygulamanın yüklenmesini algılamak için kullanılır.
Ben Flynn

1
openURL(_:)iOS 10.0'da kullanımdan kaldırıldı, bunun yerine open(_:options:completionHandler:)UIApplication üzerinde örnek yöntemini çağırmalısınız .
Ryan H.

20

-openURL:UIApplication yöntemine bir göz atın . Hangi NSUL örneğini açacağınızı belirleyecek ve uygulamayı başlatacak bir NSURL örneğini sisteme geçirmenize izin vermelidir. ( -canOpenURL:URL'nin şu anda sistemde yüklü olan uygulamalar tarafından ele alınamaması durumunda, muhtemelen ilk önce kontrol etmek isteyeceğinizi unutmayın , ancak bu muhtemelen düz http://bağlantılar için bir sorun değildir .)


Teşekkürler Tim. Tam noktasındasınız. Sizinkinin gelmesiyle kendi cevabımı ekliyordum. Bunun için üzgünüm. Ama en azından şimdi beni takip edenler için kolay bir nasıl yapılır.
Dale Dietrich

Endişeye gerek yok - çözümü bulduğunuza sevindim!
Tim

1
openURL(_:)iOS 10.0'da kullanımdan kaldırıldı, bunun yerine open(_:options:completionHandler:)UIApplication üzerinde örnek yöntemini çağırmalısınız .
Ryan H.

17

Ayrıca, sağlanan URL'nin textbir şemaya sahip olup olmadığından emin değilseniz :

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 Bu sadece kodlanmış bir örnektir. Genellikle url dizesi ( textburada) sabit kodlanmaz ve böyle bir koda ihtiyacınız vardır.
anlam-

@Vlad Sinirli miydiniz ve eğer evetse nasıl / neden? İnsanların sadece yukarıdaki kodu geçmediğini varsayıyorum.
anlam-Önemli

1
Anlamı önemli Size kalmış :)
Vlad

13

Kullanımdan kaldırılmamış Objective-C sürümü:

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

Bu, iOS'un eski sürümlerini çalıştıran cihazları da destekler


10

Bitti düğmesiyle Swift 3 Çözümü

Unutma import SafariServices

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

Bu, hem iOS hem de iOS Uzantılarında çalışan mükemmel yanıttır. Diğer yanıtlar yalnızca uygulamalarda çalışır ve uzantılarda kullanılamaz.
Owen Zhao

5

Bu yanıt iOS 10.0'dan beri kullanımdan kaldırıldığından, daha iyi bir yanıt şöyle olacaktır:

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

y tr Amaç-c

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

3

openURL ( :) , iOS 10.0'da kullanımdan kaldırıldı, bunun yerine UIApplication üzerinde aşağıdaki örnek yöntemini kullanmalısınız: open ( : options: completionHandler :)

Swift kullanımına örnek Safari'de
" https://apple.com " açılır .

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

SWIFT 3.0'da

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

2

Hızlı 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)")
     }
   }
 }

Kullanımı:

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

Referans:

İOS10'da OpenURL


1

Bunu dene:

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

0

Swift 1.2'de şunu deneyin:

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

plz bana yazdığınız kodda yeni olanı söyle ve bana oy verdin
Dilip Tiwari

-2

Swift 4 çözümü:

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

1
Uygun bir Swift 4 sürümü NSURL yerine URL kullanır. URL olarak NSURL yayınlamak aynı değildir. Açıklama için stackoverflow.com/a/37812485/2227743 adresine bakın. Ayrıca, kuvvet çözme kötüdür.
Eric Aya
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.