Como iniciar o Safari e abrir URL a partir do aplicativo iOS

215

Na página de configurações, quero incluir três links para

  • Meu site de suporte de aplicativo
  • Tutorial do aplicativo do YouTube
  • Meu site principal (por exemplo: vinculado a um rótulo 'Created by Dale Dietrich'.)

Pesquisei neste site, na Web e em minha documentação e não encontrei nada que fosse óbvio.

NOTA: Não quero abrir páginas da Web no meu aplicativo. Eu só quero enviar o link para o Safari e esse link estará aberto lá. Já vi vários aplicativos fazendo a mesma coisa na página "Configurações", por isso deve ser possível.

Dale Dietrich
fonte
Mesmo problema que estou enfrentando em desenvolvimento híbrido usando Ionic Cordova aplicativo
Sopo

Respostas:

386

Aqui está o que eu fiz:

  1. Criei uma IBAction nos arquivos .h do cabeçalho da seguinte maneira:

    - (IBAction)openDaleDietrichDotCom:(id)sender;
  2. Adicionei um UIButton na página Configurações que contém o texto ao qual quero vincular.

  3. Conectei o botão ao IBAction no Proprietário do arquivo adequadamente.

  4. Em seguida, implemente o seguinte:

Objetivo-C

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

Rápido

(IBAction no viewController, em vez de arquivo de cabeçalho)

if let link = URL(string: "https://yoursite.com") {
  UIApplication.shared.open(link)
}
Dale Dietrich
fonte
8
Mas isso não é 100%, porque se alguém usar uma iOS jailbreaked e usar Chrome ou algo como navegador padrão, então isso vai abrir isso, não Safari
Laszlo
214
Sinto que, se alguém se esforçou para fazer o jailbreak do telefone para tornar o Chrome o navegador padrão, honrar essa configuração provavelmente é o comportamento ideal.
rpowell
Entendi isso, mas se estou abrindo um site e o usuário está navegando no site agora, se ele parar em uma página específica, posso obter o link da página atual no meu código?
Varun Jain
3
O método acima está obsoleto agora, use o seguinte. [[UIApplication sharedApplication] openURL: [NSURL URLWithString: self.advertisement.url] opções: @ {} conclusãoHandler: ^ (êxito em BOOL) {}];
Mashhadi
@Laszlo Além disso, nas configurações, podemos desativar o Safari em Restrições. Codifiquei um aplicativo com os esquemas de URL http e https para abrir outros navegadores quando um URL http ou https é aberto e o Safari está desativado. Portanto, mesmo sem o Jailbreak, podemos alterar tecnicamente o navegador da web padrão.
precisa saber é o seguinte
164

Sintaxe rápida:

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

Nova sintaxe Swift para iOS 9.3 e versões anteriores

A partir de uma nova versão do Swift (possivelmente swift 2?), O UIApplication.sharedApplication () agora é o UIApplication.shared (aproveitando melhor as propriedades computadas). Além disso, o URL não é mais implicitamente conversível em NSURL, deve ser explicitamente convertido com as!

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

Nova sintaxe Swift a partir do iOS 10.0

O método openURL foi descontinuado e substituído por um método mais versátil que utiliza um objeto de opções e um manipulador de conclusão assíncrono a partir do iOS 10.0

UIApplication.shared.open(NSURL(string:"http://www.reddit.com/")! as URL)
Dustin Williams
fonte
31
As versões Swift das respostas são extremamente úteis para os desenvolvedores Swift, é um novo idioma sem muita documentação, esp. na solução de problemas do iOS no mundo real. No meu caso, o preenchimento automático havia escolhido o seletor "fileURLWithPath:" e eu não percebi que era por isso que meu URL não estava abrindo; foi apenas lendo a resposta de Dustin que vi que deveria estar usando o seletor "string:" . Então Dustin deve ser votado, não castigado.
SafeFastExpressive
3
@g_fred. Por que ele não seria capaz de incluir uma versão Swift?
ericgu
2
openURL(_:)foi preterido no iOS 10.0, em vez disso, você deve chamar o método de instância open(_:options:completionHandler:)no UIApplication.
Ryan H.
2
Você pode usar diretamente o URL em vez de NSURL para salvar o elenco.
Marsbear #
1
Eu recomendo nunca forçar desembrulhar. if let url = NSURL(string:"http://www.reddit.com/") { UIApplication.shared.open(url) }sempre servirá o seu melhor. Pode querer asserte erro na elsedeclaração para pegar erros de digitação.
Philip
53

