おそらく、あなたは次の2つの状況のどちらかに当てはまるでしょう。ビジネス上重要なCordovaアプリを引き継いだか、あるいはチームが新しいツールへ徐々に移行する間、安定したハイブリッドアプリを維持している状況です。そこで、在庫ラベル、チケット、小包、棚タグなどをスマートフォンのカメラでスキャンしたいというプロダクト要求が舞い込みます。
そこで重要になるのが バーコードスキャナーCordova の実装です。基本的なデモを作るのは簡単ですが、本番環境への統合はそう簡単ではありません。バーコード形式に適合するプラグインの選定、ネイティブ権限のクリーンな設定、そして実機で初めて発生するプラットフォーム固有の挙動への対応が難所となります。もしアプリが現場作業や在庫フローに関わる場合、スキャン機能は通常、次のような広範な運用課題と結びつきます。 重要なITコンポーネントの管理、そこではモバイルアプリがより大きな資産およびサービスワークフローの一部となります。
Cordova is still a real stack in enterprise maintenance work. By the mid-2010s, barcode scanning in Cordova had already moved beyond toy examples into hybrid enterprise apps built for Android and connected to backend services, including a documented flow using cordova create, cordova platform add android, そして生成された barcodeScanner-debug.apk の実用的なアプリ構築例は SitePointのCordovaスキャン解説にあります。もしチームが長期的なアーキテクチャの選択を検討しているなら、この ネイティブアプリケーション vs Webアプリケーション の比較は、なぜハイブリッドアプリが本格的なモバイルデリバリーのパイプラインに依然として登場するのかを理解する助けになります。
目次
- Cordovaアプリにバーコードスキャナーを追加すべき理由
- Cordovaバーコードスキャナープラグインの選び方
- インストールとプラットフォーム設定
- アプリケーションへのスキャナー実装 Code
- テストと一般的なエラーのトラブルシューティング
- パフォーマンスのヒントと Capacitor への移行
Cordovaアプリにバーコードスキャナーを追加すべき理由
スキャナーの導入は、現場におけるCordovaアプリの可能性を広げます。シリアル番号や注文ID、製品コードを手入力させる代わりに、カメラを入力デバイスとして活用できます。これにより摩擦が軽減されるだけでなく、ユーザーによる入力ミスを決定的に減らすことができます。
実際、バーコードスキャンはモバイルアプリが実業務と接する場面で真価を発揮します。倉庫の検品、小売店での照会、フィールドサービスの部品検証、来客受付、社内資産管理など、あらゆる場面で恩恵を受けられます。また、スキャナーはユーザーの期待値も変えます。カメラが使えるようになると、明確な代替手段がない限り、ユーザーは手動での code 入力を許容しなくなります。
メンテナンスモードでもCordovaは依然として有効
Cordovaが消え去ったかのように語るチームも多いですが、そんなことはありません。Cordovaは、既存アプリの刷新よりも機能拡張の方が容易な、メンテナンス重視のエンタープライズ向けポートフォリオへと進化しました。アプリがすでに認証、同期、フォーム、オフラインストレージを実装しているなら、スキャナーの追加は製品全体を再構築するよりもリスクが低い場合が多いのです。
実践ルール: アプリの他の部分が運用上すでに破綻していない限り、スキャン機能の追加をリライトのきっかけとして捉えないでください。
Cordovaが支持された理由の一つは、プラグインがWebの code から利用できる形でネイティブデバイス機能を公開したことです。だからこそ、ハイブリッドモバイルアプリではバーコードスキャンが一般的になりました。ネイティブ機能をJavaScriptの API の背後に置き、アプリのフローをほぼWebベースのまま保つ。Cordovaが想定していたまさにそのパターンでした。
価値はデモではなくワークフローにある
テキストを返すスキャンボタンは簡単な部分です。本題はその周辺のすべてにあります:
- 対応するシンボロジーの選択: アプリによってはQRだけが必要な場合もあれば、小売や物流向けのコードも必要な場合があります。
- パーミッションの適切な処理: カメラアクセスが一度失敗するだけで、ユーザーは機能が壊れていると判断しがちです。
- スキャン後のアクション設計: ルックアップ、バリデーション、画面遷移、重複処理は、カメラUIよりも重要です。
- モダン化の計画: チームが Capacitor への移行を進めているなら、その機能をCordova特有の前提に縛り付けないアプローチが必要です。
この最後の点は重要です。Cordovaでの初期統合には成功しても、移行時に問題が起きることはよくあります。プラグインの背後でネイティブのレンダリングモデルが変わるからです。スキャナー自体は動作します。ただ、プレビューが期待した場所に表示されないだけです。
Cordova バーコードスキャナープラグインの選び方
アプリの code を書き始める前に、何を最適化すべきかを決めておきましょう。幅広いバーコード対応が必要なチームもあれば、QRコード用のカメラオーバーレイだけで十分なチームもあります。最初に間違ったプラグインを選んでしまうと、リリース後に「別のバーコード形式も追加してほしい」といった要望が出た際、手戻りが発生してしまいます。
多くの開発者が知っているプラグインは cordova-plugin-barcodescannerです。その npm パッケージには、 scan(success, fail) API と、以下の主要なシンボロジーへの対応が記載されています。 QR_CODE, DATA_MATRIX, UPC_A, EAN_13, CODE_128, PDF_417, AZTEC。そのため、単なるQRコード利用だけでなく、小売や物流のシナリオにも適しています。詳細は npm 上のプラグインパッケージドキュメントを確認してください。.
プラグイン戦略をより広範に検討しているチームにとって、 Capacitor プラグインに関する知識の概要は、 従来のCordovaスタイルのプラグインの前提と、新しいネイティブブリッジモデルとの違いを明確に示しているため、非常に有用です。

