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

Posted

技术标签:

【中文标题】照片框架崩溃:“不允许此应用程序访问照片数据。”【英文标题】:Photos Framework crash: 'This application is not allowed to access Photo data.' 【发布时间】:2016-01-20 20:46:12 【问题描述】:

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

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

我的应用程序因以下堆栈跟踪而崩溃:

*** 由于未捕获的异常“NSObjectInaccessibleException”而终止应用程序,原因:“不允许此应用程序访问照片数据。” *** 首先抛出调用堆栈: ( 0 核心基础 0x000000010a324f65 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010c030deb objc_exception_throw + 48 2 PhotoLibraryServices 0x000000011c1f7e2d -[PLPhotoLibrary initWithTransientContext:name:] + 1183 3 张照片 0x000000011bd6a445 __30-[phphotoLibrary photoLibrary]_block_invoke + 59 4 libdispatch.dylib 0x0000000110f5e49b _dispatch_client_callout + 8 5 libdispatch.dylib 0x0000000110f49e28 dispatch_once_f + 543 6 张照片 0x000000011bd6a404 -[PHPhotoLibrary photoLibrary] + 140 7 张照片 0x000000011bd3e5e8 -[PHCoreImageManager _cancelAndFlushPreheatItemsForAssets:CLPPrefetching:domain:operation:passingTestHandler:didCancelHandler:] + 174 8 张照片 0x000000011bd5900c -[PHImageManager dealloc] + 176 9 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 10 我的应用程序 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 我的应用程序 0x000000010f271796 _TFC12MyApp16PhotosDataSourceD + 198 15 我的应用程序 0x000000010f2717c2 _TToFC12MyApp16PhotosDataSourceD + 34 16 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 17 我的应用程序 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 我的应用程序 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 核心基础 0x000000010a228d4d -[__NSDictionaryI dealloc] + 141 50 libobjc.A.dylib 0x000000010c044afe _ZN11objc_object17sidetable_releaseEb + 232 51 libobjc.A.dylib 0x000000010c0450b8 _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 488 52 核心基础 0x000000010a2129c6 _CFAutoreleasePoolPop + 22 53 核心基础 0x000000010a246941 __CFRunLoopRun + 2081 54 核心基础 0x000000010a245e98 CFRunLoopRunSpecific + 488 55 图形服务 0x0000000112598ad2 GSEventRunModal + 161 56 UIKit 0x000000010abb8676 UIApplicationMain + 171 57 我的应用程序 0x00000001082b470d 主 + 109 58 libdyld.dylib 0x0000000110f9392d 开始 + 1 59 ??? 0x0000000000000001 0x0 + 1 ) libc++abi.dylib:以 NSException 类型的未捕获异常终止

任何指针将不胜感激。

【问题讨论】:

【参考方案1】:

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

【讨论】:

谢谢。现在我在没有访问权限的情况下不使用任何照片框架 API。实际上我没有获取,但是我在没有获得许可的情况下实例化了 PHCachingImageManager,这在释放时导致了崩溃。 @OFenômeno 非常感谢,如此重要的细节。如果您的应用在权限被拒绝时从图像选择器返回时崩溃,请确保在检查权限之前不要初始化 imageManager! 您应该检查PHAuthorizationStatusRestricted(即家长控制)和PHAuthorizationStatusDenied 状态。 对我来说也一样。当我没有照片访问权限时,在释放 PHCachingImageManager 时崩溃。【参考方案2】:

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

fileprivate let imageManager = PHCachingImageManager()

我通过将其更改为惰性 var 来修复它:

fileprivate lazy var imageManager = PHCachingImageManager()

【讨论】:

这个其实还不错。我还将它设置为惰性,然后在每次使用 imageManager 之前检查权限。如果我没有权限,管理器没有初始化,操作也没有触发【参考方案3】:

我也有同样的经历。但是,要重现,退出视图控制器并释放它是不够的,而是在模拟器中模拟内存警告。这迫使崩溃。

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

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

我在需要时这样做了:

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

【讨论】:

我内心的开发者不喜欢这个解决方案,但它有效:)【参考方案4】:

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

导致崩溃

【讨论】:

【参考方案5】:

对我来说,如果用户没有授予照片权限,但在 ios 13 上工作正常,它会在 11 和 12 版本上崩溃。下面的行是导致问题的原因。

fileprivate var imageManager = PHImageManager() // Crash

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

【讨论】:

以上是关于照片框架崩溃:“不允许此应用程序访问照片数据。”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Photos 框架从 iOS 上的相机胶卷中获取最新照片?

如何在使用照片框架从照片中选择图像时在选择器中隐藏 iCloud 图像

如何使相机可以使用连拍模式

检索照片时相机崩溃

从照片库中选择时,应用程序崩溃 iPhone Sim

firebase 存储 - 使用 android 相机上传照片,但在将照片提交到 firebase 存储时崩溃