엄코딩의 개발 일지

Notification Channels

프로젝트 작업중 푸시 기능 테스트가 필요한 작업이 있어 테스트 하던중 백그라운드 상태에서 앱의 알림이 오지 않는 

문제에 직면하게 되었습니다.

'기존 코드가 잘못되었나 ?' 라는 생각에 기존 코드들을 살펴보았고, 다른 기기로 테스트해보았습니다.

웬걸, 다른 기기는 잘되네요. 왜그럴까요?

바로 안드로이드 O ( 오레오 ) , 8.0버전부터는 Notification Channel을 따로 만들어야 알림을 받을 수 있습니다.

구글은 안드로이드 8.0 ( API 26 ) 부터 모든 알림을 채널에 할당하고, 각 채널에 대해 해당 채널의 모든 알림에 적용되는

시각, 청각 동작을 설정할 수 있습니다. 그리고 사용자는 이러한 설정을 변경하고 앱의 알림 채널을 방해하거나

눈에 띄게할지 결정할 수 있습니다.

채널을 지정하지 않은 경우 에러 테스트


만약, 안드로이드 8.0 이상에서 채널을 지정하지 않고 알림을 게시하는 경우 로그에 다음과 같은 에러가 뜹니다.

E/NotificationService: No Channel found for pkg=~~~~~

그리고 안드로이드 스튜디오가아닌 단말기에서도 채널을 지정하지 않고 알림을 게시하는 경우에 대한 시스템 경고를

아래의 방법을 통해 확인할 수 있습니다.


( 시스템 설정 -> 개발자 옵션 -> 알림 채널 경고 표시 활성화 )

위와 같은 설정 후 채널을 지정하지 않고 알림을 게시하면 다음과 같은 경고가 단말기에 표시되네요.


패키지명은 모자이크 처리했습니다.


채널이 "null"이라고 뜹니다. 


그럼 이제 오류의 원인이 명확해 졌으니, 오류를 해결해보도록 합시다.


Create a notification channel 

  1. NotificationChannel의 ID 객체를 생성.

  2. 시스템 설정에서 볼 수 있는 description을 설정. setDescription() ( 선택 사항 )

  3. 알림 채널 등록 createNotificationChannel()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
   
// Create the NotificationChannel
   
val name = getString(R.string.channel_name)
   
val descriptionText = getString(R.string.channel_description)
   
val importance = NotificationManager.IMPORTANCE_DEFAULT
   
val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel
.description = descriptionText
   
// Register the channel with the system; you can't change the importance
   
// or other notification behaviors after this
   
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    notificationManager
.createNotificationChannel(mChannel)
}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
   
// Create the NotificationChannel
   
val name = getString(R.string.channel_name)
   
val descriptionText = getString(R.string.channel_description)
   
val importance = NotificationManager.IMPORTANCE_DEFAULT
   
val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel
.description = descriptionText
   
// Register the channel with the system; you can't change the importance
   
// or other notification behaviors after this
   
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
    notificationManager
.createNotificationChannel(mChannel)
d


위 코드는 안드로이드 공식 홈페이지에서 권장하는 코드입니다.


만약 해당 채널의 기본 알림 동작을 추가해야할 필요가 있는 경우 enableLights(), setLightColor() 등의 메소드를 통해,


불빛, 색상, 진동패턴등 설정이 가능합니다.


( https://developer.android.com/training/notify-user/channels 참고 )


채널 아이디와, 이름을 설정하고, 채널은 한번만 생성해줍니다. 


저의 경우 앱이 시작할때 SharedPreference의 boolean값을 이용해서 채널을 한번만 만들어주었습니다.


채널을 생성한 후, 채널의 ID값을 Notification.Builder(context,CHANNEL_ID) 형식으로 넣어주면 됩니다.


저의 경우..



이미 deprecated 경고표시가 떠있었네요.


Builder의 인자값으로 context,CHANNEL_ID를 넣어주세요.



속이 시원합니다.


테스트해보시면 알림이 잘 오는 것을 확인해볼 수 있습니다.


테스트 단말기의 시스템 설정에서 알림 -> 해당 Application에 가보시면 알림 유형에 생성했던 noti channel이 보입니다.



위와 같은 화면까지 떴다면 이제 채널을 삭제해볼 차례입니다.


Delete a notification channel

채널을 지우는 것 또한 간단합니다.

deleteNotificationChannel() 메소드를 이용하면 됩니다.

// The id of the channel.
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val id: String = "my_channel_01"
notificationManager
.deleteNotificationChannel(id)


알림 설정 화면에는 스팸 방지 메커니즘으로 삭제된 채널 수가 표시됩니다.


앱을 재설치하거나 앱 데이터를 삭제하여 개발 기기의 테스트 채널을 삭제할 수 있습니다.


테스트는 채널을 여러 개 만들고 삭제해보시면 됩니다.


Create a notification channel group

알림 채널 그룹이라는 기능도 생겼습니다.

온라인 협업 툴인 Slack을 예를들어 설명해보겠습니다. 

평상시 개인적으로 사용할 때, 업무중에 공적인 일로 사용할 때 여러 알림 채널이 필요할 수 있습니다.

이러한 경우에 알림 채널 그룹을 사용하면 좋습니다.

알림 채널 그룹을 생성하는 코드는 다음과 같습니다.

// The id of the group.
val groupId = "my_group_01"
// The user-visible name of the group.
val groupName = getString(R.string.group_name)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))



그룹을 생성했으면 채널을 만들기전 ( createNotificationChannel() 메소드 호출 전 ) setGroup() 메소드를 사용하여


해당 채널이 어느 그룹에 속하는지 설정합니다.


저는 그룹을 두개로 나누어봤습니다. ( 테스트 삼아 )



상당히 많이 쓰이고 있는 기능이고, 유용한 기능이라고 생각합니다.


오늘도 또 한 번 버전별 동작 변경 사항 숙지에 대한 중요성을 깨닫습니다.


새로운 버전이 나오면 즉각 즉각 대응하는 습관을 갖도록 합시다 ㅎㅎ


읽어주셔서 너무 감사하고, 피드백 또는 조언 주시면 감사하겠습니다.


참고자료 : https://developer.android.com/training/notify-user/channels