Avvia un'app da un'altra (iPhone)


170

È possibile avviare un'applicazione iPhone arbitraria dall'interno di un'altra app? Ad esempio, nella mia applicazione, se voglio che l'utente prema un pulsante e si avvii direttamente nell'app Telefono (chiudi l'app corrente, apri l'app Telefono) .

questo sarebbe possibile? So che questo può essere fatto per effettuare chiamate telefoniche con il collegamento dell'URL del telefono, ma desidero invece semplicemente avviare l'app Telefono senza comporre alcun numero specifico.

Risposte:


80

Come sottolinea Kevin, gli schemi URL sono l'unico modo per comunicare tra le app. Quindi, no, non è possibile avviare app arbitrarie.

Ma è possibile avviare qualsiasi app che registra uno schema URL, che sia Apple, il tuo o un altro sviluppatore. I documenti sono qui:

Comunicazione con altre applicazioni

Per quanto riguarda l'avvio del telefono, sembra che il tuo tel:collegamento debba contenere almeno tre cifre prima che il telefono venga avviato. Quindi non puoi semplicemente entrare nell'app senza comporre un numero.


8
Puoi verificare se l'applicazione in questione è installata utilizzando UIApplication's - (BOOL) canOpenURL: (NSURL *) url
Willster

1
cosa succede se 2 app registrano lo stesso gestore URL e quindi viene chiamato l'URL? So che in Android ti verrà presentato un elenco in modo da poter scegliere quale dei due si desidera eseguire. Come lo gestisce iOS?
eggie5,

3
Nota: se più di un'app di terze parti si registra per gestire lo stesso schema URL, al momento non esiste alcun processo per determinare quale app verrà assegnata a tale schema. Rif: developer.apple.com/library/ios/#documentation/iPhone/…
Futur

2
Questo è il link aggiornato che menziona la nota su più di un'app di terze parti che si registra per gestire lo stesso schema URL: Apple Docs
Sindri Jóelsson

Di nuovo obsoleto. Link aggiornato: developer.apple.com/documentation/uikit/…
Dave Nottage

78

Ho scoperto che è facile scrivere un'app che può aprire un'altra app.

Supponiamo che abbiamo due app chiamate FirstAppe SecondApp. Quando apriamo la FirstApp, vogliamo essere in grado di aprire la SecondApp facendo clic su un pulsante. La soluzione per farlo è:

  1. In SecondApp

    Vai al file plist di SecondApp e devi aggiungere uno Schema URL con una stringa iOSDevTips (ovviamente puoi scrivere un'altra stringa. Sta a te).

inserisci qui la descrizione dell'immagine

2 In FirstApp

Crea un pulsante con l'azione seguente:

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

}

Questo è tutto. Ora, quando puoi fare clic sul pulsante in FirstApp, dovrebbe aprire SecondApp.


2
Puoi vedere la spiegazione completa qui iosdevelopertips.com/cocoa/…
youssman

1
@Lee sto seguendo il tuo post, Safari può aprire l'applicazione ma un'altra app non si apre (metodo premuto il pulsante) altrimenti viene eseguito il blocco, qual è il problema puoi aiutarmi per favore
srinivas n

Per favore mi dia più qualche dettaglio del vostro problema
lee

1
Persone che non possono ottenere questo lavoro, aggiungere un array di stringhe di nome 'LSApplicationQueriesSchemes' in Info.plistdella FirstApp. Quindi aggiungi gli schemi che la tua app vuole aprire, in questo caso Item 0sarebbeiOSDevTips

1
Vedi anche la risposta di KIO di seguito ( stackoverflow.com/a/33763449/394969 ). FirstApp deve aggiungere LSApplicationQueriesSchemesal proprio Info.plist per poter aprire SecondApp.
John Erck,

28

La risposta sottovento è assolutamente corretta per iOS prima dell'8.

In iOS 9+ devi inserire nella whitelist tutti gli schemi URL che la tua app desidera interrogare in Info.plist sotto la chiave LSApplicationQueriesSchemes (un array di stringhe):

inserisci qui la descrizione dell'immagine


2
La migliore risposta dovrebbe essere una fusione tra @KIO e villy393
Gustavo Barbosa,

19

In Swift

Nel caso in cui qualcuno stesse cercando una rapida copia e incolla di 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)      
}

13

Per consentire l'apertura di un'altra applicazione, è necessario apportare modifiche in entrambe le applicazioni. Ecco i passaggi che utilizzano Swift 3 con l' aggiornamento di iOS 10 :

1. Registrare l'applicazione che si desidera aprire

Aggiorna il Info.plistdefinendo lo schema URL unico e personalizzato dell'applicazione.

inserisci qui la descrizione dell'immagine

