web-dev-qa-db-fra.com

Lancer une application depuis un autre (iPhone)

Est-il possible de lancer une application iPhone quelconque à partir d'une autre application?, Par exemple dans mon application si je souhaite que l'utilisateur appuie sur un bouton et se lance directement dans l'application Téléphone (fermez l'application en cours, ouvrez le Application téléphonique).

cela serait-il possible? Je sais que cela peut être fait pour passer des appels téléphoniques avec le lien tel URL, mais je souhaite simplement que l'application Phone soit lancée sans composer de numéro spécifique. 

155
Jeff

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 de celui d'Apple, du vôtre ou d'un autre développeur. Les docs sont ici:

Communication avec d'autres applications

En ce qui concerne le lancement du téléphone, il semble que votre lien tel: doit comporter au moins trois chiffres avant le lancement du téléphone. Donc, vous ne pouvez pas simplement entrer dans l'application sans composer un numéro.

76
Gordon Wilson

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

Supposons que nous ayons deux applications appelées FirstApp et 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

    Allez dans le fichier plist de SecondApp et vous devrez ajouter un Schémas d'URL avec une chaîne iOSDevTips ((vous pouvez bien sûr écrire un autre string.it).

enter image description here

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, il devrait ouvrir la SecondApp.

70
lee

La réponse sous le vent est absolument correcte pour iOS avant 8.

Dans iOS 9, vous devez inclure dans la liste blanche les modèles d'URL que votre application souhaite interroger dans Info.plist sous la clé LSApplicationQueriesSchemes (un tableau de chaînes):

 enter image description here

22
KIO

En rapide

Juste au cas où quelqu'un cherchait un rapide copier-coller 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)      
}
15
villy393

Afin de vous permettre d'ouvrir votre application à partir d'une autre, vous devez apporter des modifications aux deux applications. Voici les étapes à suivre avec Swift 3 avec iOS 10 update:

1. Enregistrez votre application que vous souhaitez ouvrir

Mettez à jour le Info.plist en définissant le modèle d'URL personnalisé et unique de votre application.

 enter image description here

Notez que votre nom de schéma doit être unique, sinon, si vous avez une autre application avec le même nom de schéma d'URL installé sur votre appareil, le moment de son exécution sera déterminé.

2. Inclure 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 méthode canOpenURL: de la classe UIApplication. Ouvrez donc le Info.plist de l'application principale et ajoutez le schéma d'URL de l'autre application à LSApplicationQueriesSchemes. (Introduit dans iOS 9.0)​​_

 enter image description here

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

Maintenant que tout est configuré, vous pouvez écrire votre code dans votre application principale qui ouvre votre autre application. Cela devrait ressembler à quelque chose comme ça:

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 d'AppStore) s'ouvre. Si vous souhaitez ouvrir une application que vous avez déjà publiée sur Apple AppStore, vous devez télécharger une la nouvelle version commence en premier avec l’enregistrement de votre schéma d’URL. _

11
choofie

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

10
Nickolas

Vous pouvez uniquement lancer des applications ayant enregistré un schéma d'URL. Ensuite, comme si vous ouvriez l'application SMS à l'aide de sms :, vous pourrez ouvrir l'application à l'aide de leur schéma d'URL.

Il existe un très bon exemple disponible dans la documentation appelée LaunchMe qui illustre cela.

Exemple de code LaunchMe au 6 novembre 2017.

7
lostInTransit

Pour ce faire, nous devons ajouter quelques lignes de code dans les deux applications.

App A: Ce que vous voulez ouvrir depuis une autre application. (La source)

App B: À partir de l'application B, vous souhaitez ouvrir App A(Destination)

Code pour App A

Ajoutez quelques balises dans la Plist de App A Ouvrez le Plist Source de l'App A et des versions antérieures à 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 le délégué d'application de App A - Obtenez le 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 
}

J'arrive maintenant à code de l'application B

Si vous voulez juste ouvrir App 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 voulez passer le paramètre de App B à App 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 une application en tapant simplement testApp.linking: //? Sur le navigateur Safari.

7
Alok

Essayez le code suivant 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];
6
btmanikandan

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

3
Lily Ballard

J'ai aussi essayé cela il y a quelque temps ( Lancer une application iPhone avec Identifier ), mais il n'y a aucun moyen DOCUMENTED de le faire. :)

2
Foebe

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 quelques modifications aux fichiers .plist pour les deux applications.

Étape 1

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

 enter image description here

Étape 2

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

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

Nous pouvons maintenant ouvrir l'application DelegateExample en cliquant 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
    }
}
1
iOS

Swift 3 version rapide et collée de @ villy393 answer for:

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

Une note de côté concernant ce sujet ...

Il existe une limite de 50 requêtes pour les protocoles non enregistrés.

Dans cette discussion Apple mentionnez que, pour une version spécifique d'une application, vous ne pouvez interroger la canOpenUrl qu'un nombre limité de fois et échouera après 50 appels pour des régimes non déclarés . J'ai également vu que si le protocole est ajouté une fois que vous avez entré cet état d'échec, il échouera quand même.

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

0
Duncan Hoggan