컴퓨터 공학

👉 [Flutter] 앱 아이콘 뱃지 만들기(iOS/Android) 방법론 삽질기

bitcodic 2021. 6. 4. 13:20

앱 아이콘 뱃지

앱을 개발하다보니 푸시알림이 발생할 경우, 아이콘에 숫자 뱃지를 달아줘야 했다.

 

근데 이게 이렇게 복잡한 것인줄 몰랐다.... 괜히 Sendbird(채팅 API 회기업) 가 기업가치가 1조가 된게 아니다.

 

 

 

그냥 숫자만 달아주면 되는거 아닌가? 싶었는데,

고려할 부분이 너무나도 많고, 버그라도 발생하면 숫자 꼬이기가 너-무 쉽다.

 

우선 우리 앱은 푸시알림이 2가지 타입이다.

1.채팅 푸시

2.알림 푸시 (새 공지, 새 일정 등록 등등)

 

내가 생각한 루트는 2가지 이다.

1.서버에서 푸시를 날려서 local에 도착할때마다 local client에서 숫자++ 하는 것.

2.서버에서 푸시에 숫자값을 같이 날려 local client에서 보여주기만 하는 것.

 

당연히 전자가 처리하기 편하다. 서버는 푸시만 날리고 클라가 수치만 업데이트하면 되니까~ 트래픽도 줄고~, 채팅의 경우 일주일 이상 지난 메시지는 서버에서 삭제하기 때문에 클라이언트와 동기화 과정에도 어려움이 있다. 버그가 발생했는데, 로컬에 있는 메시지가 서버에는 없어서 로그확인이 어려워진다거나... X)

 

문제는 앱의 상태주기 때문에 발생했다.

 

Flutter 기준으로(아마 다 비슷할듯) 앱은 3가지 상태를 갖는다

1.Foreground: 앱이 최상단에서 사용중임

2.Background: 홈버튼을 이용해 앱 바깥으로 나갔으나, 메모리에는 올라가 있음

3.Terminated: 앱이 프로세스 관리자에 의해 강제종료 당함

 

플러터 기준으로 3번 경우에 푸시가 도착해도 특정 코드 실행이 불가능하다. 즉, 앱이 강제 종료된 상태에서는 푸시는 오지만 숫자++가 동작이 불가능하다는 것이다.

아무래도 OS 정책상 막아둔 것이라 우회할 방법을 찾을 수가 없었다. 더불어 플러터의 경우는 더욱 생태계가 초반단계라,,, 정보가 더 없다.

 

내가 앱 개발자가 아니다보니, 해당 사안에 대해 iOS 개발자였던 형님에게 물었는데 해당 회사에서 2번 방식으로 동작시켰다고 한다.

즉, 서버에서 클라이언트마다 뱃지 숫자값을 가진 DB가 있었고, 이를 활용해서 서버에서 직접 푸시알림 마다 날려주는 방식인 것.

찾아보니 FCM에 badge 라는 파라미터로 전송할 수 있었다(APN도 마찬가지)..

 

즉 이런 기능을 제공한다는 것은, 애초에 푸시를 전송하는 서버쪽에서 관리하라는 것이다.

 

{
 "aps":{
        "alert":{
                "title":"Push Pizza Co.",
                "body":"Your pizza is ready!"
         },
            "badge":42,
            "sound":"default"
 }
}

심지어 badge 값을 1로 보내면 local client 값을 ++하세요~ 가 아니라 badge에 카운트 값을 설정해서 보내줘야 한다

 

와이라노,,, 와이라노,,,!!!

그냥 유저별로 테이블을 생성했다,,,^^,,, 어쩌면 이게 더 맘편한걸지도 몰라,,, 후,,,

 

일주일간 관련 코딩으로 삽질했다.

 

 

이 글을 보는 누군가는 나같은 삽질을 하지 말아주세요..