ios - Bloqueo del marco de fotos: "Esta aplicación no tiene permiso para acceder a datos de fotos".
exception crash (4)
La aplicación falla si no se concede el permiso de acceso a la foto y el objeto que solicitó el permiso está a punto de desasignarse.
El código de ejemplo de Apple (para el marco de fotos) también se bloquea.
Mi aplicación se bloquea con el siguiente seguimiento de pila:
*** Terminating app due to uncaught exception ''NSObjectInaccessibleException'', reason: ''This application is not allowed to access Photo data.'' *** First throw call stack: ( 0 CoreFoundation 0x000000010a324f65 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010c030deb objc_exception_throw + 48 2 PhotoLibraryServices 0x000000011c1f7e2d -[PLPhotoLibrary initWithTransientContext:name:] + 1183 3 Photos 0x000000011bd6a445 __30-[PHPhotoLibrary photoLibrary]_block_invoke + 59 4 libdispatch.dylib 0x0000000110f5e49b _dispatch_client_callout + 8 5 libdispatch.dylib 0x0000000110f49e28 dispatch_once_f + 543 6 Photos 0x000000011bd6a404 -[PHPhotoLibrary photoLibrary] + 140 7 Photos 0x000000011bd3e5e8 -[PHCoreImageManager _cancelAndFlushPreheatItemsForAssets:CPLPrefetching:domain:operation:passingTestHandler:didCancelHandler:] + 174 8 Photos 0x000000011bd5900c -[PHImageManager dealloc] + 176 9 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 10 MyApp 0x000000010f271812 _TToFC12MyApp16PhotosDataSourceE + 66 11 libobjc.A.dylib 0x000000010c02f7bb _ZL27object_cxxDestructFromClassP11objc_objectP10objc_class + 127 12 libobjc.A.dylib 0x000000010c03a390 objc_destructInstance + 93 13 libobjc.A.dylib 0x000000010c03a3c3 object_dispose + 22 14 MyApp 0x000000010f271796 _TFC12MyApp16PhotosDataSourceD + 198 15 MyApp 0x000000010f2717c2 _TToFC12MyApp16PhotosDataSourceD + 34 16 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 17 MyApp 0x000000010f2668f2 _TToFC12MyApp25PhotoPickerViewControllerE + 178 18 libobjc.A.dylib 0x000000010c02f7bb _ZL27object_cxxDestructFromClassP11objc_objectP10objc_class + 127 19 libobjc.A.dylib 0x000000010c03a390 objc_destructInstance + 93 20 libobjc.A.dylib 0x000000010c03a3c3 object_dispose + 22 21 UIKit 0x000000010adb54b9 -[UIResponder dealloc] + 130 22 UIKit 0x000000010ad40721 -[UIViewController dealloc] + 1949 23 UIKit 0x000000010ad1c97b -[UIPresentationController .cxx_destruct] + 262 24 libobjc.A.dylib 0x000000010c02f7bb _ZL27object_cxxDestructFromClassP11objc_objectP10objc_class + 127 25 libobjc.A.dylib 0x000000010c03a390 objc_destructInstance + 93 26 libobjc.A.dylib 0x000000010c03a3c3 object_dispose + 22 27 UIKit 0x000000010ad185db -[UIPresentationController dealloc] + 56 28 UIKit 0x000000010b4a9046 -[_UIFullscreenPresentationController dealloc] + 56 29 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 30 UIKit 0x000000010ad1838c __destroy_helper_block_411 + 24 31 libsystem_blocks.dylib 0x0000000110fdb6b1 _Block_release + 128 32 UIKit 0x000000010b568d9c -[_UIViewControllerTransitionContext .cxx_destruct] + 94 33 libobjc.A.dylib 0x000000010c02f7bb _ZL27object_cxxDestructFromClassP11objc_objectP10objc_class + 127 34 libobjc.A.dylib 0x000000010c03a390 objc_destructInstance + 93 35 libobjc.A.dylib 0x000000010c03a3c3 object_dispose + 22 36 UIKit 0x000000010b567825 -[_UIViewControllerTransitionContext dealloc] + 56 37 UIKit 0x000000010b568e51 -[_UIViewControllerOneToOneTransitionContext dealloc] + 79 38 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 39 MyApp 0x000000010d4818d2 block_destroy_helper + 66 40 MyApp 0x000000010d481988 _TPA__TFFC16MyApp31CustomShrinkAnimator17animateTransitionFS0_FPSo36UIViewControllerContextTransitioning_T_U0_FSbT_ + 152 41 MyApp 0x000000010d481a28 _TPA__TTRXFo_dSb_dT__XFo_iSb_iT__ + 120 42 MyApp 0x000000010d481aed block_destroy_helper8 + 13 43 libsystem_blocks.dylib 0x0000000110fdb6b1 _Block_release + 128 44 UIKit 0x000000010ac5ee47 -[UIViewAnimationBlockDelegate .cxx_destruct] + 43 45 libobjc.A.dylib 0x000000010c02f7bb _ZL27object_cxxDestructFromClassP11objc_objectP10objc_class + 127 46 libobjc.A.dylib 0x000000010c03a390 objc_destructInstance + 93 47 libobjc.A.dylib 0x000000010c03a3c3 object_dispose + 22 48 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 49 CoreFoundation 0x000000010a228d4d -[__NSDictionaryI dealloc] + 141 50 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 51 libobjc.A.dylib 0x000000010c0450b8 _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 488 52 CoreFoundation 0x000000010a2129c6 _CFAutoreleasePoolPop + 22 53 CoreFoundation 0x000000010a246941 __CFRunLoopRun + 2081 54 CoreFoundation 0x000000010a245e98 CFRunLoopRunSpecific + 488 55 GraphicsServices 0x0000000112598ad2 GSEventRunModal + 161 56 UIKit 0x000000010abb8676 UIApplicationMain + 171 57 MyApp 0x00000001082b470d main + 109 58 libdyld.dylib 0x0000000110f9392d start + 1 59 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib: terminating with uncaught exception of type NSException
Cualquier puntero sería realmente apreciado.
Mi situación de bloqueo es usar PHCachingImageManager como una propiedad.
fileprivate let imageManager = PHCachingImageManager()
Lo arreglo cambiándolo a var vago:
fileprivate lazy var imageManager = PHCachingImageManager()
Tuve la misma experiencia. Sin embargo, reproducirlo no fue suficiente para salir del controlador de vista y tenerlo desasignado, sino para simular una advertencia de memoria en el simulador. Esto obligó al choque.
Por lo tanto, mi solución fue no usar PHImageManager como una variable global, sino acceder a ella cuando sea necesario. En lugar de esto:
private let imageManager = PHImageManager.defaultManager()
...
imageManager.requestImageForAsset(....)
Me gustó esto cuando fue necesario:
PHImageManager.defaultManager().requestImageForAsset(....)
PHImageManager
agrega un evento de origen de envío DISPATCH_SOURCE_TYPE_MEMORYPRESSURE cuando se inicia. Cuando reciba una advertencia de memoria, el marco de fotos intentará eliminar los datos almacenados en caché en este controlador de eventos. En ese momento, si tiene una llamada pero no obtiene la autorización, se bloqueará
causar un choque
Este es el comportamiento esperado. Antes de usar cualquier método (como recuperar, cambiar) del Marco de Fotos, verifique el estado de los permisos en la Biblioteca de fotos. Esto se hace llamando al método PHPhotoLibrary
de PHPhotoLibrary
. Si este método PHAuthorizationStatusNotDetermined
, solicite permiso utilizando el método requestAuthorization
. Si PHAuthorizationStatusDenied
tiene un valor de PHAuthorizationStatusDenied
caiga con gracia. El punto principal es permitir que requestAuthorization
el acceso a Photo-Library y no directamente a los métodos de recuperación.