Nota che il nome del tuo schema dovrebbe essere univoco, altrimenti se hai un'altra applicazione con lo stesso nome di schema URL installato sul tuo dispositivo, questo sarà determinato in fase di esecuzione quale verrà aperto.

2. Includi lo schema URL precedente nella tua applicazione principale

Dovrai specificare lo schema URL che desideri che l'app possa utilizzare con il canOpenURL:metodo della UIApplicationclasse. Quindi apri l'applicazione principale Info.pliste aggiungi lo schema URL dell'altra applicazione a LSApplicationQueriesSchemes. (Introdotto in iOS 9.0)

inserisci qui la descrizione dell'immagine

3. Implementare l'azione che apre l'applicazione

Ora tutto è impostato, quindi sei a posto per scrivere il codice nella tua applicazione principale che apre l'altra app. Questo dovrebbe assomigliare a questo:

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

Tieni presente che queste modifiche richiedono una nuova versione se desideri che l'app esistente (installata da AppStore) si apra. Se desideri aprire un'applicazione che hai già rilasciato su Apple AppStore, dovrai prima caricare una nuova versione che includa la registrazione dello schema URL.


1
Questa è la risposta esatta. Ho notato che solo l'aggiunta di "LSApplicationQueriesSchemes" non ha funzionato, anche lo "Schema URL" deve essere aggiunto in info.plist.
Shailesh,


9

Per raggiungere questo obiettivo, dobbiamo aggiungere alcune righe di codice in entrambe le app

App A: che si desidera aprire da un'altra app. (Fonte)

App B : dall'app B si desidera aprire l' app A (destinazione)

Codice per l' app A

Aggiungi alcuni tag nella Plist of App A Apri la Plist Sorgente dell'app A e passato sotto XML

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

In App delegato dell'app A - Ottieni richiamata qui

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

Ora arrivo al codice App B -

Se vuoi solo aprire l'App A senza alcun parametro di input

-(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 si desidera passare parametri da App B a App A quindi utilizzare sotto codice

-(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: puoi anche aprire l'app semplicemente digitando testApp.linking: //? sul browser safari


7

Prova il seguente codice ti aiuterà ad avviare un'applicazione dalla tua applicazione

Nota: sostituire il nome fantacy con il nome effettivo dell'applicazione

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

7

Puoi avviare solo app che hanno registrato uno schema URL. Quindi, proprio come apri l'app SMS usando sms :, sarai in grado di aprire l'app usando il loro schema URL.

C'è un ottimo esempio disponibile nei documenti chiamato LaunchMe che lo dimostra.

Codice di esempio LaunchMe al 6 novembre 2017.


Risposta aggiornata. Spero che sia d'aiuto
lostInTransit

Grazie; per caso, fai parte delle chat room della famiglia di sviluppatori iOS?
Eenvincible,

4

No non lo è. Oltre ai gestori di URL documentati, non c'è modo di comunicare / avviare un'altra app.



3

In Swift 4.1 e Xcode 9.4.1

Ho due app 1) PageViewControllerExample e 2) DelegateExample. Ora voglio aprire l'app DelegateExample con l'app PageViewControllerExample. Quando faccio clic sul pulsante Apri in PageViewControllerExample, viene aperta l'app DelegateExample.

Per questo dobbiamo apportare alcune modifiche ai file .plist per entrambe le app.

Passo 1

Nell'app DelegateExample aprire il file .plist e aggiungere tipi di URL e schemi URL. Qui dobbiamo aggiungere il nostro nome richiesto come "myapp".

inserisci qui la descrizione dell'immagine

Passo 2

Nell'app PageViewControllerExample aprire il file .plist e aggiungere questo codice

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

Ora possiamo aprire l'app DelegateExample quando facciamo clic sul pulsante in 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
    }
}

Ottimo, aiuta. Ora come passare l'argomento dall'app di origine all'app di destinazione?
Vigneswaran il

2

Una nota a margine di questo argomento ...

Esiste un limite di 50 richieste per i protocolli non registrati.

In questa discussione, Apple menziona che per una versione specifica di un'app è possibile eseguire una query solo per canOpenUrlun numero limitato di volte e fallirà dopo 50 chiamate per schemi non dichiarati . Ho anche visto che se il protocollo viene aggiunto dopo aver inserito questo stato di errore, continuerà comunque a non funzionare.

Sii consapevole di ciò, potrebbe essere utile a qualcuno.


0

Swift 3 versione rapida e incolla della risposta @ villy393 per:

if UIApplication.shared.canOpenURL(openURL) {
    UIApplication.shared.openURL(openURL)
} else if UIApplication.shared.canOpenURL(installUrl) 
    UIApplication.shared.openURL(installUrl)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.