2015-10-21 20 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フレームワークの取得(変更)などの方法を使用する前に、Photo-Libraryの権限ステータスを確認してください。これはauthorizationStatusメソッドをPHPhotoLibraryと呼ぶことによって行われます。この方法がPHAuthorizationStatusNotDeterminedの場合は、requestAuthorizationメソッドを使用して許可を求めます。 authorizationStatusの値がPHAuthorizationStatusDeniedの場合は正常に下がります。 主なポイントは、requestAuthorizationが直接フェッチメソッドではなくフォトライブラリへのアクセスを促すことです。

+9

感謝を。今私はアクセス許可なしでPhotosフレームワークAPIを使用していません。実際に私はフェッチしていませんでしたが、PHCachingImageManagerをパーミッションを取得せずにインスタンス化しました。割り当て解除によってクラッシュが発生していました。 –

+1

@OFenômenoありがとう、そのような重要な詳細。権限が拒否された場合、画像ピッカーから戻っている間にアプリがクラッシュした場合は、許可を確認する前にimageManagerを初期化しないでください。 – TimLR

+0

あなたは 'PHAuthorizationStatusRestricted'(すなわちペアレンタルコントロール)と' PHAuthorizationStatusDenied'ステータスの両方をチェックするべきです。 – Rivera

7

私は同じ経験を持っていました。しかし、それを再現するには、View Controllerを終了して割り当てを解除するだけでは不十分でしたが、Simulatorのメモリ警告をシミュレートするだけでした。これはクラッシュを余儀なくされた。

私の解決策はではありませんでした。はグローバル変数としてPHImageManagerを使用しますが、必要に応じてアクセスすることができます。この代わりに:

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

私の中の開発者はこの解決策が嫌いですが、それは動作します:) –

1

私のクラッシュ状況がプロパティとしてPHCachingImageManagerを使用している:

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

必要なときに私はこのようでした。

fileprivate let imageManager = PHCachingImageManager() 

私は怠け者VARにそれを変更することにより、それを修正:

fileprivate lazy var imageManager = PHCachingImageManager()