Как запустить Safari и открыть URL из приложения iOS


215

На странице настроек я хочу включить три ссылки на

  • Мой сайт поддержки приложений
  • Руководство по приложению YouTube
  • Мой основной сайт (т. Е. Связанный с ярлыком «Создано Дейлом Дитрихом».)

Я искал этот сайт и в Интернете, и мою документацию, и я не нашел ничего очевидного.

ПРИМЕЧАНИЕ. Я не хочу открывать веб-страницы в своем приложении. Я просто хочу отправить ссылку на Safari, и эта ссылка будет открыта там. Я видел несколько приложений, делающих одно и то же на своей странице настроек, поэтому это должно быть возможно.


Та же проблема, с которой я сталкиваюсь в разработке Hybrid с использованием приложения Ionic Cordova
Сопо

Ответы:


387

Вот что я сделал:

  1. Я создал IBAction в заголовочных файлах .h следующим образом:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Я добавил UIButton на странице настроек, содержащей текст, на который я хочу сослаться.

  3. Я подключил кнопку к IBAction в File Owner соответственно.

  4. Затем выполните следующее:

Objective-C

- (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 с джейлбрейком и использует Chrome или что-то другое в качестве браузера по умолчанию, то откроется это, а не Safari
Laszlo

214
Я чувствую, что если кто-то попытался сделать джейлбрейк своего телефона, чтобы сделать Chrome браузером по умолчанию, соблюдение этого параметра, вероятно, является идеальным поведением.
rpowell

Я понял это, но если я открываю веб-сайт и пользователь сейчас просматривает веб-сайт, если он заходит на определенную страницу, могу ли я получить ссылку на текущую веб-страницу в своем коде?
Варун Джайн

3
Выше метод устарел, теперь используйте следующее. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertising.url] параметры: @ {} завершение, Хандлер: ^ (успех BOOL) {}];
Машхади

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

164

Быстрый Синтаксис:

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 чрезвычайно полезны для разработчиков Swift, это новый язык без большого количества документации, особенно. на решении реальных проблем iOS. В моем случае автозаполнение выбрало селектор «fileURLWithPath:», и я не понял, именно поэтому мой URL не открывался, только прочитав ответ Дастина, я понял, что должен был использовать селектор «string:» , Так что за Дастина нужно голосовать, а не наказывать.
SafeFastExpressive

3
@g_fred. Почему он не сможет включить версию Swift?
Эрику

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

2
Вы можете напрямую использовать URL вместо NSURL, чтобы вы могли сохранить актерский состав.
Марсбер

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

53

Здесь требуется одна проверка, чтобы открываемый URL мог открываться устройством или симулятором или нет. Потому что иногда (большинство в симуляторе) я обнаружил, что это вызывает сбои.

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

Swift 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здесь) не будет жестко запрограммирована, и вам нужен такой код.
значение имеет значение

@ Влад Вы были разочарованы, и если да, то как / почему? Я предполагаю, что люди не просто копируют код выше.
значение имеет значение

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

Это поддерживает устройства под управлением более старых версий 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 Extensions. Другие ответы работают только в приложениях и не могут использоваться в расширениях.
Оуэн Чжао

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 ( : options: завершение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)

Пожалуйста, скажите мне, что нового в коде, который вы написали, и вы отметили меня голосом
Дилип Тивари

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