開発したAndroidアプリをテストする際には、WebView(アプリ内のブラウザ)の動作も確認したいところです。この時、アプリ内でブラウザページのレンダリングを妨げる「ERR_UNKNOWN_URL_SCHEME」エラーに遭遇することが。このエラーが生じると、アプリのユーザー体験(UX)を低下させる可能性があります。
幸い、このエラーの解決方法はシンプル。フロントエンドでは、Chromeの拡張機能を無効にするか、キャッシュをクリアすると解決する可能性が高く、開発者側(バックエンド)では、アプリのコーディングで標準的でないURLを無効にすることで解決します。
今回は、「ERR_UNKNOWN_URL_SCHEME」エラーの概要と原因についてご説明し、フロントエンドとバックエンド両方で解決する方法をご紹介していきます。
「ERR_UNKNOWN_URL_SCHEME」エラーの解決方法について動画での解説もご用意しています。
「ERR_UNKNOWN_URL_SCHEME」エラーとは
「ERR_UNKNOWN_URL_SCHEME」エラーについてご説明する前に、まずはネイティブアプリについて触れておきます。ネイティブアプリとは、特定のオペレーティングシステム向けに設計され、モバイル端末にインストールされるアプリケーションです。
App StoreまたはGoogle Playストアで入手することができます。
現在のモバイルOS市場では、Androidが72%を占めています。したがって、Google Play向けのネイティブアプリを開発するのは良いアイデア。それには、Androidの統合開発環境(IDE)であるAndroid Studioを使用することになります。
アプリを開発する際、埋め込まれたブラウザのコンテンツを利用者が閲覧できるようにすることが重要です。ブラウザとアプリを行ったり来たりする手間を省くことで、より良いUXを実現することができます。
WebViewkクラスを使用すれば、ネイティブアプリから直接ウェブページを表示することができます。検索バーやナビゲーションコントロールなどは表示されませんが、ページは問題なくレンダリングされます。
しかし、このとき「ERR_UNKNOWN_URL_SCHEME」エラーが発生することも。これは、要求されたサイトのURLスキームがモバイル端末で認識できないものであることが考えられます。
「ERR_UNKNOWN_URL_SCHEME」エラーは通常、Chromiumのバグで、Chrome 40以降は頻繁に報告されているエラーです。そして、その原因はさまざまです。
「ERR_UNKNOWN_URL_SCHEME」エラーの原因
WebViewは、ネイティブアプリに便利な機能ですが、数種類のURLスキームしか処理することができません。URLスキームとは、URLの種類を識別するための要素です。
標準的なURLスキームは、「https://」と「http://」。以下のURLスキームは、「ERR_UNKNOWN_URL_SCHEME」エラーを引き起こす可能性があります。
-
- mailto://
- whatsapp://
- file://
- telnet://
- intent://
- market://
- app://¥
- mail://
- buy://
上記のようなURLスキームでエラーが発生しないようにするには、アプリ開発者が特定のコーディングを行わなければなりません。そうでなければ、利用者がネイティブアプリでWebViewを使用できなくなります。
また、ユーザーがリダイレクトされたURLを開こうとしたり、独自のChromeカードでOAuth認証をしたりしても、このエラーが発生することがあります。
「ERR_UNKNOWN_URL_SCHEME」エラーを解決するには(8つの方法)
「ERR_UNKNOWN_URL_SCHEME」エラーは、アプリのWebViewがブラウザのページを適切に表示されないことを意味します。このエラーが発生すると、アプリ利用者は正しいコンテンツを閲覧することができなくなります。
開発者であっても、アプリユーザーであっても、このエラーの解決策はいくつかあります。以下、8種類の解決策をご紹介していきます。
1. Chromeの拡張機能を無効にする
まずは、フロントエンド(アプリユーザー)での解決方法から。多くのChromeエラーは、ブラウザの拡張機能を無効にすることで解決することができます。ウィンドウ右上の縦3点リーダーを開いて、「その他のツール」>「拡張機能」に移動するか、「chrome://extensions/」を検索してください。
「拡張機能」ページには、インストールされているChromeの拡張機能が一覧表示されます。右下にあるトグルスイッチをクリックして、すべての拡張機能を無効にします。
すべてを無効にしたら、エラーが解消されているかを確認しましょう。エラーが消えた場合は、いずれかの拡張機能が原因になっていることがわかります。
その場合、拡張機能を1つずつ有効にして、その都度エラーが再発するかを確認し、原因となっているものを特定しましょう。特定したら、その拡張機能は削除することをおすすめします。
2. ChromeのキャッシュとCookieを削除する
インターネットを閲覧する際、ブラウザはウェブサイトからのデータをキャッシュに保存します。これによって、2回目の訪問時の処理がより高速になりますが、キャッシュデータが破損してしまうこともあります。
拡張機能が原因でなかった場合は、ブラウザキャッシュをクリアしてみてください。Google Chromeで、「その他のツール」>「閲覧履歴を消去」に移動します。
ポップアップウィンドウで、「キャッシュされた画像とファイル」を選択します。また、必要に応じて「閲覧履歴」や「Cookieと他のサイトデータ」も削除可能です。
データを削除したら、該当のページを再読み込みして、エラーが消えているかどうかを確認しましょう。
3. ハードウェアアクセラレーションを無効にする
ハードウェアアクセラレーションは、使用しているデバイスのハードウェアを使ってブラウザのパフォーマンスを高めること。Google Chromeでは、デバイスの画像処理装置(GPU)が、ゲームや動画の再生など、重いグラフィックを伴うタスクを処理するようになります。
ほとんどの場合、ハードウェアアクセラレーションによって、ソフトウェアがサポートするよりも複雑なタスクをChromeで実行できるようになりますが、遅延やフリーズ、クラッシュを引き起こす可能性も。
したがって、ハードウェアアクセラレーションを無効にすることも解決策になり得ます。Chromeの「設定」ページを開き、「システム」タブに移動しましょう。
「ハードウェア アクセラレーションが使用可能な場合は使用する」のトグルスイッチをクリックして、無効にします。その後、Chromeを再起動してください。
4. ファイアウォールを無効にする
「ERR_UNKNOWN_URL_SCHEME」エラーのもう1つの原因は、ファイアウォールの設定。まだエラーが解決できていない場合は、お使いのデバイスのファイアウォールを一時的に無効化しましょう。
Macの場合は、アップルメニューをクリックして「システム環境設定」を開きます。
「セキュリティとプライバシー」>「ファイアウォール」タブに移動して、左下の鍵のアイコンを解除し、「ファイアウォールをオフにする」をクリックして無効化します。
Windowsの場合は、「スタート」>「設定」を開きます。次に、「プライバシーとセキュリティ」>「Windows セキュリティ」>「ファイアウォールとネットワーク保護」に移動しましょう。
「ドメインネットワーク」、「プライベートネットワーク」、「パブリックネットワーク」のいずれかを選択し、「Microsoft Defender ファイアウォール」をオフにします。
セキュリティポップアップが表示されたら、「OK」をクリックして変更を保存してください。
5. Chromeユーザープロファイルを作成する
まだエラーが解消されない場合は、Chromeで新たなユーザープロファイルを作成し、ページにアクセスできるかを確認してみてください。
Chromeでは、プロファイルを簡単に編集することができます。ウィンドウ右上に表示されるプロフィール画像をクリックし、「+追加」をクリックします。
新たにプロファイルを設定し、既存のChromeアカウントにログインするか、「アカウントなしで続行」をクリックします。
ブラウジングを始める前に、プロファイルに名前をつけたり、配色を変更したりすることができます。
これで、他のアカウントとは独立したプロファイルが設定できます。これで、目的のページにアクセスし、エラーが表示されるかどうかを確認します。エラーが消えない場合は、アプリの開発元に連絡を取るのが得策です。
6. URLを新規ウインドウで開く
以上が、アプリユーザーが行える解決策でした。アプリ開発者側では、このエラーをトラブルシューティングし、エラーの発生しないWebViewの扱い方を把握しておくことが重要です。
簡単な解決方法は、URLのhrefコードを編集すること。アプリのHTMLにtarget属性を含めることで、ブラウザをどのように開くかを指定することができます。
例えば、HTMLコード「target=”_blank”」を追加すると、WebViewが新規ウィンドウで開かれます。この例は以下の通り。
<a href="https://www.w3schools.com" target="_blank">W3Schoolsに移動する</a>
ただし、これで一時的にエラーを解決することができても、アプリのユーザー体験(UX)を損なう可能性があります。ウェブ開発において、新規ウィンドウでリンクを開くのは、ベストプラクティスとは言えません。
上記のコードでは、「戻る」ボタンが表示されなくなるため、前のページに戻りたい場合にユーザーが困ってしまう可能性があります。
7. インテントを追加する
Android開発者であれば、インテントの使用が必須です。基本的に、インテントにはアプリに実行させたい動作が記述されています。URLスキームのエラーを解決するために、外部アプリでコンテンツを読み込むインテントを含めることも。
例えば、「maps://」というURLスキームで、デフォルトの地図アプリを開きたいとします(あるいは「mailto://」でメールアプリを開く)。
インテントを新規追加するには、IFステートメントを使って、関連する外部アプリの特別なスキームを開くようにデバイスに指示します。また、「https://」や「http://」のような標準的なURLスキームは、通常通り開くことができます。
このインテントを実行すると、以下のようになります。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url == null || url.startsWith("http://") || url.startsWith("https://")) {
return false;
}
try {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
view.getContext().startActivity(intent);
return true;
} catch (Exception e) {
Log.i(TAG, "shouldOverrideUrlLoading Exception:" + e);
return true;
}
}
特定の外部アプリには、独自のインテントを追加します。ユーザーをインストールしたWhatsappに誘導する場合、URLのオーバーライドは、以下のように変更します。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
if (url.startsWith("whatsapp://")) {
webview.stopLoading();
try {
Intent whatsappIntent = new Intent(Intent.ACTION_SEND);
whatsappIntent.setType("text/plain");
whatsappIntent.setPackage("com.whatsapp");
whatsappIntent.putExtra(Intent.EXTRA_TEXT, webview.getUrl() + " - Shared from webview ");
startActivity(whatsappIntent);
} catch (android.content.ActivityNotFoundException ex) {
String MakeShortText = "Whatsapp has not been installed";
Toast.makeText(WebactivityTab1.this, MakeShortText, Toast.LENGTH_SHORT).show();
}
};
};
これによって、ユーザーの端末でアプリがWhatsappを開くことができるように。インストールされていない場合は、「Whatsappがインストールされていません」というメッセージがトースト表示されます。
8. 標準的でないURLスキームを無効にする
インテントを使用する代わりに、標準的でないURLスキームを無効にしてしまうという方法も。これによって、「http://」と「https://」以外のURLスキームが使用できなくなります。
HTMLでの実装方法は、以下の通りです。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
if (url.startsWith("http") || url.startsWith("https")) {
return true;
}else {
webview.stopLoading();
webview.goBack();
Toast.makeText(MainActivity.this, "Error: Unknown link type", Toast.LENGTH_SHORT).show();
}
return false;
}
ユーザーがカスタムURLスキームを使用したリンクをクリックすると、「Error: Unknown link type(不明なリンクタイプ)」というメッセージがトースト表示されます。アプリのWebViewでカスタムURLスキームをサポートしないことで、エラーを完全に回避することができます。
まとめ
ネイティブアプリでは、アプリ内で外部リンクを開けるようにしたいもの。要求されたサイトに既知のURLスキームがない場合、モバイル端末が「ERR_UNKNOWN_URL_SCHEME」エラーを返します。
フロントエンドでは、Chromeでハードウェアアクセラレーションを無効化したり、新たなユーザープロファイルを作成したりすることで解決できます。とは言え、ほとんどの場合は、アプリ開発者側での解決が必要になります。インテントを追加するか、URLを新規ウィンドウで開くようにすることで、エラーを解消してみてください。
アプリ開発では、信頼性の高い安定したホスティングを利用することが重要です。Kinstaのアプリケーションホスティングでは、25箇所のデータセンターと24時間年中無休のチャットサポートを提供。開発作業が大幅に捗ります。