3
1

More than 1 year has passed since last update.

UnityのiOSビルドしたアプリケーションでのディープリンクパラメータの取得と表示

Posted at

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オブジェクトを作成します。
スクリーンショット 2023-08-23 11.58.06.png

Projectタブにて、Assets配下にCreate > C# ScriptでC# Scriptを作成します。
スクリーンショット 2023-08-23 12.01.57.png

新規作成したC# ScriptをGameObjectにドラッグ&ドロップします。
タイトルなし.gif

作成した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点リーダーを右クリックすると、
画像のように作成した関数が表示されているはずです。
スクリーンショット 2023-09-13 2.11.14.png

表示されている関数を押下することでその関数の処理を実行することができます。
これで、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のようにドラッグ&ドロップします。
textComponent.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へ変更します。
スクリーンショット 2023-09-13 15.32.10.png

そしてBuild and Runをすると保存先フィルダーを選択後ビルドが走り、XCodeが立ち上がるはずです。

3.2 XCode側の設定

XCodeでCustom URL Schemeを設定して、ディープリンクを設定します。
Unity-iPhone > info.plistファイルを開き、URL types > Items 0 () > URL Schemes > Item 0にスキームを設定します。
自分の場合、myappとしました。
スクリーンショット 2023-09-13 16.55.04.png

シミュレータを起動してSafariを開き、試しにmyapp://test?params=hello&params2=wowを開いてみます。
するとディープリンクでアプリが起動し、画面にパラメータが表示されます。
simulator.gif

これにてディープリンクからパラメータを取得して表示させる実装は完了です。

4. まとめ

ディープリンクを活用することで、アプリの特定の部分や機能に直接アクセスさせることが可能となり、ユーザビリティの向上が期待できます。
今回の記事を通して、自身が学んだディープリンクからのパラメータの取得方法や、それをUI上で表示する手法を共有しました。
少しでも誰かの手助けになれば幸いです。

参考リンク

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1