박상권의 삽질블로그

[안드로이드/Android]8.0 오레오 알림채널(Notification Channel) 대응하기 본문

IT/Android-TIP (한글)

[안드로이드/Android]8.0 오레오 알림채널(Notification Channel) 대응하기

박상권 2018. 2. 4. 21:12

안드로이드 개발자들이 모여있는 오픈채팅방에 참여해보세요 .
Q&A 및 팁을 공유하는 방입니다..
오픈채팅방 참여


블로그를 Medium으로 옮겨서 운영하고 있습니다.
앞으로 새로운 글은 모두 미디엄 블로그를 통해서 올릴 예정입니다.
미디엄에서 다양하고 유익한 포스팅을 살펴보세요
미디엄 블로그 보기


이번에 '클린 아키텍처'를 주제로 온라인 강의를 개설하게 되었습니다 🎉
평소 오픈채팅방이나 여러 커뮤니티에서 '클린 아키텍처'와 관련된 질문들이 많았는데요. 이를 해결해줄 수 있는 마땅한 강의가 없었던것 같습니다.
평소 '클린 아키텍처' 에 대한 궁금증이나 관심이 있으셨던 분들이 수강해보시면 도움이 될것 같아요
강의 살펴보기



지난 2017년 8월, 구글은 안드로이드 8.0 오레오를 공개했습니다.

여러가지 동작 변경사항 중 우리는 알림(Notification)에 대한 변경사항에 대해 꼭 대응을 해주어야 합니다.

우리는 지난 마시멜로우 6.0에서 권한을 대응하면서 느꼈듯이 OS의 업데이트때마다 무엇을 대응해주어야 하는지 눈여겨 보아야 합니다.

[IT/Android-TIP (한글)] - [안드로이드/Android]6.0 마시멜로우 권한체크하고 최적화하기


2018년 1월 기준으로 오레오이상 기기의 점유율은 0.7% 밖에 되지 않습니다.(안드로이드 OS점유율)

현재는 구글의 레퍼런스폰인 넥서스기기에서만 8.0 오레오를 사용할 수 있지만 곧 삼성,LG의 제조사에서도 업데이트를 지원할것이기 때문에 우리는 대응을 해주어야 합니다.