導入前に検討すべき重要なこと
人気だけで選ばない。スキャン業務の内容から考えましょう。
現場の状況に応じて多様なバーコード規格を読み取る必要があるなら、最小限の API よりも、幅広いシンボルサポートが重要になります。QRコードのチェックイン機能だけで十分なら、カメラ体験がよりスムーズな、対応規格の少ないツールでも問題ありません。ジュニア開発者が陥りがちなミスは、スキャナーの選定を「スキャンできるか」という点だけで判断してしまうことです。本来は「現場で使われているラベルを、回避策なしで正確にスキャンできるか」が重要です。
選定時のチェックリスト例:
- バーコードの対応範囲: 現場で実際に使用されているフォーマットを特定する。
- プラットフォームの要件: プラグインの過去の実績ではなく、現在のチームのサポート状況を確認する。
- UIモデル: ネイティブのスキャンフローを起動するタイプか、アプリ内にプレビューを埋め込むタイプか。
- 移行のしやすさ: 将来的にアプリを Capacitor へ移行する場合、このプラグインがボトルネックにならないかを確認する。
デモでは動くものの、アプリのレイアウトやライフサイクル、移行プロセスに悪影響を与えるプラグインは、避けるべき選択肢です。
プラグイン比較表
| 機能 | phonegap-plugin-barcodescanner | cordova-plugin-qrscanner |
|---|---|---|
| 主な用途 | 多様なフォーマットのバーコードスキャン | QRコードに特化したスキャンフロー |
| API スタイル | 多くのレガシーなCordovaプロジェクトで採用されているコールバックパターン | ライブカメラプレビュー形式のユースケースでよく選ばれる |
| 対応バーコード形式 | QR以外のスキャンも必要な場合に最適 | QRコードのみが必須要件の場合に最適 |
| 移行リスク | 動作は可能だが、モダンなブリッジへの移行時に古い前提条件が問題になる可能性がある | プレビュー重視のアプローチは、レンダリングの問題を早期に発見できる |
| 最適 | 小売、物流、資産管理、および混合バーコードのワークフロー | チェックイン、URL、認証、およびQRコード専用のフロー |
この表はスコアカードではなく、実用的な適合性を示しています。小売や物流のシンボルが必要な場合は、より広範なプラグインカテゴリを選ぶのが通常は安全です。QRコードのみをスキャンし、より制御されたプレビュー体験を求めるなら、QR特化型の方が軽量に済みます。
最もよく見かける間違いは、最初のリリースでQRコードしか必要ないからといってQR特化型のツールを選び、後からUPCやCode 128への対応を無理やり追加しようとすることです。もし業務ユーザーがプリンター、棚、ビン、または出荷書類のラベルをスキャンする可能性があるなら、将来を見据えて今選択してください。
インストールとプラットフォーム設定
統合が失敗するのは、スキャンした後ではなく、通常は最初のスキャン前です。失敗の多くは、JavaScript側の期待値とネイティブプラットフォームの設定との乖離(セットアップドリフト)から発生します。この部分は、単なるクイックインストールではなく、チェックリストとして慎重に取り組んでください。
堅牢な実装フローは、まずプラグインや SDK を追加し、キャプチャコンテキストを作成して、本番環境で使用するコードにシンボロジーを絞り込み、UIを設定した上で、最後にスキャンリスナーを登録することから始まります。この手順は Scandit の SparkScan 用 Cordova ガイドでも推奨されており、ハイブリッドアプリにおいてプロフェッショナルなスキャナー統合をメンテナンス可能な状態に保つための手法として、 Scandit の Cordova バーコードスキャン用開発者ガイドでも説明されています。もしアプリのアーキテクチャが依然としてハイブリッド中心であるなら、こちらの Cordova ハイブリッドアプリ開発 ガイドが役立つはずです。

