2015-10-21 5 views
15

App stürzt ab, wenn die Fotozugriffsberechtigung nicht erteilt wurde und das Objekt, für das um Erlaubnis gefragt wurde, die Zuordnung aufheben wird.Fotos Framework-Absturz: 'Diese Anwendung darf nicht auf Fotodaten zugreifen.'

Apples Beispielcode (für Photos Framework) stürzt auch ab.

Meine app stürzt mit folgenden 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 

Alle Zeiger würde wirklich geschätzt.

Antwort

8

Dies ist das erwartete Verhalten. Bevor Sie eine der Methoden (wie zum Beispiel das Abrufen oder Ändern) des Photos-Frameworks verwenden, überprüfen Sie den Berechtigungsstatus für die Fotobibliothek. Dies geschieht durch Aufruf der authorizationStatus Methode von PHPhotoLibrary. Wenn diese Methode PHAuthorizationStatusNotDetermined ist, fragen Sie nach der Erlaubnis mit der requestAuthorization Methode. Wenn authorizationStatus hat einen Wert von PHAuthorizationStatusDenied fallen würdevoll. Der Hauptpunkt ist requestAuthorization Aufforderung für den Zugriff auf die Fotobibliothek und nicht die Abrufmethoden direkt.

+9

Dank. Jetzt verwende ich keine der Photos Framework API ohne Zugriffsrechte. Eigentlich habe ich nicht geholt, aber ich habe PHCachingImageManager instanziert, ohne eine Erlaubnis zu bekommen, was bei der Freigabe einen Absturz verursacht hat. –

+1

@ OFenômeno Vielen Dank, so ein wichtiges Detail. Wenn Ihre App beim Zurückgehen von einer Bildauswahl abstürzt, wenn die Berechtigung verweigert wird, stellen Sie sicher, dass Sie einen imageManager NICHT initialisieren, bevor Sie die Berechtigung prüfen! – TimLR

+0

Sie sollten sowohl den Status PHAuthorizationStatusRestricted (dh die Kindersicherung) als auch den Status PHAuthorizationStatusDenied überprüfen. – Rivera

7

Ich hatte die gleiche Erfahrung. Die Reproduktion war jedoch nicht ausreichend, um den View-Controller zu verlassen und die Zuordnung aufzuheben, sondern Simulator Memory Warning im Simulator zu simulieren. Dies erzwang den Absturz.

Also, meine Lösung war nicht PHImageManager als globale Variable verwenden, aber auf sie zugreifen, wenn es nötig ist. Statt dessen:

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

ich so tat, als benötigt:

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

Der Entwickler in mir mag diese Lösung nicht, aber es funktioniert :) –

1

Meine Crashsituation PHCachingImageManager als Eigenschaft verwendet.

fileprivate let imageManager = PHCachingImageManager() 

ich das Problem beheben, indem sie es zu faul var zu ändern:

fileprivate lazy var imageManager = PHCachingImageManager() 
Verwandte Themen