El lanzamiento de la aplicación con la URL (a través de UIApplicationDelegate handleOpenURL) que trabaja bajo el IOS 4, pero no bajo iOS 3.2

StackOverflow https://stackoverflow.com/questions/3612460

Pregunta

Me han puesto en práctica de UIApplicationDelegate

application:didFinishLaunchingWithOptions:

y

application:handleOpenURL:

según la especificación, es decir,

application:didFinishLaunchingWithOptions:
returns YES 

y

application:handleOpenURL: opens the URL. 

Las obras código bajo iOS 4 (en ambos casos, es decir, cuando se inicia la aplicación y cuando se convierte en activo desde el estado suspendido). Sin embargo, el código no funciona bajo iOS 3.2.

¿Fue útil?

Solución

Me dan una respuesta a mi propia pregunta. Averiguar la solución me llevó un tiempo y fue muy frustrante. Si lo hace algún buscador de Internet a encontrar algunas respuestas parciales, pero todavía me tomó un tiempo para el trabajo a cabo la siguiente solución y espero que añade un poco de claridad.

Así que, primero, el comportamiento recomendado de su aplicación parece ser el siguiente (ver apertura Tipos de archivo compatibles en iOS Ref Lib):

  • No aplicar applicationDidFinishLaunching: (véase la nota al UIApplicationDelegate )
  • Implementar application:didFinishLaunchingWithOptions: y compruebe la URL, SÍ retorno si se puede abrir, de lo contrario no, pero no abrirlo.
  • Implementar application:handleOpenURL: y abrir la URL, el retorno SÍ si tiene éxito, de lo contrario NO.

En iOS 4, el paso de una dirección URL a un resultado de la aplicación en uno de los dos comportamientos siguientes:

  • Si la aplicación se inicia a continuación application:didFinishLaunchingWithOptions: se llamó y se llama application:handleOpenURL: si application:didFinishLaunchingWithOptions: y regresó SÍ.
  • Si la aplicación se está convirtiendo en activo desde estado suspendido luego application:didFinishLaunchingWithOptions: no se llama, pero application:handleOpenURL: se llama.

Sin embargo, en IOS 3.2 parece como si nunca se application:handleOpenURL: se llama! Un indicio de que el comportamiento es diferente bajo iOS 3.2 se puede encontrar en manejo de solicitudes de URL . Allí se encuentran que se llama application:handleOpenURL: si application:didFinishLaunchingWithOptions: no está implementado, pero se implementa applicationDidFinishLaunching:. Pero application:handleOpenURL: no se llama si se implementa application:didFinishLaunchingWithOptions:.

Por lo tanto, una solución para hacer que el código bajo 3.2 y 4.0 es:

  • Abrir la URL en application:didFinishLaunchingWithOptions:, pero luego regresan NO para evitar que se llama application:handleOpenURL:.
  • Abrir la URL en application:handleOpenURL:, en caso de que usted es menor de 4,0 y la aplicación fue en estado de suspensión.

He encontrado esta solución en otro post, pero yo estaba confundido, ya que contradice la recomendación en la documentación IOS Ref Lib (es decir, que debemos volver SI en application:didFinishLaunchingWithOptions:). (En ese momento no me di cuenta de que la documentación contradice auto-).

Creo que el comportamiento actual de iOS 4.0 será el comportamiento futuro prefiero la siguiente solución:

  • No aplicar applicationDidFinishLaunching:.
  • Implementar application:didFinishLaunchingWithOptions: y compruebe la URL, SÍ retorno si se puede abrir, de lo contrario no, pero no abrirlo. Si estamos en 3.2, abra la URL.
  • Implementar application:handleOpenURL: y abrir la URL, el retorno SÍ si tiene éxito, de lo contrario NO.

Así que en resumen, puedo implementar el comportamiento IOS 4 y añade la siguiente línea al application:didFinishLaunchingWithOptions:

    if([[[UIDevice currentDevice] systemVersion] hasPrefix:@"3.2"]) {
        [self application:application handleOpenURL:url];
    }

que hacen que el código funcione en el punto 3.2.

Otros consejos

application:handleOpenURL: ahora es obsoleto.

A partir de iOS 4.2, puede utilizar esto para las direcciones URL de apertura:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
        sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

Documentación:

https://developer.apple .com / biblioteca / ios / # de documentación / UIKit / Referencia / UIApplicationDelegate_Protocol / Referencia / reference.html

Me empezó a escribir aplicación que utiliza la API de Dropbox. Para entender el concepto, me encontré con una aplicación de ejemplo usando mi clave / secreta mencionó en dropbox / desarrollador documentación . Una vez que comenzó a trabajar aplicación de ejemplo, he utilizado mismos valores clave / secretos para mi aplicación.

Para aplicación de ejemplo, la implementación de handleOpenURL (o openURL en IOS 4.2) es ejecutado como se esperaba. Por alguna extraña razón, no fue el caso para mi aplicación. Mi aplicación entró fondo con el fin de mostrar la pantalla de inicio de sesión y la página de autenticación de Dropbox. Después de iniciar la sesión correctamente y autenticación, mi aplicación nunca entró en primer plano. Era cierto tanto para la plataforma y el dispositivo simulador (IPAD)

He intentado casi todo lo que aparece en internet, incluyendo este post. Gracias. No hubo éxito, sin embargo.

En el último, que EN MARCHA a trabajar para mi aplicación cuando lo hice siguiente:

  • En el simulador, seleccione. "Simulador de iOS -> Restablecer contenidos y ajustes", y restablecer
  • En el dispositivo, suprimí aplicación de ejemplo relacionado ejecutable y que a su vez caché de eliminación asociada a la misma.

Añadir lo siguiente al final de application:DidFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ...    

    NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    if (url != nil && [url isFileURL]) {
        return YES;
    }  else return NO;
} // End of application:didFinishLaunchingWithOptions:

// New method starts 
-(BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    mvc = [nc.viewControllers objectAtIndex:0];
    if (url != nil && [url isFileURL]) {
        [mvc handleOpenURL:url];
    }
    return YES;
}

donde MVC es mi principal ViewController, y nc mi controlador de navegación.

A continuación, en el MainViewController, hacer algo como esto:

- (void)handleOpenURL:(NSURL *)url {
    [self.navigationController popToRootViewControllerAnimated:YES];

    // Next bit not relevant just left in as part of the example
    NSData *jsonData = [NSData dataWithContentsOfURL:url];        
    NSError *error;
    NSDictionary *dictionary = [[NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error] objectAtIndex:0];
    [self managedObjectFromStructure:dictionary withManagedObjectContext:self.context];
    ...
}

después de declarar handleOpenURL en el .h por supuesto.

Gracias a Christian va a poner en el esfuerzo para esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top