2015-10-21 205 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() 
相關問題