Cara meluncurkan Safari dan membuka URL dari aplikasi iOS

215

Di halaman pengaturan, saya ingin menyertakan tiga tautan

  • Situs dukungan aplikasi saya
  • Tutorial aplikasi YouTube
  • Situs utama saya (yaitu: ditautkan ke label 'Created by Dale Dietrich'.)

Saya telah mencari situs ini dan web serta dokumentasi saya dan saya tidak menemukan apa pun yang jelas.

CATATAN: Saya tidak ingin membuka halaman web di dalam aplikasi saya. Saya hanya ingin mengirim tautan ke Safari dan tautan itu terbuka di sana. Saya telah melihat sejumlah aplikasi melakukan hal yang sama di halaman Pengaturan mereka, jadi itu harus dimungkinkan.

Dale Dietrich
sumber
Masalah yang sama yang saya hadapi dalam pengembangan Hibrida menggunakan aplikasi Ionic Cordova
Sopo

Jawaban:

386

Inilah yang saya lakukan:

  1. Saya membuat IBAction di file header .h sebagai berikut:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Saya menambahkan UIButton pada halaman Pengaturan yang berisi teks yang ingin saya tautkan.

  3. Saya menghubungkan tombol ke IBAction di File Owner dengan tepat.

  4. Kemudian terapkan yang berikut ini:

Objektif-C

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

Cepat

(IBAction di viewController, bukan file header)

if let link = URL(string: "https://yoursite.com") {
  UIApplication.shared.open(link)
}
Dale Dietrich
sumber
8
Tapi ini bukan 100%, karena jika seseorang menggunakan iOS yang sudah di-jailbreak dan menggunakan Chrome atau sesuatu sebagai browser default, maka ini akan membuka itu, bukan Safari
Laszlo
214
Saya merasa jika seseorang berupaya melakukan jailbreaking telepon mereka untuk menjadikan Chrome sebagai browser default, menghormati pengaturan itu mungkin merupakan perilaku yang ideal.
rpowell
Saya mengerti ini tetapi jika saya membuka sebuah situs web dan pengguna menjelajah situs web sekarang jika dia berhenti oleh halaman tertentu maka dapatkah saya mendapatkan tautan halaman web saat ini dalam kode saya?
Varun Jain
3
Metode di atas tidak digunakan lagi sekarang gunakan sebagai berikut. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertisement.url] opsi: @ {} completionHandler: ^ (sukses BOOL) {}];
Mashhadi
@Laszlo Juga, dalam pengaturan kita dapat menonaktifkan Safari di Pembatasan. Saya mengkodekan aplikasi dengan skema URL http dan https untuk membuka browser lain ketika URL http atau https dibuka dan Safari dinonaktifkan. Jadi, bahkan tanpa Jailbreak, secara teknis kita dapat mengubah browser web default.
ColdGrub1384
164

Sintaks Swift:

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

Sintaks Swift Baru untuk iOS 9.3 dan sebelumnya

Pada beberapa versi baru Swift (mungkin swift 2?), UIApplication.sharedApplication () sekarang menjadi UIApplication. Shared (membuat penggunaan properti komputer yang lebih baik, saya kira). Selain itu URL tidak lagi dapat secara implisit dikonversi ke NSURL, harus secara eksplisit dikonversi dengan!

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

Sintaks Swift Baru pada iOS 10.0

Metode openURL telah ditinggalkan dan diganti dengan metode yang lebih fleksibel yang mengambil objek opsi dan penangan penyelesaian asinkron pada iOS 10.0

UIApplication.shared.open(NSURL(string:"http://www.reddit.com/")! as URL)
Dustin Williams
sumber
31
Versi jawaban Swift sangat berguna bagi pengembang Swift, ini adalah bahasa baru tanpa banyak dokumentasi, esp. untuk memecahkan masalah iOS dunia nyata. Dalam kasus saya, pelengkapan otomatis telah memilih pemilih "fileURLWithPath:" dan saya tidak menyadari bahwa itu sebabnya URL saya tidak dibuka, hanya dengan membaca jawaban Dustin saya melihat bahwa saya seharusnya menggunakan pemilih "string:" . Jadi Dustin harus dibalik, bukan dihukum.
SafeFastExpressive
3
@g_fred. Kenapa dia tidak bisa memasukkan versi Swift?
ericgu
2
openURL(_:)sudah ditinggalkan di iOS 10.0, sebagai gantinya Anda harus memanggil metode instance open(_:options:completionHandler:)pada aplikasi UIA.
Ryan H.
2
Anda dapat langsung menggunakan URL dan bukan NSURL sehingga Anda dapat menyimpan para pemain.
marsbear
1
Saya sarankan untuk tidak memaksa membuka. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }akan selalu melayani Anda dengan lebih baik. Mungkin ingin assertdan kesalahan dalam elsepernyataan untuk menangkap kesalahan ketik.
philipp
53

