Inicie um aplicativo de dentro de outro (iPhone)

170

É possível iniciar qualquer aplicativo arbitrário do iPhone a partir de outro aplicativo ?, Por exemplo, no meu aplicativo, se eu quiser que o usuário aperte um botão e inicie diretamente no aplicativo Telefone (feche o aplicativo atual, abra o aplicativo Telefone) .

isso seria possível? Sei que isso pode ser feito para fazer chamadas telefônicas com o link tel URL, mas, em vez disso, quero que o aplicativo Telefone inicie sem discar nenhum número específico.

Alok
fonte

Respostas:

80

Como Kevin ressalta, os esquemas de URL são a única maneira de se comunicar entre aplicativos. Portanto, não, não é possível iniciar aplicativos arbitrários.

Mas é possível iniciar qualquer aplicativo que registre um esquema de URL, seja da Apple, seu ou de outro desenvolvedor. Os documentos estão aqui:

Comunicação com outros aplicativos

Quanto ao lançamento do telefone, parece que seu tel:link precisa ter pelo menos três dígitos antes do lançamento do telefone. Portanto, você não pode simplesmente entrar no aplicativo sem discar um número.

Gordon Wilson
fonte
8
Você pode verificar se o aplicativo em questão está instalado usando o URL de canOpenURL do UIApplication - (BOOL): (NSURL *)
Willster
1
o que acontece se dois aplicativos registram o mesmo manipulador de URL e o URL é chamado? Eu sei que no Android você será apresentado com uma lista para que você possa escolher qual dos dois deseja executar. Como o ios lida com isso?
eggie5
3
Nota: Se mais de um aplicativo de terceiros se registrar para manipular o mesmo esquema de URL, atualmente não há processo para determinar qual aplicativo receberá esse esquema. Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur
2
Este é o link atualizado que menciona a nota sobre mais-que um aplicativo de terceiros registrar para lidar com o mesmo URL-esquema: a Apple Docs
Sindri Joelsson
Desatualizado novamente. Link atualizado: developer.apple.com/documentation/uikit/…
Dave Nottage
78

Descobri que é fácil escrever um aplicativo que possa abrir outro aplicativo.

Vamos supor que temos dois aplicativos chamados FirstAppe SecondApp. Quando abrimos o FirstApp, queremos poder abrir o SecondApp clicando em um botão. A solução para fazer isso é:

  1. No SecondApp

    Vá para o arquivo plist do SecondApp e você precisará adicionar um esquema de URL com uma string iOSDevTips (é claro que você pode escrever outra string.de sua escolha).

insira a descrição da imagem aqui

2) No FirstApp

Crie um botão com a ação abaixo:

- (void)buttonPressed:(UIButton *)button
{
  NSString *customURL = @"iOSDevTips://";

  if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:customURL]])
  {
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:customURL]];
  }
  else
  {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"URL error"
                              message:[NSString stringWithFormat:@"No custom URL defined for %@", customURL]
                              delegate:self cancelButtonTitle:@"Ok" 
                              otherButtonTitles:nil];
    [alert show];
  }

}

É isso aí. Agora, quando você pode clicar no botão no FirstApp, ele deve abrir o SecondApp.

lee
fonte
2
Você pode ver a explicação completa aqui iosdevelopertips.com/cocoa/…
youssman
1
@Lee estou seguindo o seu post, safari pode abrir o aplicativo, mas outro aplicativo não estiver aberto (botão método pressionado) bloco else é executado, qual é o problema que você pode por favor me ajude
srinivas n
Por favor, dê-me mais alguns detalhes do seu problema
lee
1
Pessoas que não podem chegar a este trabalho, adicionar uma matriz de seqüências chamado 'LSApplicationQueriesSchemes' em Info.plistdo FirstApp. Em seguida, adicione os esquemas que seu aplicativo deseja abrir; nesse caso, Item 0seria #iOSDevTips
1
Consulte também a resposta do KIO abaixo ( stackoverflow.com/a/33763449/394969 ). O FirstApp precisa adicionar LSApplicationQueriesSchemesao seu Info.plist para poder abrir o SecondApp.
John Erck 12/01
28

