1. はじめに
ディープリンクを活用することで、アプリを特定の状態で起動することができます。
この記事では、UnityでディープリンクのURLからパラメータを取得し、それを画面上に表示する方法を学習のアウトプットのために書いていきます。
自分はUnityもC#も初心者なので、間違っている点や改善点などあればご教示いただけますと幸いです。
ディープリンクとは?
特定のURLをクリックすると、そのURLに関連付けられたアプリが直接特定の画面や状態で開始される機能を指します。
例えば、メールアプリからのリンクをクリックすると、そのリンクに関連付けられたアプリの特定のページが直接開く、といったものです。
2. 前提条件
環境
Unityバージョン 2022.3.2f1
MacOS Ventura
M1チップ
事前にXCodeのインストールとiOSをビルドできるUnityEditorを準備してください。
3. 実装手順
ディープリンクパラメータの取得と表示をするUnityアプリケーションを作成し、XCode側でCustom URL Schemeの設定をします。
3.1 コーディング
新規プロジェクトを立ち上げ、HierarchyタブにてCreate Empty
でGameObjectを、UI > Legacy > Text
でTextオブジェクトを作成します。
Projectタブにて、Assets配下にCreate > C# Script
でC# Scriptを作成します。
新規作成したC# ScriptをGameObjectにドラッグ&ドロップします。
作成したC# Scirptを開きコーディングしていきます。
UnityEditor上でディープリンクの動作テストをするために、ContextMenu
を使っていきます。
以下は、ディープリンクが呼ばれた時の処理であるonDeepLinkActivated
関数を擬似的に呼び出すコードです。
private void onDeepLinkActivated(string url)
{
Debug.Log(url);
}
private void Awake()
{
Application.deepLinkActivated += onDeepLinkActivated;
}
[ContextMenu("DeepLinkTest")]
public void DeepLinkTest()
{
onDeepLinkActivated("myapp://test?param1=hello");
}
ちょっと解説
Application.deepLinkActivatedはディープリンクによってアプリが起動した時に発火するイベントのことです。
Awake内の +=
演算子は、C#においてイベントハンドラを追加するためのもの。
これにより、Application.deepLinkActivated
イベントが発生するたびに、onDeepLinkActivated
関数が自動的に呼び出されるようになります。
これでUnityEditor上からDeepLinkTest()
を呼び出せるようになりました。
スクリプトをアタッチしたオブジェクトのInspectorにてスクリプトのコンポーネントの縦3点リーダーを右クリックすると、
画像のように作成した関数が表示されているはずです。
表示されている関数を押下することでその関数の処理を実行することができます。
これで、myapp://test?param1=hello
がConsoleに表示されたらOKです。
次にディープリンクでアプリが起動した時にディープリンクのURLからパラメータを取得できるようにします。
linqを使うため、スクリプト上部にてusing System.Linq;
を宣言します。
private string displayText = "";
private void GetParams(string url)
{
var uri = new Uri(url);
var queryStr = uri.GetComponents(UriComponents.Query, UriFormat.SafeUnescaped);
var queries = queryStr
.Split('&')
.Select(x => x.Split('='))
.Where(x => x.Length == 2)
.ToDictionary(x => x[0], x => x[1]);
string tmpDisplayText = "";
foreach (KeyValuePair<string, string> query in queries)
{
tmpDisplayText += query.Key + ": " + query.Value + "\n";
}
displayText = tmpDisplayText;
}
ちょっと解説
Uriクラスを使ってURLのパラメータ情報を取得します。
var uri = new Uri(url);
URIからパラメータを取得する処理について、
以下のサイト様を参考にクエリをDictionary型でqueries
変数に格納しています。
Key: Value
の形で改行して表示するためにDictionary型で格納したqueriesをforeachで回し、
Key: Value
と改行をtmpDisplayText
に追加します。
次に、画面上に表示させる処理部分です。
UIのTextオブジェクトに情報を反映させるために、スクリプト上部にてusing UnityEngine.UI;
を宣言します。
そしてTextオブジェクトに反映させるためのスクリプトを書きます。
public Text textComponent;
private void ApplyTextChange()
{
if (textComponent != null)
{
textComponent.text = displayText;
}
}
上記を書いたらUnityEditorに戻って、GameObject
のスクリプトコンポーネントにTextComponent
が追加されているのを確認し、
Textオブジェクトを以下GIFのようにドラッグ&ドロップします。
最後にonDeepLinkActivated()
にて、Debug.Logを削除し、上記2つの処理を呼び出します。
private void onDeepLinkActivated(string url)
{
GetParams(url);
ApplyTextChange();
}
完成したスクリプトはこちら。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using System.Linq;
public class DeepLinkScript : MonoBehaviour
{
public Text textComponent;
private string displayText = "";
private void GetParams(string url)
{
var uri = new Uri(url);
var queryStr = uri.GetComponents(UriComponents.Query, UriFormat.SafeUnescaped);
var queries = queryStr
.Split('&')
.Select(x => x.Split('='))
.Where(x => x.Length == 2)
.ToDictionary(x => x[0], x => x[1]);
string tmpDisplayText = "";
foreach (KeyValuePair<string, string> query in queries)
{
tmpDisplayText += query.Key + ": " + query.Value + "\n";
}
displayText = tmpDisplayText;
}
private void ApplyTextChange()
{
if (textComponent != null)
{
textComponent.text = displayText;
}
}
private void onDeepLinkActivated(string url)
{
GetParams(url);
ApplyTextChange();
}
private void Awake()
{
Application.deepLinkActivated += onDeepLinkActivated;
}
[ContextMenu("DeepLinkTest")]
public void DeepLinkTest()
{
onDeepLinkActivated("https://www.google.com/test?param1=hello");
}
}
コーディングが完了したら、UnitiyEditor上からDeepLinkTest
を呼び出してテストしてみましょう。
上記コードの場合、Gameビューにてparam1: hello
と表示されたら成功です。
コーディングが完了したのでビルドしていきます。
File > Build Settings...
でビルドの設定画面を開き、現在選択しているシーンを追加します。
SwitchPlatform
でPlatformをiOSへ変更します。
そしてBuild and Run
をすると保存先フィルダーを選択後ビルドが走り、XCodeが立ち上がるはずです。
3.2 XCode側の設定
XCodeでCustom URL Schemeを設定して、ディープリンクを設定します。
Unity-iPhone > info.plistファイル
を開き、URL types > Items 0 () > URL Schemes > Item 0
にスキームを設定します。
自分の場合、myapp
としました。
シミュレータを起動してSafariを開き、試しにmyapp://test?params=hello¶ms2=wow
を開いてみます。
するとディープリンクでアプリが起動し、画面にパラメータが表示されます。
これにてディープリンクからパラメータを取得して表示させる実装は完了です。
4. まとめ
ディープリンクを活用することで、アプリの特定の部分や機能に直接アクセスさせることが可能となり、ユーザビリティの向上が期待できます。
今回の記事を通して、自身が学んだディープリンクからのパラメータの取得方法や、それをUI上で表示する手法を共有しました。
少しでも誰かの手助けになれば幸いです。
参考リンク