Lancer une application depuis un autre (iPhone)

170

Est-il possible de lancer une application iPhone arbitraire à partir d'une autre application?, Par exemple dans mon application si je veux que l'utilisateur appuie sur un bouton et lance directement dans l'application Téléphone (fermez l'application actuelle, ouvrez l'application Téléphone) .

serait-ce possible? Je sais que cela peut être fait pour passer des appels téléphoniques avec le lien URL tel, mais je souhaite plutôt que l'application Téléphone se lance sans appeler de numéro spécifique.

Alok
la source

Réponses:

80

Comme le souligne Kevin, les schémas d'URL sont le seul moyen de communiquer entre les applications. Donc, non, il n'est pas possible de lancer des applications arbitraires.

Mais il est possible de lancer n'importe quelle application qui enregistre un schéma d'URL, qu'il s'agisse d'Apple, de la vôtre ou d'un autre développeur. Les documents sont ici:

Communiquer avec d'autres applications

En ce qui concerne le lancement du téléphone, il semble que votre tel:lien doit comporter au moins trois chiffres avant que le téléphone ne se lance. Vous ne pouvez donc pas simplement accéder à l'application sans composer un numéro.

Gordon Wilson
la source
8
Vous pouvez vérifier si l'application en question est installée en utilisant UIApplication - (BOOL) canOpenURL: (NSURL *) url
Willster
1
que se passe-t-il si 2 applications enregistrent le même gestionnaire d'URL et que l'URL est appelée? Je sais que dans Android, vous serez présenté avec une liste afin que vous puissiez choisir lequel des deux vous souhaitez exécuter. Comment iOS gère-t-il cela?
eggie5
3
Remarque: Si plusieurs applications tierces s'inscrivent pour gérer le même schéma d'URL, il n'existe actuellement aucun processus permettant de déterminer quelle application recevra ce schéma. Réf: developer.apple.com/library/ios/#documentation/iPhone/…
Futur
2
Voici le lien mis à jour qui mentionne la note sur l'enregistrement de plusieurs applications tierces pour gérer le même schéma d'URL: Apple Docs
Sindri Jóelsson
À nouveau obsolète. Lien mis à
Dave Nottage
78

J'ai trouvé qu'il est facile d'écrire une application qui peut ouvrir une autre application.

Supposons que nous ayons deux applications appelées FirstAppet SecondApp. Lorsque nous ouvrons la FirstApp, nous voulons pouvoir ouvrir la SecondApp en cliquant sur un bouton. La solution pour cela est:

  1. Dans SecondApp

    Accédez au fichier plist de SecondApp et vous devez ajouter un schéma d' URL avec une chaîne iOSDevTips (bien sûr, vous pouvez écrire une autre chaîne, c'est à vous de décider).

entrez la description de l'image ici

2. Dans FirstApp

Créez un bouton avec l'action ci-dessous:

- (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];
  }

}

C'est tout. Maintenant, lorsque vous pouvez cliquer sur le bouton dans la FirstApp, cela devrait ouvrir SecondApp.

Lee
la source
2
Vous pouvez voir l'explication complète ici iosdevelopertips.com/cocoa/…
youssman
1
@Lee Je suis votre message, safari peut ouvrir l'application mais une autre application ne s'ouvre pas (méthode appuyée sur un bouton) sinon le bloc est exécuté, quel est le problème pouvez-vous s'il vous plaît m'aider
srinivas n
Veuillez me donner plus de détails sur votre problème
lee
1
Les gens qui ne peuvent pas obtenir ce travail, ajouter un tableau de chaînes nommé « LSApplicationQueriesSchemes » dans Info.plistla FirstApp. Ajoutez ensuite les schémas que votre application souhaite ouvrir, dans ce cas, le Item 0seraitiOSDevTips
1
Voir également la réponse de KIO ci-dessous ( stackoverflow.com/a/33763449/394969 ). FirstApp doit ajouter LSApplicationQueriesSchemesà son Info.plist pour pouvoir ouvrir SecondApp.
John Erck
28

La réponse Lee est absolument correcte pour iOS avant la version 8.

Dans iOS 9+, vous devez mettre sur liste blanche tous les schémas d'URL que votre application souhaite interroger dans Info.plist sous la clé LSApplicationQueriesSchemes (un tableau de chaînes):

entrez la description de l'image ici

KIO
la source
2
La meilleure réponse devrait être une fusion entre @KIO et villy393
Gustavo Barbosa
19

Dans Swift

Juste au cas où quelqu'un chercherait un copier-coller rapide de 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
la source
13

Afin de vous permettre d'ouvrir votre application à partir d'une autre, vous devrez apporter des modifications dans les deux applications. Voici les étapes d'utilisation de Swift 3 avec la mise à jour iOS 10 :

1. Enregistrez votre application que vous souhaitez ouvrir

Mettez à jour le Info.plisten définissant le schéma d'URL personnalisé et unique de votre application.

entrez la description de l'image ici

Notez que le nom de votre schéma doit être unique, sinon si vous avez une autre application avec le même nom de schéma d'URL installée sur votre appareil, alors ce sera le runtime déterminé qui sera ouvert.

2. Incluez le schéma d'URL précédent dans votre application principale