Di sini diperlukan satu pemeriksaan agar url yang akan dibuka dapat dibuka oleh perangkat atau simulator atau tidak. Karena beberapa kali (mayoritas dalam simulator) saya menemukan itu menyebabkan crash.

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

Cepat 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
sumber
1
Anda selalu dapat membuka HTTP / HTTPS. Pada iOS 9, Anda harus memasukkan daftar putih URL apa pun yang ingin Anda panggil canOpenURL. Saya tidak mengerti mengapa Anda tidak sekadar menelepon openURL:urldan jika gagal, atasi kegagalan itu. canOpenURLterutama digunakan untuk mendeteksi pemasangan aplikasi tanpa meninggalkan aplikasi saat ini.
Ben Flynn
1
openURL(_:)sudah ditinggalkan di iOS 10.0, sebagai gantinya Anda harus memanggil metode instance open(_:options:completionHandler:)pada aplikasi UIA.
Ryan H.
20

Lihatlah -openURL:metode pada aplikasi UIA. Ini akan memungkinkan Anda untuk mengirimkan instance NSURL ke sistem, yang akan menentukan aplikasi apa yang akan membukanya dan meluncurkan aplikasi itu. (Ingatlah bahwa Anda mungkin ingin memeriksa -canOpenURL:dulu, kalau-kalau URL tidak dapat ditangani oleh aplikasi yang saat ini diinstal pada sistem - meskipun ini mungkin bukan masalah untuk http://tautan biasa .)

Tim
sumber
Terima kasih Tim. Anda tepat sasaran. Saya menambahkan jawaban saya sendiri ketika jawaban Anda masuk. Maaf tentang itu. Tapi setidaknya sekarang ada cara mudah bagi mereka yang mengikuti saya.
Dale Dietrich
Jangan khawatir - senang Anda menemukan solusinya!
Tim
1
openURL(_:)sudah ditinggalkan di iOS 10.0, sebagai gantinya Anda harus memanggil metode instance open(_:options:completionHandler:)pada aplikasi UIA.
Ryan H.
17

Dan, jika Anda tidak yakin apakah URL yang disediakan textmemiliki skema:

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];
makna-hal
sumber
@ Vlad Ini hanya contoh kode keras. Seringkali url string (di textsini) tidak akan dikodekan dengan keras dan Anda memerlukan kode seperti ini.
maknanya penting
@ Vlad Apakah Anda frustrasi, dan jika ya bagaimana / mengapa? Saya berasumsi orang tidak hanya menyalin melewati kode di atas.
maknanya penting
1
makna-hal Terserah Anda :)
Vlad
13

Versi Objective-C yang tidak usang adalah:

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

Ini mendukung perangkat yang menjalankan versi iOS yang lebih lama juga

Greg T
sumber
10

Solusi Swift 3 dengan tombol Selesai

Jangan lupa import SafariServices

if let url = URL(string: "http://www.yoururl.com/") {
            let vc = SFSafariViewController(url: url, entersReaderIfAvailable: true)
            present(vc, animated: true)
        }
Baher A
sumber
Ini adalah jawaban sempurna yang berfungsi di iOS dan iOS Extensions. Jawaban lain hanya berfungsi di aplikasi dan tidak dapat digunakan dalam ekstensi.
Owen Zhao
5

Karena jawaban ini sudah usang sejak iOS 10.0, jawaban yang lebih baik adalah:

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

y id Tujuan-c

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

openURL ( :) sudah tidak digunakan lagi di iOS 10.0, sebagai gantinya Anda harus menggunakan metode instance berikut pada aplikasi UIA: open ( : options: completionHandler :)

Contoh menggunakan Swift
Ini akan membuka " https://apple.com " di 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.
sumber
2

Di SWIFT 3.0

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

Pemakaian:

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

Referensi:

OpenURL di iOS10

Zgpeace
sumber
1

Coba ini:

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

Di Swift 1.2, coba ini:

let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
Dilip Tiwari
sumber
tlg ceritakan apa yang baru dalam kode yang telah Anda tulis dan Anda menandai saya memilih
Dilip Tiwari
-2

Solusi Swift 4:

UIApplication.shared.open(NSURL(string:"http://yo.lo")! as URL, options: [String : Any](), completionHandler: nil)
Kevin ABRIOUX
sumber
1
Versi Swift 4 yang tepat akan menggunakan URL dan bukan NSURL. Dan casting NSURL sebagai URL tidak sama. Lihat stackoverflow.com/a/37812485/2227743 untuk penjelasannya. Juga, memaksa membuka bungkus buruk.
Eric Aya