表題の通り。
今まではサクッと表示されていたのですが、最近になって「アルバムが開きません」という問い合わせがあり、調べていたら気付きました。
直接的な情報がなく、解決のために少々ぐるぐるしてたので、同じような人がいたらと思って記事にします。
開発環境(前提条件)
・Xcode13.3
・Swift5
・PhotoLibrary を利用したアプリ独自のアルバム(PHPickerViewController/UIImagePickerViewController ではありません)
発生した問題
問題は初回の認証画面の表示が激遅になっていることです。
やっかいなのが、表示が激遅になっているだけで固まりもせずクラッシュもしないので、ユーザーさんからの指摘があるまで気付きませんでした。
前はそんなことなかったし、関連するコードはいじってなかったので、iOS のどこかのバージョンで挙動が変わったのだと思います。
実際のコードではないですが、だいたいこんな流れで処理してるよってのを載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class SampleViewerController: UIViewController { override func viewDidLoad() { // フォトライブラリへのアクセス許可 PHPhotoLibrary.requestAuthorization(for: .readWrite, handler: { status in // statusに応じて処理を行なう }) // フォトライブラリの変更を監視 PHPhotoLibrary.shared().register(self) } } // MARK: PHPhotoLibraryChangeObserver extension SampleViewerController: PHPhotoLibraryChangeObserver { public func photoLibraryDidChange(_ changeInstance: PHChange) { // フォトライブラリの変更があったら呼ばれる } } |
これ、iOS15.2 未満だと普通に動くのですが、それ以上になると認証画面の表示が激遅になります ヾ( •́д•̀ ;)ノ
ちなみに viewDidLoad の処理に関してはどっちが先でも結果は同じでした。
コンソール画面を確認すると
怒涛のエラーが押し寄せておりました。
[GatekeeperXPC] Got a bind failure for URL file:///var/mobile/Media/, resetting bind state:
[GatekeeperXPC] XPC connection error to assetsd getLibraryServiceWithReply: : Error Domain=com.apple.photos.error Code=41011 “Unauthorized access: client does not have valid TCC authorization” UserInfo={NSLocalizedDescription=Unauthorized access: client does not have valid TCC authorization}
続けて以下のエラー群が押し寄せます。
CoreData: XPC: sendMessage: failed #1
CoreData: XPC: sendMessage: failed #2
CoreData: XPC: Unable to sendMessage: to server
CoreData: XPC: sendMessage: failed #3
・
・
・
CoreData: XPC: sendMessage: failed #10
はじめましてのエラーと量にゲボ吐きそうです
解決した方法
解決方法は簡単で、アクセス認証の許可が下りてから監視することです。
コードとしては以下のような感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class SampleViewerController: UIViewController { override func viewDidLoad() { // フォトライブラリへのアクセス許可 PHPhotoLibrary.requestAuthorization(for: .readWrite, handler: { status in if status == .authorized { // フォトライブラリの変更を監視 PHPhotoLibrary.shared().register(self) } }) } } // MARK: PHPhotoLibraryChangeObserver extension SampleViewerController: PHPhotoLibraryChangeObserver { public func photoLibraryDidChange(_ changeInstance: PHChange) { // フォトライブラリの変更があったら呼ばれる } } |
これだけでログも吐かれず、認証画面もサクッと表示されます。
許可が下りる前から監視すんなってのも分かるんだけれども、認証画面の表示が遅延するのは意地悪すぎませんか。笑
さっさとエラー投げてくれよって感じです ( ˘ω˘ )
さいごに
こういうクラッシュも起きないパターンのやつってマジで気付かん…
報告くれたユーザーさんありがとう!!
コメント