iOS UIApplication openURL Muy lento

He visto esta pregunta similar: OpenUrl congela la aplicación por más de 10 segundos, pero no está tratando con mi caso de uso específico al cambiar el estado de installation de una segunda aplicación, y ninguna de las soluciones enumeradas allí ha solucionado mi problema, así que estoy abriendo esta pregunta

Breve resumen de la situación simplificada:

Tenemos dos aplicaciones, llamémoslas appA y appB. En appA, tenemos un button que le permite abrir la tienda de aplicaciones para download la aplicación si la aplicación no está instalada, o abrir la aplicación si está instalada. Cada vez que appA se abre / reanuda, comtesting si appB está instalado realizando una [[UIApplication shanetworkingApplication] canOpenURL: <<appB's URL scheme>>] , si el resultado es verdadero, el button appA dice "Open AppB"; de lo contrario, dice "Obtén AppB".

Cuando se toca el button appA, hace canOpenURL: vuelve a verificar, y abre App Store a appB, o abre appB a través de un enlace profundo. Cosas bastante simples. Literalmente, el código es:

 if ( [[UIApplication shanetworkingApplication] canOpenURL:appBDeepLink] ) { [[UIApplication shanetworkingApplication] openURL: appBDeepLink]; } else { [[UIApplication shanetworkingApplication] openURL: appBAppStoreLink]; } 

Todo funciona como se esperaba, sin embargo, si cambia el estado de installation de la aplicación y regresa a la aplicación, la llamada a openURL se congela durante 5-10 segundos la próxima vez que se toca, antes de abrir la URL.

Por ejemplo, aquí hay 2 escenarios para provocar la congelación:

Escenario 1: Instalación de appB

  1. El usuario no tiene appB instalado

  2. El usuario abre appA

  3. El usuario toca "Obtener AppB"

  4. El usuario se lleva a App Store e instala appB

  5. El usuario vuelve a abrir appA (lo lleva a primer plano, nunca se cerró)

  6. appA ve que appB está ahora instalado y cambia su button para "Abrir AppB"

  7. El usuario toca "Abrir AppB"

8. La aplicación se congela durante 5-10 segundos.

  1. appA abre appB

Escenario 2: Desinstalar appB

  1. El usuario tiene appB instalado

  2. El usuario abre appA

  3. El usuario toca "Abrir AppB"

  4. appB se abre

  5. El usuario cierra la aplicación

  6. El usuario desinstala la aplicación

  7. El usuario vuelve a abrir appA (lo lleva a primer plano, nunca se cerró)

  8. appA ve que appB ahora está desinstalada, y cambia su button para "Obtener AppB"

  9. El usuario toca "Obtener AppB"

10. La aplicación se congela durante 5-10 segundos.

  1. appA abre App Store

Parece que una instancia determinada de UIApplication no actualiza su list interna de qué aplicaciones se pueden abrir a través de openURL hasta que la aplicación se termina o se vuelve a abrir, o se vuelve a llamar a openURL y llamar a openURL provoca la congelación, configura que es una list interna de qué aplicaciones se pueden abrir (estoy especulando por completo aquí, no sé cómo funciona esto debajo del capó). Independientemente, la congelación está ahí, y he intentado varias maneras de solucionarlo sin ningún éxito, incluyendo:

  • usando GCD para enviar al hilo principal

  • usando GCD para enviar a un hilo de background

  • realizar la llamada openURL después de una breve demora de 0.1 segundos

  • usando el detachNewThreadSelector de NSThread: toTarget: withObject para realizar la llamada en un hilo diferente

Nada parece funcionar, el retraso siempre está ahí hasta que cierro appB y lo vuelvo a abrir. Buscando en línea, hay algunas publicaciones de Stackoverflow que notan este comportamiento a partir de iOS 7, pero sus soluciones (que son las soluciones que he intentado anteriormente) parecen estar orientadas a la demora general de llamar a openURL desde lugares donde no debería estar ( en la application:didFinishLaunchingWithOptions: por ejemplo), y no he podido encontrar nada específicamente sobre la apertura de una URL después de que una aplicación se instaló o desinstaló.

Puedo reproducir este 100% de las veces en iOS 8.4.

¿Alguien más se topó con esto? ¿Hay alguna solución?