TL;DR(Too long; didn't read)

이 포스팅을 다 읽으실 시간이 없으시거나 귀찮으신분들은 아래 샘플을 다운받아보시고 바로 테스트해보실 수 있습니다.
https://github.com/ParkSangGwon/NotificationChannelSample

(여러분의 Github의 Star 눌러주시는 센스도 기대합니다!)






알림채널(Notification Channel)


앱에서 알림(Notification)은 채팅, 새게시글, 댓글, 공지사항등의 다양한 용도로 쓰입니다.


저는 페이스북 운영자입니다.(사실 아닙니다)

페이스북에서는 사용자에게 여러가지 알림을 보냅니다.

채팅, 친구의 새 게시글 알림, 사용자의 게시글에 대한 댓글, 사용자가 참여한 게시글에 대한 댓글, 친구추천, 기타 공지사항등

하지만 알림의 종류가 많아서 그만큼 알림이 많이 가기때문에 페이스북 사용자들은 불만이 많았습니다.

별로 중요하지 않은 알림은 소리나 진동없이 왔으면 좋겠고 중요하다고 생각하는 알림은 잠금화면에서도 알려주기를 바랬습니다.


이럴때 유용한게 알림채널(Notification Channel)입니다.

Notification Channel을 통해 Notification을 여러가지 용도로 나누어서 관리할 수 있게 만들어 줍니다.



그리고 사용자가 직접 각 채널별로 알림중요도나 기타 설정을 변경할 수도 있습니다.


오레오에서부터는 이 Notification Channel을 필수로 만들어 주어야 합니다.


오레오에서 Notification Channel을 만들어 주지 않으면 알림이 오지 않습니다.











아직 오레오에 대응할 마음의 준비가 안되셨나요?



지금 오레오폰에서 플레이스토어에 있는 내앱을 설치하면 알림이 안올까요?

그렇지 않습니다.

안드로이드에서 targetSdkVersion이 26버전보다 아래라면 문제없이 알림이 옵니다.

아직 마음의 준비가 안되셨거나 귀찮다면 targetSdkVersion을 25로 두고 개발하세요.


이미 26으로 올리셨다면 25로 내릴 수 있습니다.

안될것 같다구요? 됩니다! 제가 해봤거든요!

당연히 내리는게 안된다고 생각하고있었는데 가능한 작업이었습니다.






알림채널(Notification Channel) 만들기

Notification Channel을 만드는 방법은 간단합니다.

해당 기기의 OS버전이 오레오이상일때 Notification Channel을 만들어주고 필요한 설정을 해준뒤 NotificationManager의 createNotificationChannel()을 호출해주면 됩니다.



Notification Channel의 다른 함수에 대해서는 아래에서 자세하게 살펴보실 수 있습니다.

https://developer.android.com/reference/android/app/NotificationChannel.html


채널은 한번만 만들면 되기때문에 Notification이 올때마다 만들어줄 필요가 없습니다.

Application Class에서 만들어 줘 되고 SharedPreference를 이용해서 한번 만든적이 있다면 그다음부터는 만들지 않도록 해주어도 됩니다.








알림(Notification)에 채널 지정하기


알림에 채널을 지정하는 방법은 간단합니다.

기존에 Notificatioin Builder에서 하던 작업에 어느채널에 포함시킬지 채널ID만 함께 추가해주면 됩니다.

Notification.Builder builder = new Notification.Builder(context, channel)
.setContentTitle(title)
.setContentText(body)
.setSmallIcon(getSmallIcon())
.setAutoCancel(true);

생성자에서 채널ID를 넣어줄수도 있고 .setChannel() 함수를 이용해서 채널ID를 지정해줄 수도 있습니다.










알림채널(Notification Channel) 관리


알림채널(Notification Channel)을 만들고나서 수정, 삭제가 가능합니다.


NotificationManager의 getNotificationChannel(), createNotificationChannel()을 활용해서 해당 채널ID에 대해서 수정해주면 됩니다.

수정은 채널이름, 채널설명에 대해서만 가능합니다.

알림 중요도나 진동패턴, 소리, 불빛 등에 대해서는 변경해줄 수 없습니다.


삭제는 채널ID를 넘겨주면 삭제할 수 있습니다.

그렇기때문에 수정으로 불가능한것들을 변경해주고 싶은경우 채널을 삭제하고 원하는 설정으로 새로 만들어 주면 됩니다.

하지만 삭제후 재생성을 남용하면 안됩니다.


아래의 스크린샷처럼 특정 채널이 삭제됐음을 사용자가 알수 있음은 물론이고 만약 사용자가 해당 채널의 설정을 변경해서 자신이 원하는대로 쓰고 있었다면 그런 설정들은 모두 날아가고 새로운 설정으로 다시 만들어져버려서 사용자가 화가날수도 있습니다.












알림채널 그룹(Notification Channel Group)


알림채널뿐만 아니라 알림채널 그룹이라는 개념도 추가되었습니다.

트위터처럼 여러 계정을 로그인하게 해주는 앱이거나 개인용도/업무용도로 앱을 나누어서 사용할 수 있는경우 Notification Channel Group을 활용하면 좋습니다.

그룹ID와 이름을 지정해서 NotificationChannelGroup을 만들어주고 NotificationManager의 createNotificationChannelGroup()를 호출해주면 됩니다.

또한 채널을 만들때 setGroup()으로 해당 채널을 어느 그룹에 포함시킬지 지정해주면 됩니다.



트위터의 경우, 사용자의 계정이름을 Notification Channel Group 이름으로 사용하여 각 사용자별로 알림을 지정할 수 있도록 지원합니다.








기타: 삽질하면서 알게된것들



알림채널을 대응하기위해서 여러가지 앱들을 설치해서 테스트 해보던중에 특이한것을 발견하였습니다.


     


채널처럼 생겼지만 다른채널과는 다른 'Uncategorized' 라는걸 발견하게 되었습니다.

심지어 알림에대해서 설정할수도 없으며 'Let the app decide'라고 다른 채널의 설정과는 다르게 쓰여져 있습니다.


뭔가 채널이 지정되지 않은 알림은 이 채널에 속할것 같은 느낌적인 느낌이 있었습니다.

하지만 어떻게 저걸 만들어 내는지 알지 못했습니다.

공식 문서를 뒤져봐도 관련된 언급이 없었습니다.


그러던중 재현하는 방법을 알게되었습니다.

이러한 현상은 라이브러리를 사용하고 있을때 앱의 targetSdkVersion은 25이하이지만, 라이브러리의 targetSdkVersion이 26이상인경우에서 발생합니다.

물론 위와같은 상황에서도 채널을 1개도 만들지 않는다면 상관없지만 채널을 1개라도 만들경우 'Uncategorized' 가 생성됩니다.

Notification을 만들때 channel id를 지정하지 않으면 이 Notification은 'Uncategorized'에 속하는것을 확인했습니다.






지금까지 구현사항에 대해서 샘플을 만들어두었으니 아직 감이 안오시는분들은 참고하시기 바랍니다.

https://github.com/ParkSangGwon/NotificationChannelSample

(여러분의 Github의 Star 눌러주시는 센스!)


안드로이드 공식페이지에서도 Notification Channel에 대해서 확인해보실 수도 있습니다.

https://developer.android.com/guide/topics/ui/notifiers/notifications.html#ManageChannels

(한국어로 설정하시면 보이지 않습니다. 언어를 영어로 선택하셔야 보여집니다.)




지금까지 안드로이드 8.0 오레오에서 추가된 알림채널(Notification Channel)에 대해 포스팅 해보았습니다.

어때요 참 쉽죠?



알림채널(Notification Channel)에 대해서 이해하고 나서 유용한 알림관리 방식이라는걸 느끼게 되었습니다.

잘 알려진 여러 앱들을 다운받아봐서 확인했을대 아직 알림채널에 대해서 대응한 앱은 많이 보이지 않았습니다.

하지만 마시멜로우 권한대응때처럼 점점 이 기능에 대한 대응이 필요하게 될것입니다.

여러분 모두 오레오 기기의 점유율이 늘어나기전에 새로운 변화에 대응해서 좋은 앱서비스 품질을 유지하셨으면 좋겠습니다.

감사합니다.





안드로이드 개발자끼리 소통하기위한 오픈채팅방을 만들었습니다.

안드로이드 관련 Q&A및 팁을 공유하는 곳입니다.

관심있으신분들은 참여해보세요.

https://open.kakao.com/o/g8rSGB

Comments