Unity×iOS

【Unity×iOS】Face ID・Touch ID(生体認証)を使う方法|ロック解除・データ保護に活用しよう

iOSアプリでは、Face IDやTouch IDといった生体認証によって、セキュリティの高い操作やデータ保護が可能になります。
Unityで開発していると、「ゲームのセーブデータ保護」や「課金時の確認」などで生体認証を使いたい場面もあるはず。
この記事では、UnityからiOSのFace ID / Touch IDを簡単に呼び出す方法を、ネイティブプラグイン+C#連携でコピペOKにまとめて紹介します!

この記事で分かること

  • Unity標準では生体認証が使えない理由
  • iOSのLocalAuthenticationフレームワークでFace ID / Touch IDを実装する方法
  • 【コピペOK】Objective-C++プラグイン+Unityスクリプト
  • 成功/失敗による処理の切り分け

Unity標準では生体認証ができない理由

Unityには、iOSのセキュリティ機能(生体認証、セキュアストレージ)を直接扱うAPIはありません。
そのため、iOSのネイティブ機能をObjective-C++経由で呼び出す必要があります。

iOSでは LocalAuthentication.framework を使うことで、

  • Face ID(顔認証)
  • Touch ID(指紋認証)
    を端末側で自動判定し、認証ダイアログを表示できます。

【コピペOK】生体認証プラグインの作成手順

.mmファイルを作成する

Assets/Plugins/iOS/BiometricAuth.mm

import <LocalAuthentication/LocalAuthentication.h>

static void (*authCallback)(bool success) = NULL;

extern "C" void AuthenticateWithBiometrics(void (*callback)(bool))
{
    authCallback = callback;

    LAContext *context = [[LAContext alloc] init];
    NSError *error = nil;

    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error])
    {
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                localizedReason:@"この操作を行うには認証が必要です"
                          reply:^(BOOL success, NSError *error) {
            if (authCallback)
            {
                authCallback(success);
            }
        }];
    }
    else
    {
        if (authCallback) authCallback(false);
    }
}

Unity側のC#スクリプト

using System;
using System.Runtime.InteropServices;
using UnityEngine;

public class BiometricAuth : MonoBehaviour
{
#if UNITY_IOS && !UNITY_EDITOR
    [DllImport("__Internal")]
    private static extern void AuthenticateWithBiometrics(AuthCallbackDelegate callback);

    private delegate void AuthCallbackDelegate(bool success);
#else
    private static void AuthenticateWithBiometrics(AuthCallbackDelegate callback)
    {
        Debug.Log("エディタでは生体認証は利用できません。");
        callback?.Invoke(true); // デバッグ用に常に成功
    }

    private delegate void AuthCallbackDelegate(bool success);
#endif

    public static Action OnAuthSuccess;
    public static Action OnAuthFailed;

    [AOT.MonoPInvokeCallback(typeof(AuthCallbackDelegate))]
    private static void OnAuthResult(bool success)
    {
        if (success)
        {
            Debug.Log("認証成功!");
            OnAuthSuccess?.Invoke();
        }
        else
        {
            Debug.Log("認証失敗 or キャンセル");
            OnAuthFailed?.Invoke();
        }
    }

    public void StartAuthentication()
    {
        AuthenticateWithBiometrics(OnAuthResult);
    }
}

使用例(ロック解除に利用)

public class SecureLogin : MonoBehaviour
{
    public GameObject protectedPanel;

    void Start()
    {
        BiometricAuth.OnAuthSuccess += () =>
        {
            protectedPanel.SetActive(true);
        };

        BiometricAuth.OnAuthFailed += () =>
        {
            Debug.Log("認証失敗。アクセスできません。");
        };

        GetComponent<BiometricAuth>().StartAuthentication();
    }
}

注意点・実装のコツ

注意点解説
生体認証失敗時のUI設計が重要強制終了・無限ループにならないよう注意
Face ID / Touch ID の種類は自動で判別される端末に応じてダイアログ内容が変わるので開発者が対応不要
初回起動時は認証を強制しない設計がベターUXを損なわないよう「ユーザーが選べる仕組み」が望ましい

まとめ

項目内容
Unity標準では生体認証が使えないネイティブプラグインが必要
iOSのLocalAuthenticationで簡単実装可能
コピペOKコード+イベント設計で使いやすい
セーブ保護・ロック解除・限定機能に最適

ユーザーの信頼性を高めるセキュリティ手段として、
Unity×iOSでの生体認証対応を、ぜひあなたのアプリにも導入してみてください!