iOS 16でVisionKitに追加されたDataScannerViewControllerについて
VisionKit自体はiOS 13で追加されたフレームワークだが、当時はまだドキュメントをスキャンするためのクラス VNDocumentCameraViewController しか存在しなかった。(それでもだいぶ便利ではあったが)
Visionには毎年機能が追加されるのに、VisionKitはしばらく放置されていたが、iOS 16で久々に新機能が追加された。
文字とコード(QRコードやバーコード)のライブキャプチャ機能を提供するData Scanner機能だ。
要はこんな感じでリアルタイムでOCRしたりコード読み取りしたりする機能を、諸々のUI込みで提供してくれるようになった。
従来機能との違い
なお、文字検出/文字認識、バーコードやQRコードのスキャン機能自体はもっと昔から提供されていた:
コード読み取り
iOS 7から可能。以下にサンプルコードあり:
https://github.com/shu223/iOS7-Sampler#qr-code-reader
QRコードやバーコードの種類は大量にあり、以下を見れば読み取り可能なコードの種類がわかる:
文字検出
iOS 9から可能。以下にサンプルコードあり:
https://github.com/shu223/iOS-9-Sampler#text-detector
文字認識
iOS 13から可能。
https://note.com/shu223/n/ne29345adfa70#b00de45e-7049-4983-8ec1-61d3500263e3
ただし当時は日本語はサポートされていなかった。日本語がサポートされたのはiOS 16から。
DataScannerViewController は何をやってくれるのか
上述の通り、機能としてはコード読み取りも文字検出・認識も従来からあったわけだが、では新機能であるData Scanner (DataScannerViewController その他関連する新API)は何をやってくれるのか。
WWDC22の「Capture machine-readable codes and text with VisionKit」によると以下のUI/UXがDataScannerViewControllerによって提供される。
ライブカメラプレビューとガイダンス
アイテムのハイライト(黄色い枠の部分)
Tap-to-focus
Pinch-to-zoom
これらのものはいずれも従来は自前実装してきたもので、Appleが提供してくれるというのはかなり助かる。
とくにTap-to-focusやPinch-to-zoomはエンドユーザーだけでなく同じ開発チームの非エンジニアからしても「カメラ画面があるのであればできて当然」と考えるが、実はちゃんと自分でつくらないといけない、というストレスがあった。
UIだけでなく内部の実装としても、自前で作ろうするとこれだけのクラスを駆使して実装する必要がある。(撮影機能等はラップして使い回せるので、実際にはここはそれほど大変ではないが。)
後述する通りハイライトの見栄えもカスタマイズできるため、何かを読み取るための画面としては(自前実装よりも)優先的にこちらの利用を検討したいと思った。
最小実装
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/