dev/flutter

flutter - local_auth, 지문인증, Unresolved reference: activity

wlrn566 2023. 8. 2. 13:12

1. 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

 

2. AndroidManifest.xml에 권한 추가

 

<uses-permission android:name="android.permission.USE_BIOMETRIC"/>

 

 

3. MainActivity.kt 파일 수정

 

// class MainActivity: FlutterActivity()
// FlutterFragmentActivity로 바꿔준다.
class MainActivity: FlutterFragmentActivity()

 

4. 생채인증 관련 코드 구현

 

import 'dart:developer';

import 'package:flutter/services.dart';
import 'package:local_auth/local_auth.dart';

class LocalAuth {
  late LocalAuthentication auth;

  LocalAuth() {
    auth = LocalAuthentication();
  }

  /// 기기 지원 여부 확인
  Future<bool> checkDeviceSupported() async {
    try {

      return auth.isDeviceSupported();

    } on PlatformException catch (e) {
      log(e.message.toString());
      return false;
    }
  }

  /// 생체인증 가능 여부 확인
  Future<bool> checkBiometrics() async {
    try {

      return await auth.canCheckBiometrics;

    } on PlatformException catch (e) {
      log(e.message.toString());
      return false;
    }
  }

  /// 등록된 바이오인증 목록 구하기
  Future<List<BiometricType>> getAvailableBiometrics() async {
    try {

      return await auth.getAvailableBiometrics();

    } on PlatformException catch (e) {
      log(e.message.toString());
      return [];
    }
  }

  /// 생채인증
  Future<bool> authenticate() async {
    try {

      return await auth.authenticate(
        localizedReason: '생체인증',
        options: const AuthenticationOptions(
          stickyAuth: true,
        ),
      );

    } on PlatformException catch (e) {
      log(e.message.toString());
      return false;
    }
  }
}

 

5. 메세지 수정

authMessages 속성을 사용하면 된다.

 

import 'package:local_auth_android/local_auth_android.dart';
import 'package:local_auth_ios/local_auth_ios.dart';

/// 생체인증
Future<bool> authenticate() async {
    try {

      return await auth.authenticate(
        authMessages: const <AuthMessages>[
          AndroidAuthMessages(
            signInTitle: '안드로이드 생체인증',
            cancelButton: '취소',
          ),
          IOSAuthMessages(
            cancelButton: '취소',
          ),
        ],
        localizedReason: '생체인증을 시도합니다.',
        options: const AuthenticationOptions(
          stickyAuth: true,
        ),
      );

    } on PlatformException catch (e) {
      log(e.message.toString());
      return false;
    }
}

 


Unresolved reference: activity / Unresolved reference: context 오류

 

FlutterActivity()를 사용했을 때 activity 또는 context는 그냥 activity, context 를 사용하면 되지만,

FlutterFragmentActivity() 에서는 this, applicationContext 로 변경해줘야 한다.

 

...
    ActivityCompat.requestPermissions(activity, permissions, PERMISSION_CODE)
...

// 아래로 변경
...
    ActivityCompat.requestPermissions(this, permissions, PERMISSION_CODE)
...