統合フローから始める
スキャナー機能の実装は、まず以下の項目を決めておくとスムーズに進みます:
- アプリが受け入れるバーコードの種類。
- スキャンが全画面表示のアクションか、あるいは埋め込みワークフローの一部か。
- 読み取り成功後にアプリが実行すべきアクション。
- カメラが使用できない場合のフォールバック手段。
これにより、プラグインのインストールを単なるデバイス機能の追加ではなく、実際のワークフローに紐付けることができます。
Cordovaのインストール手順
一般的なバーコードスキャナープラグインを使用した従来のCordovaセットアップでは、まずパッケージに記載されている標準的なインストールコマンドから開始します。
cordova plugin add cordova-plugin-barcodescanner
一般的なプロジェクトのセットアップ手順は以下の通りです:
cordova create barcodeScannerApp
cd barcodeScannerApp
cordova platform add android
cordova platform add ios
cordova plugin add cordova-plugin-barcodescanner
cordova build android
cordova build ios
この手順はシンプルですが、それだけで終わらせないでください。プラグインのインストール直後にビルドを行い、UIの code を構築する前にネイティブ依存関係の問題を特定しましょう。もしビルドに失敗した場合は、まずその問題を解決してください。
最初にエラーが発生しやすいネイティブ設定
オン iOS、カメラへのアクセス権限をネイティブプロジェクトの設定で適切に宣言する必要があります。権限の使用目的(permission usage description)が不足していたり曖昧だったりすると、ユーザーにとってスキャナーが正常に動作しない機能になってしまいます。アプリがなぜカメラを必要とするのかを説明する、明確なカメラプライバシーの説明を Info.plist に追加してください。
オン Androidインストール後は、マニフェストのエントリやプラグイン関連の権限を確認してください。プラグインが必要な設定を追加する場合もありますが、古いプロジェクトでは、蓄積された設定変更やカスタムGradle設定、プラグインの重複などが原因で、ビルド時の警告や実行時の不具合が発生しがちです。プラグインのインストールが成功したからといって、マニフェストがクリーンであるとは限りません。
このクイックチェックリストを使ってください:
- プラットフォームのバージョンを確認: 古いCordovaプロジェクトには、古いプラットフォームパッケージが残っていることがよくあります。
- 権限プロンプトを確認: 文言と表示タイミングはユーザーの信頼に影響します。
- 早めに実機でテスト: エミュレータではカメラの挙動を十分に確認できません。
- スキャナーの対象範囲を絞る: ワークフローで受け入れる code タイプだけを有効にします。
スキャナーが必要とするフォーマットが1つか2つだけなら、まずはそれらのみを設定してください。広範囲のスキャンは柔軟に思えますが、読み取れないラベルがすべて曖昧になるため、デバッグが遅くなりがちです。
ジュニア開発者が学ぶべき重要な教訓は、「インストールは単なるターミナルコマンドではない」ということです。それはネイティブプロジェクトとの整合性を取ることです。AndroidやiOSが意図通りに設定されていなければ、JavaScriptレイヤーだけではカバーできません。
アプリでのスキャナー実装 Code
プラグインをインストールしてアプリがビルドできたら、最初の実装はあえて地味にしましょう。スキャン処理はボタンに紐づけ、結果はすべてログに出力し、UIを凝る前にコールバックフローが動くことを確認してください。
一般的なCordovaスキャナーのパターンでは、プラグインの scan(success, fail) メソッドを使用します。このコールバック形式は古いものの、レガシーなコードベースでは信頼でき、アプリがPromiseやTypeScriptの抽象化に移行していても後からラップしやすいです。こうしたプロジェクトで Web の code がネイティブの code をどう呼び出すのか、より明確なメンタルモデルが欲しい場合は、 Capacitor が Web とネイティブの code をどう橋渡しするかについての 解説は、たとえ今もCordovaで開発していても役立ちます。

