ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생체 인증 추가
    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)

     

    반응형

    댓글

Designed by Tistory.