Aqui é necessária uma verificação para que o URL aberto seja capaz de abrir por dispositivo ou simulador ou não. Porque algumas vezes (maioria no simulador) eu achei que causa falhas.

Objetivo-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)
}
Chetan Prajapati
fonte
1
Você sempre pode abrir HTTP / HTTPS. No iOS 9, você precisa colocar na lista branca qualquer URL que desejar chamar canOpenURL. Não vejo por que você simplesmente não ligaria openURL:urle, se falhar, lide com a falha. canOpenURLé usado principalmente para detectar a instalação de um aplicativo sem sair do aplicativo atual.
Ben Flynn
1
openURL(_:)foi preterido no iOS 10.0, em vez disso, você deve chamar o método de instância open(_:options:completionHandler:)no UIApplication.
Ryan H.
20

Veja o -openURL:método no UIApplication. Ele deve permitir que você passe uma instância NSURL para o sistema, o que determinará em qual aplicativo abrir e iniciar o aplicativo. (Lembre-se de que você provavelmente desejará verificar -canOpenURL:primeiro, caso a URL não possa ser manipulada por aplicativos atualmente instalados no sistema - embora isso provavelmente não seja um problema para http://links simples ).

Tim
fonte
Obrigado Tim. Você está certo. Eu estava adicionando minha própria resposta quando a sua entrou. Desculpe por isso. Mas pelo menos agora há um tutorial fácil para aqueles que me seguem.
Dale Dietrich
Não se preocupe - feliz por ter encontrado a solução!
Tim
1
openURL(_:)foi preterido no iOS 10.0, em vez disso, você deve chamar o método de instância open(_:options:completionHandler:)no UIApplication.
Ryan H.
17

E, caso você não tenha certeza se o URL fornecido textpossui um esquema:

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];
assuntos de significado
fonte
@ Vlad Este é apenas um exemplo codificado. Freqüentemente, a string do URL ( textaqui) não é codificada e você precisa de um código como este.
significado-importa
@ Vlad Você estava frustrado, e se sim, como / por quê? Presumo que as pessoas não copiem apenas o código acima.
significado-importa
1
de significado assuntos É até você :)
Vlad
13

A versão Objective-C não reprovada seria:

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

Também suporta dispositivos com versões mais antigas do iOS

Greg T
fonte
10

Solução Swift 3 com um botão Concluído

Não esqueça de import SafariServices

if let url = URL(string: "http://www.yoururl.com/") {
            let vc = SFSafariViewController(url: url, entersReaderIfAvailable: true)
            present(vc, animated: true)
        }
Baher A
fonte
Essa é a resposta perfeita que funciona nas extensões iOS e iOS. Outras respostas funcionam apenas em aplicativos e não podem ser usadas em extensões.
Owen Zhao
5

Como esta resposta está obsoleta desde o iOS 10.0, uma resposta melhor seria:

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

y pt Objective-c

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

O openURL ( :) foi descontinuado no iOS 10.0, em vez disso, você deve usar o seguinte método de instância no UIApplication: open ( : options: complementHandler :)

Exemplo de uso do Swift
Isso abrirá " https://apple.com " no 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.
fonte
2

No SWIFT 3.0

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

Uso:

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

Referência:

OpenURL no iOS10

Zgpeace
fonte
1

Tente o seguinte:

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

No Swift 1.2, tente o seguinte:

let pth = "http://www.google.com"
    if let url = NSURL(string: pth){
        UIApplication.sharedApplication().openURL(url)
Dilip Tiwari
fonte
plz me dizer o que é o novo código que você escreveu e você me marcado para baixo votação
Dilip Tiwari
-2

Solução Swift 4:

UIApplication.shared.open(NSURL(string:"http://yo.lo")! as URL, options: [String : Any](), completionHandler: nil)
Kevin ABRIOUX
fonte
1
Uma versão adequada do Swift 4 usaria URL e não NSURL. E transmitir NSURL como URL não é o mesmo. Consulte stackoverflow.com/a/37812485/2227743 para obter uma explicação. Além disso, forçar o desembrulhamento é ruim.
Eric Aya