Vous devrez spécifier le schéma d'URL que vous souhaitez que l'application puisse utiliser avec la canOpenURL:méthode de la UIApplicationclasse. Ouvrez donc l'application principale Info.plistet ajoutez le schéma d'URL de l'autre application LSApplicationQueriesSchemes. (Introduit dans iOS 9.0)

entrez la description de l'image ici

3. Implémentez l'action qui ouvre votre application

Maintenant, tout est configuré, vous êtes donc prêt à écrire votre code dans votre application principale qui ouvre votre autre application. Cela devrait ressembler à ceci:

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

Notez que ces modifications nécessitent une nouvelle version si vous souhaitez que votre application existante (installée à partir de l'AppStore) s'ouvre. Si vous souhaitez ouvrir une application que vous avez déjà publiée sur Apple AppStore, vous devez d'abord télécharger une nouvelle version qui inclut l'enregistrement de votre schéma d'URL.

choofie
la source
1
C'est la bonne réponse. J'ai remarqué que seul l'ajout de "LSApplicationQueriesSchemes" ne fonctionnait pas, le "Schéma d'URL" doit également être ajouté dans info.plist.
Shailesh
11

Voici un bon tutoriel pour lancer une application à partir d'une autre application:
SDK iOS: Travailler avec des schémas d'URL
Et, il n'est pas possible de lancer une application arbitraire, mais les applications natives qui ont enregistré les schémas d'URL .

Nickolas
la source
9

Pour y parvenir, nous devons ajouter quelques lignes de code dans les deux applications

Application A: que vous souhaitez ouvrir à partir d'une autre application. (La source)

App B : à partir de l'application B, vous souhaitez ouvrir l' application A (destination)

Code pour l' application A

Ajoutez quelques balises dans le Plist de l' application A Open Plist Source de l'application A et Past sous XML

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

Dans l'application déléguée de l' application A - Obtenez un rappel ici

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

Arrive maintenant au code de l' application B -

Si vous souhaitez simplement ouvrir l'application A sans aucun paramètre d'entrée

-(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];

        }
}

Si vous souhaitez passer le paramètre de l' application B à l' application A, utilisez le code ci-dessous

-(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];

        }
}

Remarque: vous pouvez également ouvrir l'application en tapant simplement testApp.linking: //? sur le navigateur safari

Alok
la source
7

Essayez le code suivant qui vous aidera à lancer une application à partir de votre application

Remarque: remplacez le nom fantacy par le nom réel de l'application

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

Vous ne pouvez lancer que des applications qui ont enregistré un schéma d'URL. Ensuite, tout comme vous ouvrez l'application SMS en utilisant sms :, vous serez en mesure d'ouvrir l'application en utilisant leur schéma d'URL.

Il existe un très bon exemple disponible dans la documentation appelé LaunchMe qui le démontre.

Exemple de code LaunchMe au 6 novembre 2017.

perdu
la source
Réponse mise à jour. J'espère que ça aide
perduIn
Merci; par hasard, appartenez-vous aux salons de discussion de la famille des développeurs iOS?
Eenvincible
4

Non ce n'est pas. Outre les gestionnaires d'URL documentés, il n'y a aucun moyen de communiquer avec / lancer une autre application.

Lily Ballard
la source
3

J'ai également essayé cela il y a quelque temps ( Lancer l'application iPhone avec identificateur ), mais il n'y a certainement pas de moyen DOCUMENTÉ de le faire. :)

ennemi
la source
2
Il est documenté ... Consultez la documentation Apple. developer.apple.com/library/IOs/#documentation/iPhone/…
Moszi
1
Je sais que les schémas d'URL sont possibles, mais ce que j'ai demandé dans ma question et ce que Jeff a demandé, c'est comment ouvrir des applications qui ne prennent pas en charge les schémas d'URL ...
foebe
3

Dans Swift 4.1 et Xcode 9.4.1

J'ai deux applications 1) PageViewControllerExample et 2) DelegateExample. Maintenant, je veux ouvrir l'application DelegateExample avec l'application PageViewControllerExample. Lorsque je clique sur le bouton Ouvrir dans PageViewControllerExample, l'application DelegateExample sera ouverte.

Pour cela, nous devons apporter des modifications aux fichiers .plist pour les deux applications.

Étape 1

Dans l'application DelegateExample, ouvrez le fichier .plist et ajoutez des types d'URL et des schémas d'URL. Ici, nous devons ajouter notre nom requis comme "myapp".

entrez la description de l'image ici

Étape 2

Dans l'application PageViewControllerExample, ouvrez le fichier .plist et ajoutez ce code

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

Maintenant, nous pouvons ouvrir l'application DelegateExample lorsque nous cliquons sur le bouton dans 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
la source
Super, ça aide. Maintenant, comment passer l'argument de l'application source à l'application de destination?
Vigneswaran A
2

Un petit mot sur ce sujet ...

Il existe une limite de 50 demandes pour les protocoles qui ne sont pas enregistrés.

Dans cette discussion, Apple mentionne que pour une version spécifique d'une application, vous ne pouvez interroger canOpenUrlqu'un nombre limité de fois et échouera après 50 appels pour des projets non déclarés . J'ai également vu que si le protocole est ajouté une fois que vous êtes entré dans cet état d'échec, il échouera toujours.

Soyez conscient de cela, pourrait être utile à quelqu'un.

Duncan Hoggan
la source
0

Swift 3 version rapide et collée de @ villy393 réponse pour:

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