flutter

생체 인증 추가

이나주니 2025. 2. 25. 12:00
반응형

 

설치

local_auth: 2.3.0 

https://pub.dev/packages/local_auth

 

local_auth | Flutter package

Flutter plugin for Android and iOS devices to allow local authentication via fingerprint, touch ID, face ID, passcode, pin, or pattern.

pub.dev

.

 

Android

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.[your.package]">
  <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
  <application...
    ...
    ...
    ...
<manifest>

 

MainActivity.kt

package com.[your.package]

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterFragmentActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}

 

IOS

Info.plist

<key>NSFaceIDUsageDescription</key>
<string>Why is my app authenticating using face id?</string>


위 내용들을 입력해 줍니다.

 

이후에 생체 인증을 지원하는지 여부를 확인합니다,

 Future<void> checkBiometricSupport() async {
    bool isAvailable = await localAuth.canCheckBiometrics;

    // 생체 인증 있는경우
    isBiometricAvailable = isAvailable;
    if (isBiometricAvailable) {
      String? id = await storage.read(key: 'email') ?? "";
      String? password = await storage.read(key: 'password') ?? "";
      if (id.isNotEmpty && password.isNotEmpty) {
        loadCredentials();
      } else {
        Get.dialog();
      }
    }
  }

 

생체인증이 등록되어있지 않으면 설정으로 이동시키는 팝업이 뜨고

생체 인증이 등록되어있다면 아래 사진처럼 생체인증이 뜹니다.

 // 저장된 로그인 정보 불러오기 (생체 인증 필요)
  Future<void> loadCredentials() async {
    try {
      bool isAuthenticated = await localAuth.authenticate(
        localizedReason: '로그인을 위해 생체 인증을 진행해주세요.',
        options: const AuthenticationOptions(biometricOnly: true),
        authMessages: const <AuthMessages>[
          AndroidAuthMessages(
            signInTitle: '생체 인증 로그인',
            biometricHint: '지문을 스캔하거나 얼굴을 인식해주세요.',
            biometricNotRecognized: '생체 정보가 일치하지 않습니다. 다시 시도해주세요.',
            biometricRequiredTitle: '생체 인증 필요',
            biometricSuccess: '인증 성공!',
            cancelButton: '취소',
            deviceCredentialsRequiredTitle: '생체 인증이 필요합니다.',
            deviceCredentialsSetupDescription: '기기 설정에서 생체 인증을 등록해주세요.',
            goToSettingsButton: '설정으로 이동',
            goToSettingsDescription: '기기 설정에서 생체 인증을 등록해야 사용할 수 있습니다.',
          ),
          IOSAuthMessages(cancelButton: 'No thanks'),
        ],
      );
    } on PlatformException catch (e) {
      if (e.code == "user_cancel") {
        Get.dialog();
      }
    } finally {
     
    }
  }

 

생체인증시 화면 캡쳐가 안되는 이유로 다른폰으로 찰칵!

 

 

 

위의 설정을 했는대도 아래와 같은 에러가  뜬다면 로직이 두번실행되는지 봐야합니다.

분기 처리로 두번실행되지 않도록 막아주세여!

PlatformException(auth_in_progress, Authentication in progress, null, null)
I/flutter (17913): #0LocalAuthAndroid.authenticate (package:local_auth_android/local_auth_android.dart:56:9)

 

반응형