Як запустити Safari та відкрити URL-адресу в додатку iOS


215

На сторінці налаштувань я хочу включити три посилання на

  • Мій сайт підтримки додатків
  • Навчальний посібник YouTube
  • Мій основний сайт (тобто: посилання на ярлик "Створено Дейлом Дітріхом".)

Я шукав цей сайт та Інтернет та мою документацію, і не знайшов нічого очевидного.

ПРИМІТКА. Я не хочу відкривати веб-сторінки в додатку. Я просто хочу надіслати посилання на Safari, і це посилання буде відкритим там. Я бачив, що на їхній сторінці Налаштування ряд додатків роблять те саме, тому це повинно бути можливо.


Та ж проблема, з якою я стикаюсь у розвитку гібридів, використовуючи додаток
Ionic

Відповіді:


386

Ось що я зробив:

  1. Я створив IBAction у файлах заголовка .h таким чином:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Я додав кнопку UIB на сторінці "Налаштування", що містить текст, до якого я хочу посилатись.

  3. Я відповідним чином підключив кнопку до IBAction у власнику файлу.

  4. Потім реалізуйте наступне:

Ціль-С

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

Швидкий

(IBAction у viewController, а не файл заголовка)

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

8
Але це не на 100%, тому що якщо хтось використовувати iOS з розбитою iOS і використовує Chrome або щось як браузер за замовчуванням, то це відкриє це, а не Safari
Laszlo

214
Я відчуваю, що якби хтось пішов на зусилля, щоб уникнути в'язниці свого телефону, щоб зробити Chrome своїм браузером за замовчуванням, шануючи, що ця настройка, мабуть, ідеальна поведінка.
похід

Я зрозумів це, але якщо я відкриваю веб-сайт і користувач переглядає веб-сайт зараз, якщо він зупиняється на певній сторінці, то чи можу я отримати поточне посилання на веб-сторінку в своєму коді?
Varun Jain

3
Вищеописаний метод застарів, тепер використовуйте наступний. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertisement.url] параметри: @ {} завершенняHandler: ^ (успіх BOOL) {}];
Машхаді

@Laszlo Також у налаштуваннях ми можемо відключити Safari в обмеженнях. Я зашифрував додаток із схемами URL-адрес http і https, щоб відкрити інші веб-переглядачі, коли відкриється URL-адреса http або https, а Safari вимкнено. Тож навіть без джейлбрейка ми можемо технічно змінити веб-браузер за замовчуванням.
ColdGrub1384

164

Синтаксис Swift:

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

Новий синтаксис Swift для iOS 9.3 та новіших версій

Як і в новій версії Swift (можливо, Swift 2?), UIApplication.sharedApplication () тепер є UIApplication.shared (краще використовуючи обчислювані властивості, я здогадуюсь). Крім того, URL більше не неявно перетворюється на NSURL, його слід явно перетворити за допомогою!

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

Новий синтаксис Swift станом на iOS 10.0

Метод openURL був устарений і замінений більш універсальним методом, який приймає об'єкт параметрів та асинхронний обробник завершення, як iOS 10.0

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

31
Швидкі версії відповідей надзвичайно корисні розробникам Swift, це нова мова без великої кількості документації, особливо. щодо вирішення реальних проблем iOS. У моєму випадку автозаповнення вибрало селектор "fileURLWithPath:", і я не зрозумів, що тому моя URL-адреса не відкривається. Лише, прочитавши відповідь Дастіна, я побачив, що я повинен був використовувати селектор "string:" . Тож Дастіна слід підтримувати, а не карати.
SafeFastExpressive

3
@g_fred. Чому він не зміг би включити версію Swift?
ericgu

2
openURL(_:)була застаріла в iOS 10.0, замість цього слід викликати метод екземпляра open(_:options:completionHandler:)в UIApplication.
Райан Х.

2
Ви можете безпосередньо використовувати URL замість NSURL, щоб ви могли зберегти склад.
marsbear

