カメラ背景利用時、iOS13で”expected the main thread”とかいうエラーにハマる。

“expected the main thread”というエラーメッセージを残し、アプリが息を引きとります。

「まめまき2」というアプリは、背面にカメラ投影画像を利用し
前面にゲーム画面を表示する作りになってる。
ポケモンGoとかでポケモンを捕まえる画面をイメージしてもらうとわかりやすい。
コーディングはCocos2d、iPhoneでのネイティブ言語はObjective-Cを利用してる。
最近このアプリのアップデートをしようと思ってアプリをビルドしiPhone実機で実行した際に上記エラーが出てアプリが落ちる事象に遭遇した。
実機のiOSバージョンはiOS 13にしたとこだった。

自分は、カメラ利用シーンへの変更の際に以下のようにルートビューコントローラを置き換えていた。

[window setRootViewController: cameraViewController];

そしてその後、変数でスタックして置いた元の通常コントローラへ戻すことで切り替えていた。

[window setRootViewController:_viewController];

この際に、当該エラーが発生。
スタックトレースを追っても、アセンブラソース部分ばかりで見るに耐えない。
いろいろ調べたところ、iOS13での画面遷移に関わる変更点が大きく影響していた。

iOS13でpresentViewControllerでの遷移はひとくせあり

というQiita記事にあるとおり、
ImagePickerControllerを利用すると、どうもこの方法が通用しなくなったらしい。

結局のところ、カメラシーンへの切り替えはカメラシーンをpresentViewControllerで重ねるようにした。
ちなみに元のシーンに戻すのはdismissViewControllerAnimatedに変更。

こうすることでとりあえず落ちなくはなったようだ。

ちなみに件名のエラーでググると

dispatch_async(dispatch_get_main_queue()

[NSThread isMainThread]

なんかが多く引っかかってくるがこの辺はCocos2dの深いところで対応のしようがない部分。

cameraViewControllerは、全画面表示したいので以下の指定をしておく。

if (@available(iOS 13.0, *)) {
    [cameraViewController setModalInPresentation:YES];
}
[cameraViewController setModalPresentationStyle:UIModalPresentationFullScreen];

また、以下の記事によるとImagePickerControllerを直接指定するとスワイプダウンでのカメラビューが閉じる事を抑制できないため別のViewControllerを用意し、そのビューにImagePickerControllerを保持させ、カメラビューをそのViewControllerにaddSubViewする事で工夫対応が必要らしいが当方ではこの対応を行わなくても今のところ問題なし。
念のため自分用のメモとして残しておく。

【iOS13】UIImagePickerControllerでisModalInPresentationがtrueでもSwipe Down Closeできることに対する対処法

ついでにいうとAndroidもAPI26からこの辺の対応が必要だった・・・。
それについては別記事に書こうかな、と。
iOSもAndroidもあいかわらず微妙に変化してくる・・・。
これが進歩なのか改悪なのか自分には判断できないが、
そのせいで費やされる開発者の時間は計り知れない・・・。
今回もこの対応にあーでもないこーでもないで、3日くらい使った気がする。

もっとサービスや機能の本質的な部分を作り込みたいのにこうゆうところに時間を費やされるのがつらい。
久しぶりに個人開発者の絶望をとことん味わされた案件だった。

コメントを残す

メールアドレスが公開されることはありません。