Congelación de iOS8 en

He estado rastreando un error en mi proyecto que está causando que la aplicación se congele, obligando al usuario a reiniciarse.

Solo es posible en la compilation de versiones, por lo que ha sido difícil rastrearlas. Es una aplicación social donde los usuarios cargan fotos en su perfil. El problema se produjo solo en la primera ejecución después de la descarga inicial o después de restablecer la configuration de privacidad, y luego recorrió el flujo para publicar una foto. Durante la publicación, se solicita permiso al usuario para acceder a las fotos y también para acceder a su location.

Después de seleccionar "permitir" en la request de services de location, la aplicación dejó de responder.

Así que mi investigación inicial fue sobre el uso del CLLocationManager, sospeché un problema con las devoluciones de llamada de los delegates.

No pude reproducir con una configuration de debugging, pero podía ejecutar una configuration de liberación en el dispositivo y cuando la aplicación dejaba de responder pausando el depurador, el set de llamada apunta a la biblioteca de Google Analytics.

0 0x37a9fb38 in __psynch_cvwait ()<br> 1 0x37b1c3f8 in _pthread_cond_wait ()<br> 2 0x37b1d2dc in pthread_cond_wait ()<br> 3 0x2aa3b482 in -[__NSOperationInternal _waitUntilFinished:] ()<br> 4 0x29c5799e in _CFXNotificationPost ()<br> 5 0x2a9879b8 in -NSNotificationCenter postNotificationName:object:userInfo: ()<br> 6 0x29a87b96 in -NSManagedObjectContext(_NSInternalAdditions) _didSaveChanges ()<br> 7 0x29a6e12e in -[NSManagedObjectContext save:] ()<br> 8 0x002d2e82 in __21-[GAIDataStore save:]_block_invoke ()<br> 9 0x002d16b8 in -GAIDataStore performBlockAndWait:withError: ()<br> 10 0x002d2dc2 in -[GAIDataStore save:] ()<br> 11 0x002db62a in -[GAIBatchingDispatcher persist:] ()<br> 12 0x002dc7aa in -[GAIBatchingDispatcher queueDispatch:] ()<br> 13 0x002dc5b0 in -[GAIBatchingDispatcher queueModel:] ()<br> 14 0x2aa5259e in __NSThreadPerformPerform ()<br> 15 0x29d0958e in _CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION_ ()<br> 16 0x29d0899e in __CFRunLoopDoSources0 ()<br> 17 0x29d07004 in __CFRunLoopRun ()<br> 18 0x29c55620 in CFRunLoopRunSpecific ()<br> 19 0x29c55432 in CFRunLoopRunInMode ()<br> 20 0x2a98d42c in -NSRunLoop(NSRunLoop) runMode:beforeDate: ()<br> 21 0x2a9db8ec in -NSRunLoop(NSRunLoop) run ()<br> 22 0x002cf270 in +[GAI threadMain:] ()<br> 23 0x2aa5238a in _NSThreadmain_ ()<br> 24 0x37b1ce92 in _pthread_body ()<br> 25 0x37b1ce06 in _pthread_start ()<br> 

El problema solo aparece en iOS8 y estoy ejecutando Google Analytics iOS SDK versión 3.07.

La aplicación está en vivo y GAI se ha integrado durante varios meses antes de que apareciera el error, que fue cuando iOS8 se puso en marcha. Varias publicaciones sobre problemas con la integración de GAI informan sobre problemas para vincular bibliotecas, pero no creo que este sea el caso ya que funciona bien la mayoría de las veces.

Si alguien ha visto algún problema simmular o tiene alguna sugerencia, esto sería útil.

Gracias,

Está escuchando NSManagedObjectContextDidSaveNotification , el SDK de GAI publicará esta notificación y el SDK de GAI está utilizando un coordinador de tienda persistente diferente del suyo, por lo que si GAI SDK publica esta notificación e intenta fusionar la notificación, está combinando cambios de dos persistentes diferentes almacenar, esto puede causar un problema.

La solución es simple, cuando se escucha NSManagedObjectContextDidSaveNotification , solo responde a la notificación que viene de su context de background.
usando el parámetro de object en

 [NSNotificationCenter -addObserver:selector:name:object:] 

solo puede escuchar el context de background, entonces el context GAI no activará una combinación de context.