素のJavaScriptの例
古いCordovaアプリ向けの最小実装は次のとおりです:
<button id="scan-button">Scan barcode</button>
<div id="scan-result"></div>
document.addEventListener('deviceready', function () {
var button = document.getElementById('scan-button');
var resultEl = document.getElementById('scan-result');
button.addEventListener('click', function () {
cordova.plugins.barcodeScanner.scan(
function (result) {
if (result.cancelled) {
resultEl.textContent = 'Scan cancelled';
return;
}
resultEl.textContent =
'Text: ' + result.text +
' | Format: ' + result.format;
},
function (error) {
resultEl.textContent = 'Scan failed: ' + error;
}
);
});
});
これは3つの役立つことをします。まず待機処理を行い deviceready、スキャンをユーザーの意図的な操作に紐づけ、成功と失敗の両方を明示的に処理します。キャンセルされたケースを飛ばさないでください。ユーザーはカメラのフローから頻繁に離脱します。
TypeScriptの例
TypeScriptを使用している場合は、アプリの他の部分でクリーンに扱えるよう、戻り値の型を定義しておきましょう:
interface BarcodeScanResult {
text: string;
format: string;
cancelled: boolean;
}
function scanBarcode(): void {
cordova.plugins.barcodeScanner.scan(
(result: BarcodeScanResult) => {
if (result.cancelled) {
renderStatus('Scan cancelled');
return;
}
handleScannedCode(result);
},
(error: unknown) => {
renderStatus(`Scan failed: ${String(error)}`);
}
);
}
function handleScannedCode(result: BarcodeScanResult): void {
renderStatus(`Scanned ${result.format}: ${result.text}`);
if (!result.text) {
renderStatus('Empty scan result');
return;
}
lookupItemByCode(result.text);
}
function renderStatus(message: string): void {
const el = document.getElementById('scan-result');
if (el) el.textContent = message;
}
function lookupItemByCode(code: string): void {
console.log('Lookup code:', code);
}
この実装ではスキャン処理とビジネスロジックを分離しています。スキャナープラグインの役割は入力の取得のみに留め、バリデーションや検索、画面遷移などは別の場所で行うべきだからです。
スキャン結果の活用方法
スキャン後のフローとしては、主に以下のパターンがあります:
- 検索フロー: スキャンしたテキストを使用して、製品、注文、またはアセットのレコードを取得します。
- バリデーションフロー: スキャンした値を、画面上にある期待される code と照合します。
- ナビゲーションフロー: スキャンしたアイテムに関連するタスクへユーザーを遷移させます。
- キャプチャフロー: 後で同期するために、値をローカルに保存します。
スキャナーのコールバックを API 呼び出し、DOM 更新、アナリティクス、ナビゲーションの詰め込み先にしない。値はすぐに渡す。
また、初期テストでは raw 結果をログに残しましょう。本番の UI で必要なのが textだけでも、返される値 format は、ラベルの不一致をデバッグするのに役立ちます。現場から「この code が読み取れない」と言われたら、フォーマット済みデータを見れば、問題がバーコードの品質ではなく種類にあるかどうかがたいてい分かります。
テストと一般的なエラーのトラブルシューティング
多くのバーコードスキャナーに関する Cordova の問題は、スキャン用の API 自体から発生するわけではありません。Web UI、ネイティブビュー、デバイス権限の境界部分で発生します。ここでは、きれいなデモが混乱を招くバグ報告に変わります。
最も診断が難しいのは、Capacitor への移行時や、Cordova と Capacitor を混在させた構成で発生する Android のレンダリングバグです。Capacitor の issue #1213 では、ある開発者が次のように明快に説明しています。 「capacitor アプリでこのプラグインを試しましたが、スキャナーがアプリの背面に隠れてしまっているようです」この修正には、ネイティブ WebView の背景を透明にし、DOM 側の透明度も合わせて変更する必要があります。これは標準的な Cordova のチュートリアルでは通常カバーされていません。詳細は Capacitor の Android レンダリングに関する議論を参照してください。ハイブリッド移行をデバッグしているなら、こちらの Capacitor アプリのデバッグガイド 開いたままにしておく価値があります。
アプリの背後に隠れるAndroidプレビューのバグ
症状
スキャナーを起動します。権限も問題なく、クラッシュも発生しません。しかし、カメラのプレビューが表示されない、遮られている、あるいはアプリのUIの「背後」にあるように見えます。
原因
ネイティブのスキャナービューとWebViewのレイヤー構造が、元のCordovaプラグインの想定と異なっています。CapacitorスタイルのAndroid設定では、WebViewの背景が不透明なままになることがあり、ネイティブのプレビューが存在していてもその下に隠れてしまいます。
ソリューション
両側で透過表示の設定を適用します:
- ネイティブ側: WebViewの背景を透明に設定します。
- Web側: スキャナープレビューの上に重なるコンテナ要素から、不透明な背景を削除します。
- レイアウト面: フルスクリーンのラッパー、モーダルのシェル、フレームワークのページコンテナのデフォルト背景色を確認してください。
- テスト面: 開発用シェルではレイアウトの挙動が正しく表示されないことがあるため、実機のAndroidデバイスで検証してください。
これは、実際にはビューの構成問題であるにもかかわらず、開発者に「プラグインが壊れている」と誤解させてしまうバグです。
権限エラーと誤検知
権限エラーが、スキャナー自体のバグのように見えることがあります。
ユーザーがカメラへのアクセスを拒否した場合、コールバックが汎用的なエラーを返したり、スキャナーが期待通りに表示されなかったりすることがあります。権限の拒否はUIにおける通常の分岐として処理してください。何が起きたのか、アクセスを許可した後にどうやって再試行すればよいのかをユーザーに伝えます。特にiOSでは、不明瞭な権限リクエストのテキストは、ユーザーがスキャナーを見る前に不信感を与えてしまいます。
以下の習慣が役立ちます:
- 明確なユーザーアクションからスキャンを開始する: 権限のプロンプトが不自然に感じられなくなります。
- 代替の入力手段を表示する: 手動入力があれば、ワークフローを止めずに済みます。
- 拒否された場合の挙動とリトライ処理をテスト: 多くのチームは、正常系(ハッピーパス)のテストしか行いません。
Buildおよび実機テストでの問題
特定の環境でしか発生しないエラーもあります。
| 問題点 | 想定される原因 | 実践的な解決策 |
|---|---|---|
| スキャナーは起動するが、有効な結果が返ってこない | サポートされていない、または予期しないバーコード形式 | 設定したユースケースに合致する、既知のラベルでテストしてください |
| プラグインのインストール後にBuildが失敗する | 古いプロジェクトにおけるプラットフォームや依存関係の乖離 | アプリの code を変更する前にプラットフォームパッケージを整合させる |
| あるアプリシェルでは動作するが、別のシェルでは動作しない | レイヤー構造やCSSの干渉を確認する | 画面を最小限のレイアウトまで削ぎ落とし、スタイルを段階的に戻していく |
| エミュレータの挙動が実態と異なる | カメラのシミュレーションが実機の挙動を反映していない | 早い段階で実機のAndroidおよびiPhoneでテストを行う |
デバッグ時はページをボタン1つと結果表示要素1つだけに絞り込みます。そこでスキャナーが動作するなら、問題はプラグインではなく、通常はレイアウトやアプリシェルの code にあります。
パフォーマンスのヒントと Capacitor への移行
バーコードスキャナーは正しくデコードできても、実用面でユーザーを失望させることがあります。多くの場合、ラグ、ちらつき、カメラプレビューの不具合、あるいは同じテスト環境のAndroid端末間でも挙動が異なるといった問題として現れます。
古いCordovaアプリでは、デコーダー自体が弱点であることは稀です。Webviewやビューのレイヤー構造、そしてスキャン結果に反応する code の方が、バーコード認識そのものよりもトラブルの原因になりやすい傾向があります。
まずはスキャン画面のスコープを絞り込むことから始めましょう。在庫ラベルのスキャンが目的であれば、ラベルのスキャンに特化させます。余計なフィルターやアニメーションパネル、広範囲な状態更新は、描画負荷が課題となりやすいAndroid WebViewのレンダリングにさらなる負荷を与えてしまいます。
以下の変更を行うだけで、すぐに効果を実感できるはずです:
- 読み取り可能なバーコード形式を制限する プラグインが対応している場合、形式を絞ることで誤読を減らし、テストカバレッジの検討も容易になります。
- スキャン後のロジックを簡潔に保つ パース、バリデーション、およびUI更新は、可能な限り最小限の範囲に留めます。
- 重複読み取りを一時的にブロックする デバイスによっては、ユーザーがカメラを動かす前に同じ結果を何度も発行してしまうことがあります。
- 手動入力フローを設計に組み込む 実際の現場では、ラベルの破損、照明不足、パッケージの反射などは避けられません。
- Androidの再描画コストを注視する 重いオーバーレイ、CSS transition、レイヤー化されたコンポーネントは、Cordova WebView内のカメラプレビューを不安定にする原因となります。

