2015-10-21 8 views
15

L'app si arresta in modo anomalo se l'autorizzazione di accesso alle foto non è concessa e l'oggetto che ha chiesto l'autorizzazione sta per deallocare.Interruzione quadro Foto: 'Questa applicazione non è autorizzata ad accedere ai dati della foto.'

Anche il codice di esempio di Apple (per il framework Photos) si interrompe.

mia app si blocca con i seguenti stack trace:

 
*** 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 

Qualsiasi puntatori sarebbe molto apprezzato.

risposta

8

Questo è il comportamento previsto. Prima di utilizzare qualsiasi metodo (come il caricamento, la modifica) di Photos Framework, controllare lo stato dell'autorizzazione nella libreria di foto. Questo viene fatto chiamando il metodo authorizationStatus di PHPhotoLibrary. Se questo metodo è PHAuthorizationStatusNotDetermined, chiedere l'autorizzazione utilizzando il metodo requestAuthorization. Se authorizationStatus ha un valore di PHAuthorizationStatusDenied caduta con garbo. Il punto principale è di lasciare il prompt requestAuthorization per accedere direttamente alla libreria di foto e non ai metodi di recupero.

+9

Grazie. Ora non sto usando nessuna delle API framework Photos senza autorizzazione di accesso. In realtà non stavo recuperando ma ho istanziato PHCachingImageManager senza ottenere il permesso, che sulla deallocazione stava causando un crash. –

+1

@ OFenômeno Grazie mille, un dettaglio così importante. Se la tua app si arresta in modo anomalo quando si torna indietro da un selettore di immagini se viene negata l'autorizzazione, assicurati di NON inizializzare un imageManager prima di controllare il permesso! – TimLR

+0

È necessario verificare sia lo stato 'PHAuthorizationStatusRestricted' (ad esempio Parental Control) che lo stato' PHAuthorizationStatusDenied'. – Rivera

7

Ho avuto la stessa esperienza. Tuttavia, riprodurlo non è stato sufficiente per uscire dal controller della vista e averlo deallocato, ma per simulare l'avviso di memoria nel simulatore. Questo ha costretto l'incidente.

Quindi, la mia soluzione era non utilizzare PHImageManager come variabile globale, ma per accedervi quando necessario. Invece di questo:

private let imageManager = PHImageManager.defaultManager() 
... 
imageManager.requestImageForAsset(....) 

ho fatto come questo, quando aveva bisogno di:

PHImageManager.defaultManager().requestImageForAsset(....) 
+0

Lo sviluppatore dentro di me non ama questa soluzione, ma funziona :) –

1

La mia situazione incidente sta usando PHCachingImageManager come una proprietà.

fileprivate let imageManager = PHCachingImageManager() 

posso risolvere il problema cambiando a pigro var:

fileprivate lazy var imageManager = PHCachingImageManager()