Photos Framework crash: 'This application is not allowed to access Photo data.'
Asked Answered
B

5

20

App crashes if photo access permission is not granted and the object which asked for permission is about to deallocate.

Apple's sample code (for Photos framework) crashes too.

My app crashes with following 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

Any pointers would be really appreciated.

Benghazi answered 21/10, 2015 at 18:10 Comment(0)
C
13

This is expected behaviour. Before you use any methods (like fetching, changing) of the Photos Framework, check the permission status to the Photo-Library. This is done by calling the authorizationStatus method of PHPhotoLibrary. If this method PHAuthorizationStatusNotDetermined,ask for permission using the requestAuthorization method. If authorizationStatushas a value of PHAuthorizationStatusDenied fall gracefully. The main point is to let requestAuthorization prompt for access to the Photo-Library and not the fetch methods directly.

Codeclination answered 23/10, 2015 at 21:54 Comment(4)
Thanks. Now I am not using any of the Photos framework API without access permission. Actually I was not fetching but I instantiated PHCachingImageManager without getting permission, which on deallocation was causing a crash.Profundity
@OFenômeno Thank you so much, such an important detail. If your app crashes while going back from an image picker if permission is denied make sure that you DO NOT initialize an imageManager before checking permission!Heifetz
You should check for both PHAuthorizationStatusRestricted (ie. Parental Controls) and PHAuthorizationStatusDenied status.Atomy
Same for me. Was crashing on deallocation of PHCachingImageManager when I had no Photo Access permission.Heir
G
10

My crash situation is using PHCachingImageManager as a property.

fileprivate let imageManager = PHCachingImageManager()

I fix it by changing it to lazy var :

fileprivate lazy var imageManager = PHCachingImageManager()
Guanidine answered 7/12, 2017 at 2:44 Comment(1)
This is actually pretty good. I also set it to lazy and then checked for permissions every time before I use the imageManager. If I don't have permissions, the manager is not initialized and operations are not triggeredPaleolith
C
9

I had the same experience. However, to reproduce it was not enough to exit the view controller and have it deallocated, but to Simulate Memory Warning in the simulator. This forced the crash.

So, my solution was to not use PHImageManager as a global variable, but to access it when need. Instead of this:

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

I did like this when needed:

PHImageManager.defaultManager().requestImageForAsset(....)
Camus answered 22/9, 2016 at 9:53 Comment(1)
The developer inside me doesn't like this solution, but it works :)Murillo
A
6

PHImageManager add a dispatch source event DISPATCH_SOURCE_TYPE_MEMORYPRESSURE when init. When receive memory warning Photos framework will try to remove cached data in this event handler. At that time, if you have call but not get the authorization, it will cause crash

cause crash

Ardin answered 3/6, 2018 at 6:14 Comment(0)
J
3

For me it was crashing on 11 & 12 versions if user is not giving permissions to photos, but working fine on iOS 13. Below line was causing the issue.

fileprivate var imageManager = PHImageManager() // Crash

fileprivate lazy var imageManager = PHImageManager() // fixed the crash.
Jenelljenelle answered 23/4, 2020 at 8:29 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.