1
Я рекомендую ніколи не змушувати розмотувати if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }завжди послужить вашому кращому. Можливо, хочете assertі помилитися в elseзаяві, щоб ловити помилки.
Філіпп

53

Тут потрібна одна перевірка, чи буде URL-адреса, яка буде відкритою, здатна відкриватися через пристрій чи тренажер чи ні. Тому що кілька разів (більшість в тренажері) я виявив, що це викликає збої.

Ціль-С

NSURL *url = [NSURL URLWithString:@"some url"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
   [[UIApplication sharedApplication] openURL:url];
}

Швидкий 2.0

let url : NSURL = NSURL(string: "some url")!
if UIApplication.sharedApplication().canOpenURL(url) {
     UIApplication.sharedApplication().openURL(url)
}

Швидкий 4.2

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

1
Ви завжди можете відкрити HTTP / HTTPS. Станом на iOS 9 вам потрібно додати білий список будь-якої URL-адреси, до якої потрібно зателефонувати canOpenURL. Я не бачу, чому ви не просто зателефонували б, openURL:urlі якщо це не вдасться, вирішувати несправності. canOpenURLв основному використовується для виявлення встановлення програми, не виходячи з поточного додатка.
Бен Флінн

1
openURL(_:)була застаріла в iOS 10.0, замість цього слід викликати метод екземпляра open(_:options:completionHandler:)в UIApplication.
Райан Х.

20

Погляньте на -openURL:метод UIApplication. Він повинен дозволити вам передати екземпляр NSURL до системи, який визначатиме, у якому додатку відкрити його та запустити цю програму. (Майте на увазі, ви, ймовірно, захочете перевірити -canOpenURL:спочатку, на випадок, якщо URL-адреса не може оброблятися програмами, які зараз встановлені в системі - хоча це, звичайно, не є проблемою для звичайних http://посилань.)


Дякую Тіме. Ви праві на думку. Я додав свою власну відповідь, коли прийшов ваш. Вибачте за це. Але, принаймні, зараз є легке керівництво для тих, хто йде за мною.
Дейл Дітріх

Не хвилюйтесь - радий, що знайшли рішення!
Тім

1
openURL(_:)була застаріла в iOS 10.0, замість цього слід викликати метод екземпляра open(_:options:completionHandler:)в UIApplication.
Райан Х.

17

І, якщо ви не впевнені, чи надана URL-адреса textмає схему:

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 Це лише важко кодований приклад. Часто рядок URL ( textтут) не буде жорстко закодований, і вам потрібен такий код.
значення-справи

@Vlad Ви були розчаровані, і якщо так, то як / чому? Я припускаю, що люди не просто копіюють минулий код вище.
сенс має значення

1
значення-питання Це залежить від вас :)
Влад

13

Не застаріла версія Objective-C буде такою:

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

Це підтримує пристрої, на яких працює i старіші версії iOS


10

Швидке рішення 3 за допомогою кнопки Готово

Не забувайте import SafariServices

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

Це ідеальна відповідь, яка працює як в iOS, так і в iOS-розширеннях. Інші відповіді працюють лише в додатках і не можуть використовуватися в розширеннях.
Оуен Чжао

5

Оскільки ця відповідь застаріла з iOS 10.0, кращою відповіддю буде:

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

y en Objective-c

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

3

openURL ( :) був застарілий у iOS 10.0, замість цього у UIApplication слід використовувати такий примірник: open ( : параметри: завершенняHandler :)

Приклад використання Swift
Це відкриє " https://apple.com " в 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

Швидкий 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)")
     }
   }
 }

Використання:

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

Довідка:

OpenURL в iOS10


1

Спробуйте це:

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

0

У Swift 1.2 , спробуйте це:

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

PLZ скажіть мені, що нового в коді, який ви написали, і ви позначили мене голосуванням
Діліп Тіварі

-2

Рішення Swift 4:

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

1
Правильна версія Swift 4 використовуватиме URL, а не NSURL. І кастинг NSURL як URL - це не те саме. Дивіться stackoverflow.com/a/37812485/2227743 для пояснення. Також сильне розкручування погано.
Ерік Айя
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.