2015-10-21 61 views
15

如果未授予照片访问权限并且请求权限的对象即将释放,则应用程序崩溃。照片框架崩溃:'此应用程序不允许访问照片数据。'

Apple的示例代码(用于Photos框架)也崩溃了。

我的应用程序崩溃与下面的堆栈跟踪:

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

任何指针将非常感激。

回答

8

这是预期的行为。 在使用Photos Framework的任何方法(如获取,更改)之前,请检查照片库的权限状态。这是通过调用PHPhotoLibraryauthorizationStatus方法完成的。如果此方法PHAuthorizationStatusNotDetermined,请使用requestAuthorization方法申请许可。如果authorizationStatus的值为PHAuthorizationStatusDenied优雅地下降。 重点是让requestAuthorization提示访问Photo-Library,而不是直接访问获取方法。

+9

感谢。现在,我没有使用任何没有访问权限的照片框架API。其实我没有抓取,但我实例化PHCachingImageManager没有获得权限,这在解除分配导致崩溃。 –

+1

@OFenômeno非常感谢你,这么重要的细节。如果您的应用在从图像选择器返回时崩溃(如果权限被拒绝),请确保在检查权限之前不要初始化imageManager! – TimLR

+0

您应该检查“PHAuthorizationStatusRestricted”(即父母控制)和“PHAuthorizationStatusDenied”状态。 – Rivera

7

我有同样的经历。然而,重现它是不够的,退出视图控制器并让它解除分配,但模拟器中的模拟内存警告。这迫使这次事故。

所以,我的解决方案是而不是使用PHImageManager作为全局变量,而是在需要时访问它。取而代之的是:

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

我不喜欢这样在需要的时候:

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

我内部的开发人员不喜欢这个解决方案,但它工作:) –

1

我死机的情况是使用PHCachingImageManager作为属性。

fileprivate let imageManager = PHCachingImageManager() 

我,改成懒VAR解决它:

fileprivate lazy var imageManager = PHCachingImageManager() 
相关问题