Iniciar una aplicación desde otra (iPhone)

170

¿Es posible iniciar una aplicación arbitraria de iPhone desde otra aplicación ?, por ejemplo, en mi aplicación si quiero que el usuario presione un botón y se inicie directamente en la aplicación del teléfono (cierre la aplicación actual, abra la aplicación del teléfono) .

¿Sería esto posible? Sé que esto se puede hacer para hacer llamadas telefónicas con el enlace tel URL, pero en su lugar quiero que la aplicación Teléfono se inicie sin marcar ningún número específico.

Alok
fuente

Respuestas:

80

Como señala Kevin, los esquemas de URL son la única forma de comunicarse entre aplicaciones. Entonces, no, no es posible iniciar aplicaciones arbitrarias.

Pero es posible iniciar cualquier aplicación que registre un esquema de URL, ya sea Apple, tuyo u otro desarrollador. Los documentos están aquí:

Comunicarse con otras aplicaciones

En cuanto a iniciar el teléfono, parece que su tel:enlace debe tener al menos tres dígitos antes de que se inicie el teléfono. Por lo tanto, no puede simplemente ingresar a la aplicación sin marcar un número.

Gordon Wilson
fuente
8
Puede verificar si la aplicación en cuestión está instalada utilizando UIApplication's - (BOOL) canOpenURL: (NSURL *) url
Willster
1
¿Qué sucede si 2 aplicaciones registran el mismo controlador de URL y luego se llama a la URL? Sé que en Android se le presentará una lista para que pueda elegir cuál de los dos desea ejecutar. ¿Cómo maneja esto iOS?
eggie5
3
Nota: Si más de una aplicación de terceros se registra para manejar el mismo esquema de URL, actualmente no hay ningún proceso para determinar qué aplicación recibirá ese esquema. Ref: developer.apple.com/library/ios/#documentation/iPhone/…
Futur
2
Este es el enlace actualizado que menciona la nota sobre el registro de más de una aplicación de terceros para manejar el mismo esquema de URL: Apple Docs
Sindri Jóelsson
Fuera de fecha de nuevo. Enlace actualizado: developer.apple.com/documentation/uikit/…
Dave Nottage
78

Descubrí que es fácil escribir una aplicación que pueda abrir otra aplicación.

Supongamos que tenemos dos aplicaciones llamadas FirstAppy SecondApp. Cuando abrimos FirstApp, queremos poder abrir SecondApp haciendo clic en un botón. La solución para hacer esto es:

  1. En SecondApp

    Vaya al archivo plist de SecondApp y necesita agregar un esquema de URL con una cadena iOSDevTips (por supuesto, puede escribir otra cadena. Depende de usted).

ingrese la descripción de la imagen aquí

2) En FirstApp

Cree un botón con la siguiente acción:

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

}

Eso es. Ahora, cuando puede hacer clic en el botón de FirstApp, debería abrir SecondApp.

sotavento
fuente
2
Puede ver la explicación completa aquí iosdevelopertips.com/cocoa/…
youssman
1
@Lee estoy siguiendo su puesto, Safari puede abrir la aplicación, pero no otra aplicación abierta (botón presionado método) se ejecuta el bloque otra cosa, ¿cuál es el problema puede que por favor me ayude
srinivas n
Por favor, dame más detalles de tu problema
lee
1
Las personas que no pueden hacer que esto funcione, agregue una serie de cadenas llamadas 'LSApplicationQueriesSchemes' en Info.plistel FirstApp. Luego agregue los esquemas que su aplicación desea abrir, en este caso Item 0seríaiOSDevTips
1
Consulte también la respuesta de KIO a continuación ( stackoverflow.com/a/33763449/394969 ). FirstApp necesita agregar LSApplicationQueriesSchemesa su Info.plist para poder abrir SecondApp.
John Erck
28

La respuesta de Lee es absolutamente correcta para iOS anterior a 8.

En iOS 9+, debe incluir en la lista blanca cualquier esquema de URL que su aplicación quiera consultar en Info.plist bajo la clave LSApplicationQueriesSchemes (una serie de cadenas):

ingrese la descripción de la imagen aquí

KIO
fuente
2
La mejor respuesta debería ser una fusión entre @KIO y villy393
Gustavo Barbosa
19

En veloz

En caso de que alguien estuviera buscando una copia y pegado rápida 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
fuente
13

Para poder abrir su aplicación desde otra, deberá realizar cambios en ambas aplicaciones. Estos son los pasos para usar Swift 3 con la actualización de iOS 10 :

1. Registre su aplicación que desea abrir

Actualice Info.plistdefiniendo el esquema de URL personalizado y único de su aplicación.

