티스토리 뷰
안드로이드앱에 푸시알람 적용하기!
안녕하세요. 오틸라 입니다.
한 2년전인가?
간단한 웹앱을 개발한적이 있는데, 얼마전에 "푸시알람을 적용해달라" 고 요청이 왔습니다.
그래서, 작업하는김에
FCM적용방법을 같이 올리려 합니다.
일단,
fcm이 푸시알람입니다. 구글신님께서 제공해주시죠!
그럼 firebase로 접속합니다.
console.firebase.google.com
구글 계정으로 로그인이 되어 있으면 위와 같이 프로젝트를 추가하라고 뜰겁니다.
사전 준비사항이라면
1. 구글계정
2. 개발중인 앱
이 되겠죠?
이름을 아무거나 만들어 줍니다. (사용할 앱의 이름을 적어주는게 기억하기 좋겠죠?)
그리고, 지역은 대한민국 골라주고 프로젝트 만들기 클릭합니다.
오늘 할 것은 안드로이드에 추가하는것이므로, Android앱에 Firebase 추가를 클릭합니다.
(보시면 아시겠지만, ios나 웹도 지원합니다.)
다음 화면은 캡쳐가 안되었는데, 패키지명을 입력하라고 합니다.
이 패키지명은 개발중인 앱의 패키지명입니다.
AndroidManifest.xml에 보면 package 명이 나오죠? 저거를 입력해줘야 합니다.
패키지명이 틀리면 절대! FCM이 작동하지 않으니 주의해서 입력해주세요.
(여담으로
패키지명은 참 중요합니다. 아시겠지만, 구글플레이에 런칭한 이후에 패키지명을 바꾸면 업데이트 안됩니다
왠만하면 패키지명은 신중히 만드세요 ^^; )
아...
또 스크린샷을 빼먹었네 ;;;;
패키지명을 누르고 다음을 누르면, 구글신님께서 "파일을 하나 다운받아 니 앱에 깔아라" 라고 합니다.
google-service.json 파일입니다.
이 파일에 fcm을 통신할 각종정보를 담고 있습니다.
이 파일은 app폴더에 복사해주면 됩니다.
상단 드롭다운을 눌러서 android -> project로 바꾸면 app 폴더에 복사할 수 있습니다.
복사가 다 되었다면 다음단계로 진행해봅시다.
앱등록 (스샷 안찍음) 다했고,
구성 파일 다운로드(스샷 또 안찍음) 다했고,
마지막 단계 firebase sdk를 추가합니다.
쟤가 시키는대로,
프로젝트build.gradle 앱build.gradle에 주어진 예 그대로 복사해서 붙여줍니다.
그리고 마지막으로 안드로이드 스튜디오 우측 상단에 보면 Sync now를 한번 클릭해 줍니다.
이제 완료를 누르면, firebase 프로젝트가 생성되었고, fcm을 사용할 준비가 구글쪽에서는 다되었습니다.
자 그럼 이제 앱쪽에서 fcm을 작동할 준비를 합시다.
우선 패키지폴더 fcm을 하나 만듭니다.
이제 MyFirebaseInstanceIDService, MyFirebaseMessagingService 클래스 파일을 두개 만듭니다.
(이 파일 두개가 뭐하는지는 나중에 설명드릴께요. 일단 만드세요 ^^)
그리고
앱build.gradle에
compile 'com.google.firebase:firebase-messaging:11.6.0'
요걸 하나 추가해줍니다.
그리고 Sync Now
MyFirebaseInstanceIDService 파일은 아래와 같이 만들어 줍니다.
MyFirebaseMessagingService 파일도 아래와 같이 만들어 줍니다.
클래스명이 노랗게 뜨니 마우스를 갖다대 봅니다.
매니페스트 파일에 정의를 안했다고 블라블라 하네요.
매니페스트의 application 안에 서비스를 두개 추가해줍니다. 방금 만든 클래스들이요!
자 이제 앱을 실행하면 토큰을 받아와야 합니다.
토큰이 뭐냐면....구글이 알림 메세지를 보낼 "스마트폰 주소"같은 겁니다.
뭐 그냥 그렇게 이해합시다!
토큰 받는 부분에 중단점을 걸고, 앱을 디버깅으로 실행해보면, 딱 걸리죠?
거기서 ctrl+F8을 눌러주면 조사식을 쓸 수 있습니다.
엄청나게 긴 토큰값이 넘어왔네요.
이걸 메모장에 복사해 둡시다.
자, 그럼 다시 firebase 홈페이지에 notification 메뉴를 클릭해서, 메세지를 보내봅시다.
메시지 내용 아무거나 입력하고,
대상에서 단일기기를 선택하면 토큰을 입력할 창이 나옵니다.
여기에 아까 복사해 두었던 토큰을 입력하고, 메시지 보내기를 클릭합니다.
MyFirebaseMessagingService 클래스의 onMessageReceived 에서 이벤트가 걸립니다.
저기에 remoteMessage에 값이 담겨있게 되는데요.
MyFirebaseMessagingService 클래스가 뭐하는거냐면
앱이 실행중일때 푸시알람을 보내면 발생하는 이벤트 입니다.
예를 들어,
카카톡을 실행해서 다른친구랑 채팅중이거나, 그냥 리스트 쭉 훑어보고 있는데, 누군가 말을 걸었다.
그래도 알람이 떠야 하쟎아요?
반대로, 현재 대화하고 있는 친구가 말걸면 알람이 안 떠야하쟎아요?
뭐 이런 처리를 저기서 해줄 수 있는 겁니다.
자 그럼 앱을 종료시키구요,
다시 메세지를 보내봅시다!
아까처럼 firebase에서 메세지를 보내봅니다.
잘되나요?
잘되면 여기서 끝!.
뻣뜨 그러나!!!
앱을 지웠거나, 새로 디버깅 했거나, 시간이 오래 지났거나 뭐 이런저런 이유로
아까 복사해둔 토큰으로 아무리 메세지를 보내도 안가는 경우가 발생할 겁니다!
어라라???
왜 안되지??
그래서 다시 token 받아보니...
음? 토큰이 다르네요???
토큰이 달라졌어요!!!
내 인식표는 한번만 받으면 2년간은 쓸줄 알았는데,
금방 바꼈네요???
그 이유는
알려들면 복잡하지만
어쨌든 결론은
"오늘의 토큰이 평생 니껀 아니다!"
입니다.
앱을 삭제했다 새로 설치하거나, 유효시간이 지나서 만료되거나 등등의 이유로 토큰은 계속해서 바뀝니다.
그래서 이때
MyFirebaseInstanceIDService 클래스가 쓰입니다.
구글입장에서
음? 새로운놈이네? 라고 판단이 되면 새로운 토큰을 보내줍니다.
앱을 삭제하고, 새로 빌드해보면, MyFirebaseInstanceIDService 클래스에서 이벤트가 발생합니다.
그리고 새로운 토큰을 받죠.
아까 메모장에 복사해뒀던거랑 비교해보면 달라졌죠?
그래서,
항상 저 이벤트를 받게 되면
1. 앱내 SharedPreference에 저장하거나,
2. DB에 저장해서 써야 합니다.
저는 주로 후자를 씁니다.
새로 받은 토큰으로 앱을 실행하지 않은 상태의 스마트폰에 메세지를 보내면
저렇게 알람이 뜨게 됩니다.
푸시알람 심화편은 할까말까 고민중인데...
일단 fcm의 간단한 적용은 여기까지입니다.
이상 오틸라였습니다.
건강하세요.