A resposta lee está absolutamente correta para iOS antes da 8.

No iOS 9 ou superior, você deve colocar na lista branca todos os esquemas de URL que seu aplicativo deseja consultar no Info.plist sob a chave LSApplicationQueriesSchemes (uma matriz de cadeias):

insira a descrição da imagem aqui

KIO
fonte
2
A melhor resposta deve ser uma fusão entre @KIO e villy393
Gustavo Barbosa
19

Na Swift

Apenas no caso de alguém estar procurando uma cópia e colagem rápida do Swift.

if let url = NSURL(string: "app://") where UIApplication.sharedApplication().canOpenURL(url) {
            UIApplication.sharedApplication().openURL(url)
} else if let itunesUrl = NSURL(string: "https://itunes.apple.com/itunes-link-to-app") where UIApplication.sharedApplication().canOpenURL(itunesUrl) {
            UIApplication.sharedApplication().openURL(itunesUrl)      
}
villy393
fonte
13

Para permitir que você abra seu aplicativo de outro, você precisará fazer alterações nos dois aplicativos. Aqui estão as etapas para usar o Swift 3 com iOS 10 atualização do :

1. Registre seu aplicativo que você deseja abrir

Atualize o Info.plist, definindo o esquema de URL personalizado e exclusivo do seu aplicativo.

insira a descrição da imagem aqui

Observe que o nome do seu esquema deve ser exclusivo; caso contrário, se você tiver outro aplicativo com o mesmo nome de esquema de URL instalado no dispositivo, isso determinará o tempo de execução de qual deles será aberto.

2. Inclua o esquema de URL anterior em seu aplicativo principal

Você precisará especificar o esquema de URL que deseja que o aplicativo possa usar com o canOpenURL:método da UIApplicationclasse. Portanto, abra o aplicativo principal Info.pliste adicione o esquema de URL do outro aplicativo LSApplicationQueriesSchemes. (Introduzido no iOS 9.0)

insira a descrição da imagem aqui

3. Implemente a ação que abre seu aplicativo

Agora tudo está configurado, então você deve escrever seu código no aplicativo principal que abre o outro aplicativo. Isso deve ser algo como isto:

let appURLScheme = "MyAppToOpen://"

guard let appURL = URL(string: appURLScheme) else {
    return
}

if UIApplication.shared.canOpenURL(appURL) {

    if #available(iOS 10.0, *) {
        UIApplication.shared.open(appURL)
    }
    else {
        UIApplication.shared.openURL(appURL)
    }
}
else {
    // Here you can handle the case when your other application cannot be opened for any reason.
}

Observe que essas alterações requerem uma nova versão se você deseja que o aplicativo existente (instalado na AppStore) seja aberto. Se você deseja abrir um aplicativo que você já lançou na Apple AppStore, precisará primeiro carregar uma nova versão que inclua o registro do seu esquema de URL.

choofie
fonte
1
Esta é a resposta certa. Notei que apenas a adição de "LSApplicationQueriesSchemes" não funcionou; o "Esquema de URL" também precisa ser adicionado em info.plist.
Shailesh
9

Para conseguir isso, precisamos adicionar algumas linhas de código nos aplicativos.

Aplicativo A: que você deseja abrir em outro aplicativo. (Fonte)

Aplicativo B : no aplicativo B, você deseja abrir o aplicativo A (destino)

Código para o aplicativo A

Adicione algumas tags ao Plist do aplicativo A Open Plist do aplicativo A e passado abaixo de XML

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>com.TestApp</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>testApp.linking</string>
        </array>
    </dict>
</array>

Delegado no aplicativo A - receba retorno de chamada aqui

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// You we get the call back here when App B will try to Open 
// sourceApplication will have the bundle ID of the App B
// [url query] will provide you the whole URL 
// [url query] with the help of this you can also pass the value from App B and get that value here 
}

Agora chegando ao código do aplicativo B -

Se você deseja apenas abrir o App A sem nenhum parâmetro de entrada