ingrese la descripción de la imagen aquí

Tenga en cuenta que el nombre de su esquema debe ser único; de lo contrario, si tiene otra aplicación con el mismo nombre de esquema de URL instalado en su dispositivo, entonces se determinará el tiempo de ejecución que se abre.

2. Incluya el esquema de URL anterior en su aplicación principal

Deberá especificar el esquema de URL que desea que la aplicación pueda usar con el canOpenURL:método de la UIApplicationclase. Abra las aplicaciones principales Info.plisty agregue el esquema de URL de la otra aplicación LSApplicationQueriesSchemes. (Introducido en iOS 9.0)

ingrese la descripción de la imagen aquí

3. Implemente la acción que abre su aplicación

Ahora todo está configurado, por lo que puede escribir su código en su aplicación principal que abre su otra aplicación. Esto debería verse más o menos así:

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

Tenga en cuenta que estos cambios requieren una nueva versión si desea que se abra su aplicación existente (instalada desde AppStore). Si desea abrir una aplicación que ya ha lanzado a Apple AppStore, primero deberá cargar una nueva versión que incluya su registro de esquema de URL.

choofie
fuente
1
Esta es la respuesta correcta. Me di cuenta de que solo agregar "LSApplicationQueriesSchemes" no funcionó, el "Esquema de URL" también debe agregarse en info.plist.
Shailesh
9

Para lograr esto, necesitamos agregar algunas líneas de código en ambas aplicaciones

Aplicación A: que desea abrir desde otra aplicación. (Fuente)

Aplicación B : desde la aplicación B desea abrir la aplicación A (destino)

Código para la aplicación A

Agregue algunas etiquetas a la lista de aplicaciones A Fuente de lista abierta de aplicaciones A y anteriores debajo 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>

En la aplicación delegado de la aplicación A : obtenga la devolución de llamada aquí

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

Ahora llegando al código de la aplicación B -

Si solo desea abrir la aplicación A sin ningún 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];

        }
}

Si desea pasar el parámetro de la aplicación B a la aplicación A , use el siguiente código

-(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: También puede abrir la aplicación con solo escribir testApp.linking: //? en el navegador safari

Alok
fuente
7

Pruebe el siguiente código que lo ayudará a iniciar una aplicación desde su aplicación

Nota: Reemplace el nombre fantacy con el nombre real de la aplicación

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

Solo puede iniciar aplicaciones que hayan registrado un esquema de URL. Luego, al igual que abres la aplicación de SMS usando sms :, podrás abrir la aplicación usando su esquema de URL.

Hay un muy buen ejemplo disponible en los documentos llamado LaunchMe que demuestra esto.

Código de muestra de LaunchMe a partir del 6 de noviembre de 2017.

perdido en el transito
fuente
Respuesta actualizada Espero que ayude
lostIn tránsito
Gracias; por casualidad, ¿perteneces a las salas de chat de iOS Developer Family?
Eenvincible el
4

No, no es. Además de los controladores de URL documentados, no hay forma de comunicarse con / iniciar otra aplicación.

Lily Ballard
fuente
3

En Swift 4.1 y Xcode 9.4.1

Tengo dos aplicaciones 1) PageViewControllerExample y 2) DelegateExample. Ahora quiero abrir la aplicación DelegateExample con la aplicación PageViewControllerExample. Cuando hago clic en el botón Abrir en PageViewControllerExample, se abrirá la aplicación DelegateExample.

Para esto, necesitamos hacer algunos cambios en los archivos .plist para ambas aplicaciones.

Paso 1

En la aplicación DelegateExample, abra el archivo .plist y agregue Tipos de URL y Esquemas de URL. Aquí necesitamos agregar nuestro nombre requerido como "myapp".

ingrese la descripción de la imagen aquí

Paso 2

En la aplicación PageViewControllerExample, abra el archivo .plist y agregue este código

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

Ahora podemos abrir la aplicación DelegateExample cuando hacemos clic en el botón 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
fuente
Genial, ayuda. Ahora, ¿cómo pasar el argumento de la aplicación de origen a la aplicación de destino?
Vigneswaran A
2

Una nota al margen sobre este tema ...

Hay un límite de 50 solicitudes para protocolos que no están registrados.

En esta discusión, Apple menciona que para una versión específica de una aplicación, solo puede consultar canOpenUrlun número limitado de veces y fallará después de 50 llamadas para esquemas no declarados . También he visto que si el protocolo se agrega una vez que haya entrado en este estado fallido, seguirá fallando.

Tenga en cuenta esto, podría ser útil para alguien.

Duncan Hoggan
fuente
0

Swift 3 versión rápida y pegada de @ villy393 respuesta para:

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