Application.OpenURLとは?
Application.OpenURLは、Unityで外部のURLを開くためのメソッドです。
引数に渡したURLを、その端末のデフォルトのアプリケーションで開いてくれます。
例えばhttpsから始まるURLを渡すと、端末のブラウザが起動してそのページを表示します。
using UnityEngine;
public class OpenUrlSample : MonoBehaviour
{
// 公式サイトをブラウザで開く
public void OpenWebSite()
{
Application.OpenURL("https://garnetcode.jp/");
}
}
「公式サイトへのリンク」や「SNSへの誘導」など、アプリの外に飛ばしたい場面で活躍します。
基本的な使い方
Application.OpenURLはstaticメソッドなので、どこからでも呼び出すことが出来ます。
UIのButtonのクリックイベントに紐づけて使うのが一般的です。
using UnityEngine;
using UnityEngine.UI;
public class LinkButton : MonoBehaviour
{
[SerializeField] private Button _button;
private void Start()
{
// ボタンが押されたら公式サイトを開く
_button.onClick.AddListener(() => Application.OpenURL("https://garnetcode.jp/"));
}
}
なお、渡せるのはhttpsのWebページだけではありません。
次のように、特定の用途を持つスキームを渡すことも出来ます。
// メールアプリを起動して宛先を入力した状態にする
Application.OpenURL("mailto:support@xxxxxxxx.com");
// 電話アプリを起動して番号を入力した状態にする(モバイル端末)
Application.OpenURL("tel:0312345678");
mailto:はメールアプリ、tel:は電話アプリといったように、スキームによって起動するアプリが変わります。
SNSアプリをURLスキームで開く
X(旧Twitter)やInstagramといったSNSは、専用のアプリを直接起動するためのURLスキームを公開しています。
例えばXならtwitter://、Instagramならinstagram://といったスキームです。
これらを渡すと、端末にアプリがインストールされている場合にそのアプリが直接起動します。
// Xのアプリで特定ユーザーのプロフィールを開く
Application.OpenURL("twitter://user?screen_name=xxxxxxxx");
// Instagramのアプリで特定ユーザーのプロフィールを開く
Application.OpenURL("instagram://user?username=xxxxxxxx");
ただし、ここで一つ問題があります。
URLスキームは「対応するアプリがインストールされていること」が前提です。
アプリが入っていない端末でこれを呼ぶと、何も起こらなかったり、エラーになったりします。
フォールバックを用意する
そこで、アプリ用のスキームを直接呼ぶのではなく、httpsのWeb版URLにフォールバックする考え方が安全です。
httpsのURLであれば、対象アプリがUniversal Links(iOS)やApp Links(Android)に対応していればアプリで開き、未対応や未インストールならブラウザで開きます。
using UnityEngine;
public class SnsLink : MonoBehaviour
{
// Web版のURLを渡しておく
// アプリがUniversal Links/App Linksに対応していればアプリ、そうでなければブラウザで開かれる
public void OpenTwitter()
{
Application.OpenURL("https://x.com/xxxxxxxxxxxxx");
}
public void OpenInstagram()
{
Application.OpenURL("https://www.instagram.com/xxxxxxxxxxxxx/");
}
}
特に理由がなければ、まずはhttpsのWeb版URLを渡しておくのが無難です。
どうしてもアプリを直接起動したい場合のみ、専用スキームを使うとよいでしょう。
iOSとAndroidでの挙動の違い
Application.OpenURLの内部の動きは、iOSとAndroidで異なります。
それぞれのプラットフォームで注意すべき点があるので、順番に見ていきましょう。
Androidの場合
Androidでは、URLを渡すと暗黙的Intent(Implicit Intent)が発行されます。
OSがそのURLを処理できるアプリを探し、該当するアプリが見つかればそれを起動します。
httpsのURLであれば、ブラウザや対応アプリが候補となり、複数あればアプリの選択ダイアログが表示されることもあります。
対応するアプリが一つも見つからない場合は、何も起こらずに処理が終わります。
iOSの場合
iOSでは、内部的にUIApplicationのopenURLが呼ばれます。
httpsやmailto:などの標準的なスキームはそのまま開けます。
一方、twitter://のようなカスタムURLスキームで他のアプリを開く場合は注意が必要です。
iOSでは、canOpenURLでアプリの有無を事前に確認する場合、問い合わせるスキームをInfo.plistのLSApplicationQueriesSchemesに登録しておく必要があります。
Application.OpenURLで開くだけなら登録は必須ではありませんが、対象アプリが入っていなければ開けずに終わる点は変わりません。
この点からも、可能であればhttpsのURLでフォールバックしておく方が扱いやすいです。
アプリ未インストール時の挙動
カスタムスキーム(twitter://など)を渡したとき、対応するアプリが入っていないとどうなるかはプラットフォームによって変わります。
多くの場合、何も起こらずに無反応となります。
そのため、ユーザーから見ると「ボタンを押したのに反応しない」という状態になりかねません。
繰り返しになりますが、httpsのWeb版URLを渡しておけば、アプリが無くてもブラウザで開けるため、こうした無反応を避けられます。
実践的なユースケース
Application.OpenURLは、アプリの外への導線を作りたい場面で幅広く使えます。
ここでは代表的なユースケースを紹介します。
公式サイトやSNSへの誘導
タイトル画面や設定画面に、ゲームの公式サイトやX、Instagramへのリンクボタンを置くケースです。
前述の通り、httpsのURLを渡すのが基本となります。
// 公式サイトへ
Application.OpenURL("https://xxxxxxxx.jp/");
// X(旧Twitter)へ
Application.OpenURL("https://x.com/xxxxxxxx");
ストアレビューへの誘導
「レビューを書く」ボタンから、アプリストアのページを直接開く使い方も定番です。
AndroidのGoogle Playであれば、ストアアプリで直接開くためのmarket://スキームが使えます。
// Google Playのアプリページを開く(パッケージ名を指定)
Application.OpenURL("market://details?id=com.example.app");
// App Storeのアプリページを開く(アプリIDを指定)
Application.OpenURL("https://apps.apple.com/app/id1234567890");
Google Playはmarket://が使えますが、こちらもアプリ未インストール時を考慮するならhttps://play.google.com/store/apps/details?id=...のWeb版URLにしておくと安全です。
SNSシェアの誘導
あらかじめ本文を入れた状態で投稿画面を開く、といったシェア誘導にも使えます。
Xの場合、intent用のURLにパラメータを付けることで、投稿テキストを事前に入力した状態で開けます。
using UnityEngine;
public class ShareSample : MonoBehaviour
{
public void ShareToTwitter()
{
// 投稿テキストをURLエンコードして渡す
string text = UnityEngine.Networking.UnityWebRequest.EscapeURL("ゲームをプレイ中! #Unity");
Application.OpenURL($"https://x.com/intent/tweet?text={text}");
}
}
テキストにスペースや日本語、記号が含まれる場合は、UnityWebRequest.EscapeURLなどでURLエンコードしてから渡しましょう。
気をつける点
Application.OpenURLは手軽ですが、いくつか押さえておきたい点があります。
一つ目は、開いた結果を取得できないことです。
このメソッドは戻り値がvoidで、URLが正常に開けたかどうかを返してくれません。
そのため「アプリが無くて開けなかった」といったケースを検知できず、フォールバックを意識した設計が重要になります。
二つ目は、WebGLでの挙動です。
WebGLビルドでは、Application.OpenURLは別タブやポップアップウィンドウでページを開こうとします。
しかしブラウザのポップアップブロックによって、ユーザー操作を伴わない呼び出しがブロックされることがあります。
まとめ
今回はApplication.OpenURLを使って外部URLやアプリを開く方法を紹介しました。
httpsのURLを渡せばブラウザが、mailto:やtel:を渡せば対応するアプリが起動します。
SNSアプリを開きたい場合はtwitter://のようなカスタムスキームも使えますが、アプリ未インストール時に無反応になりやすい点には注意が必要です。
Androidは暗黙的Intent、iOSはカスタムスキームのInfo.plist登録が必要、といったプラットフォームごとの差もあります。
迷ったときは、アプリにもブラウザにも対応できるhttpsのWeb版URLを渡しておくのが、もっとも扱いやすく安全な選択肢です。
公式サイトへの導線やストアレビューの誘導など、活躍の場は多いので、ぜひ取り入れてみてください。