-(IBAction)openApp_A:(id)sender{

    if(![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"testApp.linking://?"]]){
         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"App is not available!" message:nil delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];

        }
}

Se você deseja passar o parâmetro do aplicativo B para o aplicativo A , use o código abaixo

-(IBAction)openApp_A:(id)sender{
    if(![[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"testApp.linking://?userName=abe&registered=1&Password=123abc"]]){
         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"App is not available!" message:nil delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
            [alert show];

        }
}

Nota: Você também pode abrir o aplicativo apenas digitando testApp.linking: //? no navegador safari

Alok
fonte
7

Experimente o código a seguir para ajudá-lo a iniciar um aplicativo a partir do seu aplicativo

Nota: Substitua o nome fantacy pelo nome real do aplicativo

NSString *mystr=[[NSString alloc] initWithFormat:@"fantacy://location?id=1"];
NSURL *myurl=[[NSURL alloc] initWithString:mystr];
[[UIApplication sharedApplication] openURL:myurl];
btmanikandan
fonte
7

Você pode iniciar apenas aplicativos que registraram um esquema de URL. Assim como você abre o aplicativo SMS usando sms :, você poderá abrir o aplicativo usando o esquema de URL.

Há um exemplo muito bom disponível nos documentos chamados LaunchMe que demonstra isso.

Código de exemplo do LaunchMe a partir de 6 de novembro de 2017.

lostInTransit
fonte
Resposta atualizada. Espero que ajude
lostInTransit
Obrigado; por acaso, você pertence às salas de chat da iOS Developer Family?
Eenvincible
4

Não, não é. Além dos manipuladores de URL documentados, não há como se comunicar com / iniciar outro aplicativo.

Lily Ballard
fonte
3

No Swift 4.1 e no Xcode 9.4.1

Eu tenho dois aplicativos 1) PageViewControllerExample e 2) DelegateExample. Agora eu quero abrir o aplicativo DelegateExample com o aplicativo PageViewControllerExample. Quando clico no botão Abrir no PageViewControllerExample, o aplicativo DelegateExample será aberto.

Para isso, precisamos fazer algumas alterações nos arquivos .plist para os dois aplicativos.

Passo 1

No aplicativo DelegateExample, abra o arquivo .plist e adicione Tipos e esquemas de URL. Aqui precisamos adicionar o nome necessário, como "myapp".

insira a descrição da imagem aqui

Passo 2

No aplicativo PageViewControllerExample, abra o arquivo .plist e adicione este código

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>myapp</string>
</array>

Agora podemos abrir o aplicativo DelegateExample quando clicamos no botão PageViewControllerExample.

//In PageViewControllerExample create IBAction
@IBAction func openapp(_ sender: UIButton) {

    let customURL = URL(string: "myapp://")
    if UIApplication.shared.canOpenURL(customURL!) {

        //let systemVersion = UIDevice.current.systemVersion//Get OS version
        //if Double(systemVersion)! >= 10.0 {//10 or above versions
            //print(systemVersion)
            //UIApplication.shared.open(customURL!, options: [:], completionHandler: nil)
        //} else {
            //UIApplication.shared.openURL(customURL!)
        //}

        //OR

        if #available(iOS 10.0, *) {
            UIApplication.shared.open(customURL!, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(customURL!)
        }
    } else {
         //Print alert here
    }
}
iOS
fonte
Ótimo, isso ajuda. Agora, como passar o argumento do aplicativo de origem para o aplicativo de destino?
Vigneswaran A
2

Uma observação lateral sobre este tópico ...

Há um limite de 50 solicitações para protocolos que não estão registrados.

Nesta discussão, a Apple menciona que, para uma versão específica de um aplicativo, você pode consultar apenas canOpenUrlum número limitado de vezes e falhará após 50 chamadas para esquemas não declarados . Também vi que, se o protocolo for adicionado depois de entrar nesse estado de falha, ele ainda falhará.

Esteja ciente disso, pode ser útil para alguém.

Duncan Hoggan
fonte
0

Swift 3 rápida e cole a versão da @ villy393 resposta para:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
cdescours
fonte