#iOS15に上げると印刷を行う処理でアプリがクラッシュするようになった
参考) https://developer.apple.com/forums/thread/689876
UIPrintInteractionControllerを使うことで、iOSのアプリからプリンターに印刷指示を出すことができるようになりますが、iOS15にアップデートするとアプリがクラッシュするようになりました。
UIPrintInteractionControllerでは、
①予め設定しておいたプリンタの情報を渡すことで自動で印刷する方法
②iOS標準のプリンタ設定画面を挟んで、そこで印刷指示する方法
があります。
今回はこの①の場合にクラッシュすることを確認しています。
そこで不本意ではありますが、①→②の方法に変更して一旦凌ぐことにしました。
#実際のコード修正(swift)
①予め設定しておいたプリンタの情報を渡すことで自動で印刷する方法
func print(to printer: UIPrinter, completionHandler completion:
UIPrintInteractionController.CompletionHandler? = nil) -> Bool
↓
②iOS標準のプリンタ設定画面を挟んで、そこで印刷指示する方法
func present(animated: Bool, completionHandler completion:
UIPrintInteractionController.CompletionHandler? = nil) -> Bool
#実際のコード修正(objective-c)
①予め設定しておいたプリンタの情報を渡すことで自動で印刷する方法
- (BOOL)printToPrinter:(UIPrinter *)printer completionHandler:(nullable UIPrintInteractionCompletionHandler)completion;
↓
②iOS標準のプリンタ設定画面を挟んで、そこで印刷指示する方法
// iPhoneの場合
- (BOOL)presentAnimated:(BOOL)animated completionHandler:(nullable UIPrintInteractionCompletionHandler)completion;
// iPadの場合
- (BOOL)presentFromRect:(CGRect)rect inView:(UIView *)view animated:(BOOL)animated completionHandler:(nullable UIPrintInteractionCompletionHandler)completion;
#まとめ
そもそも根本解決できていおらず、緊急措置的な意味合いが強い対応をしました。
修正方法でもっといい方法あるよという情報をお持ちの方はコメントお待ちしています!
#2021/11/10 追記
参考) https://developer.apple.com/forums/thread/689876
に対応策の投稿がありました。
printer.contactPrinter { (available) -> Void in
if (available) {
printController.print(to: printer, completionHandler: printCompletionHandler)
}
}
のように一回 printer.contactPrinter
を挟んでコネクションのチェックをしてOKだったら呼び出す形にするとクラッシュせずに動くようになりました。