flutter, firebase_messaging background 처리

flunge·2021년 12월 21일
0

Flutter

목록 보기
3/13

firebase_messaging를 사용하면 메시지를 받았을 때 처리를 해줘야 하는데 그 상태에 따라 별도로 처리를 해줘야 한다.
출처 : FlutterFire

flutter 2.0 이전 버전과 차이가 있기 때문에 참고해야한다.
위 표를 보면 앱의 3가지 상태를 열로 메시지의 종류를 행으로 구분했는데 나는 Notification을 flutter_local_notification으로 구현하기 때문에
앱의 상태만 신경쓰면 된다.

구현

FirebaseMessaging 클래스의 스태틱 메소드인 onBackgroundMessage를 이용해 핸들러를 등록 해야한다.
처음엔 fcm관련 컨트롤러 객체를 만들어서 그 안에서 onBackgroundMessage를 호출했는데 핸들러 관련 에러가 발생해 알아보니 백그라운드 메시지 핸들러는 두가지규칙이 있는데
1. It must not be an anonymous function.
2. It must be a top-level function (e.g. not a class method which requires initialization).
대충 익명함수는 안된다는 것과 탑 레벨 함수여야 한다는 것이다 그 뒤를 보면 초기화가 필요한 클래스 메소드면 안된다고 하는데 내가 그렇게 해서 문제가 됐었다.

기존 방식 예시

class FcmController {

  static final FcmController _instance = FcmController._internal();
  FirebaseMessaging messaging = FirebaseMessaging.instance;
  
  Future onBackgroundHandler(RemoteMessage message) async {
    print("onBackgroundMessage: ${message.data}");
    return Future.value();
  }

  FcmController._internal(){
    print('FcmController._internal()');
    FirebaseMessaging.onBackgroundMessage(onBackgroundHandler); 
  }
  
  factory FcmController(){
    return _instance;
  }
  
  ...

이런 싱글톤 객체를 만들고 객체 초기화 단계에서 등록을 했는데 이러면 안된다.

성공 예시

void main() async{
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  FirebaseMessaging.onBackgroundMessage(onBackgroundHandler);

  runApp(const MyApp());
}

main안에서 onBackgroundMessage를 호출해 핸들러를 등록하니 됐다.
핸들러 안에서 notification을 띄운다던가 필요한 행동을 하면 될 것 같다.


백그라운드에서 메시지를 받으면 notification을 띄우게 설정해봤다.

2.0이전 버전에서 fcm을 처리할때 백그라운드 처리가 까다로웠었는데 이번에 새로운 프로젝트를 하며 다시 해보니 굉장히 간단해 졌다.

0개의 댓글