Capacitor への実践的な移行パス
Cordova から Capacitor への最もクリーンな移行は、一気にではなく段階的に行うことです。アプリのコンテナ、スキャナープラグイン、権限フロー、UIオーバーレイを一度にすべて入れ替えようとすると、どの変更が原因でエラーが発生したのか特定できず、トラブルに陥ります。
代わりに、以下の順序で進めてください:
-
現在のプラグインを監査する
すべてのCordovaプラグインをリストアップし、それぞれを「アクティブ」「置き換え可能」「リスクあり(古いプラットフォームの挙動に依存しているため)」として分類します。 -
まずアプリのシェルを移行する
スキャナーの code を置き換える前に、既存のWebアプリを Capacitor 内で動作させます。これにより、コンテナの問題とプラグインの問題を切り離して管理できます。 -
必要に応じて、移行期間中はCordovaプラグインを維持する
スキャナー、ファイルアクセス、権限処理を同時に書き換えるよりも、一時的な互換性を維持する方が安全な場合が多いです。 -
脆弱なスキャナー機能を早期に置き換える
カスタムオーバーレイ、ドキュメント化されていないAndroidの挙動、または古いカメラ制御に依存している古いプラグインは、優先的に移行すべきです。
Androidのカメラプレビューに関するバグは、デバッグに多大な時間を浪費するため、特に注意が必要です。ネイティブのプレビューがWebViewの背面に隠れてしまったり、端が切れたり、特定のAndroid端末で画面が真っ黒になったりして、スキャナー画面が正常に動作しないケースを何度も見てきました。この場合、根本的な原因はビューの構成(view composition)にあるにもかかわらず、真っ先にバーコードプラグインのせいにされてしまいがちです。
これは単なるスキャナーの調査ではなく、レンダリングの調査として扱うべきです。装飾的なオーバーレイを削除し、ページを「プレビュー」「トリガー」「結果フィールド」の3要素だけに絞り込んでください。これでプレビューが安定するなら、問題はデコードではなく、通常は画面構造やCSSにあります。
Capacitorへの移行が真価を発揮し始めるのも、まさにこの場面です.Capacitorですべてのカメラ関連のバグが解消されるわけではありませんが、ネイティブビューの制御とWeb UIのcodeとの境界を、より明確に分離できます。バーコードスキャンにおいては、 @capgo/camera-preview カスタマイズ可能なコントロールを備えたネイティブオーバーレイとしてライブカメラフィードを表示するため、プレビューがWebViewの背面に隠れることなく、JavaScriptでフレームをデコードできます。Zebraデバイスでのエンタープライズ向けスキャンには、 @capgo/capacitor-zebra-datawedge がDataWedgeプロファイルとスキャントリガーを管理します。NFCタグのワークフローには、 @capgo/capacitor-nfc がiOSおよびAndroidでのネイティブなタグの検出、読み取り、書き込みを処理します。
Cordovaプロジェクトは、プラグインの老朽化やプラットフォームの乖離、古い統合コード内に潜む前提条件によって壊れやすい傾向があります。Capacitorプロジェクトでは、主にライフサイクル管理やネイティブレイヤーに関する異なる問題が発生しますが、ネイティブ側がより明示的であるため、それらの失敗は特定しやすいのが特徴です。
もし現在のCordovaスキャナーが、デバイスごとの修正を積み重ねてようやく動作している状態なら、パッチを当てるのはもうやめましょう。スキャン画面を安定させ、Androidのプレビューバグが本当にWebViewのレイヤー問題なのかを確認した上で、段階的に移行を進めてください。その道のりは最初の1週間こそ遅く感じられますが、プロジェクトの残りの期間においては、結果として最短ルートになります。