照片框架崩溃:'此应用程序不允许访问照片数据。'

时间:2015-10-21 18:10:32

标签: ios exception crash photosframework

如果未授予照片访问权限且请求权限的对象即将解除分配,则应用程序崩溃。

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

任何指针都会非常感激。

5 个答案:

答案 0 :(得分:10)

这是预期的行为。 在使用Photos Framework的任何方法(如获取,更改)之前,请检查Photo-Library的权限状态。这是通过调用(define (sortList lst) (printList '(16 (8 (2 () ()) (10 () ())) (20 (18 () ()) (30 () ()))) (list) ) ) (define (printList lst sorted) ; recur smaller (unless (null? (cadr lst)) (cons (printList (cadr lst) sorted) sorted)) ; debugging... (writeln (car lst)) ; build sorted list (cons (car lst) sorted ) ; recur larger (unless (null? (caddr lst)) (cons (printList (caddr lst) sorted) sorted)) ; return sorted lst sorted ) 的{​​{1}}方法完成的。如果使用此方法authorizationStatus,请使用PHPhotoLibrary方法请求权限。如果PHAuthorizationStatusNotDetermined的值requestAuthorization正在优雅地降低。 重点是让authorizationStatus提示访问Photo-Library而不是直接访问fetch方法。

答案 1 :(得分:7)

我有同样的经历。但是,为了重现它,还不足以退出视图控制器并将其解除分配,而是模拟器中的模拟内存警告。这迫使事故发生。

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

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

我在需要时确实喜欢这样:

PHImageManager.defaultManager().requestImageForAsset(....)

答案 2 :(得分:6)

我的崩溃情况是使用PHCachingImageManager作为属性。

fileprivate lazy var imageManager = PHCachingImageManager()

我通过将其更改为lazy var:

来修复它
{{1}}

答案 3 :(得分:2)

对我来说,如果用户未授予照片权限,但在iOS 13上运行正常,它将在11和12版本上崩溃。

fileprivate var imageManager = PHImageManager() // Crash

fileprivate lazy var imageManager = PHImageManager() // fixed the crash.

答案 4 :(得分:1)

PHImageManager在init时添加一个调度源事件DISPATCH_SOURCE_TYPE_MEMORYPRESSURE。 收到内存警告时,Photos框架将尝试删除此事件处理程序中的缓存数据。那时,如果你有电话但未获得授权,则会导致崩溃

导致崩溃