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.OpenURLstaticメソッドなので、どこからでも呼び出すことが出来ます。

UIButtonのクリックイベントに紐づけて使うのが一般的です。

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の内部の動きは、iOSAndroidで異なります。

それぞれのプラットフォームで注意すべき点があるので、順番に見ていきましょう。

Androidの場合

Androidでは、URLを渡すと暗黙的IntentImplicit Intent)が発行されます。

OSがそのURLを処理できるアプリを探し、該当するアプリが見つかればそれを起動します。

httpsのURLであれば、ブラウザや対応アプリが候補となり、複数あればアプリの選択ダイアログが表示されることもあります。

対応するアプリが一つも見つからない場合は、何も起こらずに処理が終わります。

iOSの場合

iOSでは、内部的にUIApplicationopenURLが呼ばれます。

httpsmailto:などの標準的なスキームはそのまま開けます。

一方、twitter://のようなカスタムURLスキームで他のアプリを開く場合は注意が必要です。

iOSでは、canOpenURLでアプリの有無を事前に確認する場合、問い合わせるスキームをInfo.plistLSApplicationQueriesSchemesに登録しておく必要があります。

Application.OpenURLで開くだけなら登録は必須ではありませんが、対象アプリが入っていなければ開けずに終わる点は変わりません。

この点からも、可能であればhttpsのURLでフォールバックしておく方が扱いやすいです。

アプリ未インストール時の挙動

カスタムスキーム(twitter://など)を渡したとき、対応するアプリが入っていないとどうなるかはプラットフォームによって変わります。

多くの場合、何も起こらずに無反応となります。

そのため、ユーザーから見ると「ボタンを押したのに反応しない」という状態になりかねません。

繰り返しになりますが、httpsのWeb版URLを渡しておけば、アプリが無くてもブラウザで開けるため、こうした無反応を避けられます。

実践的なユースケース

Application.OpenURLは、アプリの外への導線を作りたい場面で幅広く使えます。

ここでは代表的なユースケースを紹介します。

公式サイトやSNSへの誘導

タイトル画面や設定画面に、ゲームの公式サイトやXInstagramへのリンクボタンを置くケースです。

前述の通り、httpsのURLを渡すのが基本となります。

// 公式サイトへ
Application.OpenURL("https://xxxxxxxx.jp/");

// X(旧Twitter)へ
Application.OpenURL("https://x.com/xxxxxxxx");

ストアレビューへの誘導

「レビューを書く」ボタンから、アプリストアのページを直接開く使い方も定番です。

AndroidGoogle Playであれば、ストアアプリで直接開くためのmarket://スキームが使えます。

// Google Playのアプリページを開く(パッケージ名を指定)
Application.OpenURL("market://details?id=com.example.app");

// App Storeのアプリページを開く(アプリIDを指定)
Application.OpenURL("https://apps.apple.com/app/id1234567890");

Google Playmarket://が使えますが、こちらもアプリ未インストール時を考慮するなら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は暗黙的IntentiOSはカスタムスキームのInfo.plist登録が必要、といったプラットフォームごとの差もあります。

迷ったときは、アプリにもブラウザにも対応できるhttpsのWeb版URLを渡しておくのが、もっとも扱いやすく安全な選択肢です。

公式サイトへの導線やストアレビューの誘導など、活躍の場は多いので、ぜひ取り入れてみてください。