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での生体認証対応を、ぜひあなたのアプリにも導入してみてください!