BOID

[iOS] 로컬알림 구현하기 - HoonIOS 본문

IOS 시작기

[iOS] 로컬알림 구현하기 - HoonIOS

HoonIOS 2021. 4. 13. 12:09
728x90

안녕하세요 HoonIOS입니다. :)

우선 로컬 알림이란?

- 앱 내부에서 만든 특정 메시지를 iOS 알림 센터를 통해 메시지를 전송하는 방식입니다.

 

boidevelop.tistory.com/58

 

[iOS] 로컬알림이란? - HoonIOS

안녕하세요 HoonIOS입니다. :) 지금까지 메시지(알림창)인 alert에 대해 포스팅을 했습니다. 근데 메시지를 사용하면 앱이 백그라운드에 있거나 앱이 종료되어있을 때 알림이 가지 않는 단점이 있습

boidevelop.tistory.com

 

이번 포스팅에는 제일 기본적으로 앱이 백그라운드 상태로 돌아간이후 5초 이따가 로컬 알림이 발생하게 구현해보겠습니다.

 

제일 먼저 로컬 알림을 하기 위해서는 UserNotification프레임워크를 import 해야 합니다.

 

* 코드 설명

- AppDelegate.swift파일에서 import를 해줬는데요, 이 위치에다가 import를 해준 이유는 사용자에게 알림 권한을 받아줘야 하기 때문에 앱의 생명주기가 있는 AppDelegate에 imprt를 해줬습니다.

 

앱을 앱스토에서 다운을 받고 제일 먼저 실행이 될 때 무슨 화면이 제일 먼저 등장할까요? LaunchScreen? 아닙니다.

정답은 알림 허용 여부나 위치 허용 여부 같이 설정 권한 환경의 여부를 승인받는 창이 제일 먼저 등장합니다.

 

그러기 위해서 다음과 같이 설정을 해주겠습니다.

 

* 코드 설명

- 이 코드 부분은 알림 설정 버전을 정의하고 사용자에게 알림 설정 환경을 승인받기 위한 과정입니다. 

- 만약 Don't Allow를 하면 따로 애플리케이션의 환경설정 가서 바꿔주지 않는 이상은 알림을 받지 않습니다.

- 하나씩 한번 살펴보겠습니다.

- #available은 iOS 버전을 지정해주는 것으로 iOS 10.0 이상부터 사용 가능하다고 지정을 해준 것입니다.

( UserNotification은 10.0 버전 이후의 로컬 알림이므로 지정을 따로 해준 것입니다. )

- UNUserNotificationCenter는 싱글톤 패턴이므로 따로 인스턴스를 생성하면 안 된다고 했습니다. 따라서 해당 인스턴스를 받아오기 위해서 UNUserNotificationCenter.Current( )의 방법을 사용합니다.

- 인스턴스를 받아왔으니 이제 알림 권한 창에서 Allow 한 값을 받아와야 합니다. 그러기 위해서는. requestAuthorization메서드를 호출하여 알림 정보를 받아옵니다.

-. requestAuthorization 메서드의 첫 번째 인자 값의 options는 알 림메 시지에 포함된 항목들로 여러 항목으로 한꺼번에 입력받을 수 있도록 배열 타입으로 정의가 되어있습니다.

여기서는. alert(알림 창),. sounds(알림 소리),. badges(앱 아이콘 메모리에 표시되는 배지)를 알림 메시지에서 포함되고 있습니다.

 

※ UNAuthorizationOptions 열거형 객체

  •  carPlay
    - CarPlay 환경에서 화면 알림 기능
  • criticalAlert
    - 방해금지모드, 음소거 같은 환경에서도 critical Alert를 재생합니다.
  • providesAppNotificationSettings
    - 호출해주기 위한 원하는 뷰컨트롤러를 띄어주는 역할을 합니다.
  • provisional
    - notification의 알림센터에만 알림이 오고 나머지에서는 알림이 등장하지 않습니다.
  • announcement
    - 에어팍으로 메시지를 자동으로 읽게해주는 기능을 시리에게 추가하는것입니다. 

 

- 배열에 설정된 항목들은 그대로 사용자에게 전달되어 알림 동의를 위한 정보에 사용이 됩니다.
( 아래 사진을 보면 위에 추가한 3가지 요소들이 포함되어 있는 것을 보실 수 있습니다. )

- requestAuthorization뒤에 있는 클로저의 첫 번째 매개변수 didAllow는 알림 동의 여부를 전달을 받고 있고 두 번째 매개변수의 e는 오류 발생 시 사용하는 오류 객체 타입으로 되어있습니다. 

따라서 사용자가 알림 동의를 했는지 확인하기 위해서는 didAllow를 이용해서 구분하면 되고 오류가 발생했을 때 오류를 알고 싶으면 e를 사용하면 됩니다.

※ 참조

- application(_:didFinishLaunchingWithOptions:) 메서드는 생명주기 메서드로 앱이 실행될 때 제일 처음 호출되는 메서드입니다. 

- 이 메서드는 앱에 사용할 클래스와 리소스들이 모두 메모리에 업로드가 되고 애플리케이션의 첫 화면을 모바일 디바이스에 띄우기 직전! 바로 직전! 에 실행이 됩니다.

-  그럼 꼭 이 생명주기 메서드 & 앱이 시작할 때 앱의 설정 승인을 받아와야 하나요?라는 궁금증이 생기실 수도 있는데 

꼭! 그럴 필요까지는 없습니다. 그렇지만 대부분의 경우에 앱이 처음 실행될 때 동의를 받기 때문에 이 메서드에 구현하는 것이 좋습니다. :)

 

 

이제 로컬 알림을 설정해 보겠습니다.

 

알림이 울릴 조건을 정하는 건데 저는 sceneDelegate.swift파일의 sceneWillResignActive메서드에서 설정을 해줬습니다. 이 메서드는 앱이 활성화 상태에서 백그라운드 상태로 돌아갈 때 실행되는 메서드입니다. 

( 그냥 원하시는 조건에 설정을 해주시면 됩니다. :)

 

* 코드 설명

- 알림 메시지를 그냥 아무한테나 보내면 안 되잖아요? 사용자가 알림을 허용해줬을 때에만 확인을 하고 보내줘야 합니다. 

따라서. getNotificationSettings( )를 통해 확인을 할 수 있습니다.

#. getNotificationSetiings란?

- 이 앱에서의 알림 세팅을 요구하는 메서드입니다.

- if문을 보면 setting이라는 인자 값을 통해 이 알림의 권한 상태인. authorizationStatus와 알림 상태를 allow해준 상태를 반환하므로 만약 두 상태가 같으면 사용자가 알림을 허용해준 것입니다.

( 반대로 UNAuthorizationStatus값이. authorized가 아니라면. denied를 반환하게 되는데 이경우 사용자가 허용하지 않았으므로 발송하면 안 되겠죠? )

 

이제 사용자의 동의를 받았다고 치면 알람메시지를 보낼 로컬 알림 객체를 만들어야 합니다.

* 코드 설명

- 발송할 내용을 정의하기 위한 UNMutableNotificationContent객체를 생성했습니다.

- 이 객체에는 사용자에게 보여주기 위한 타이틀이라든지, 서브타이틀, body, badge 등을 추가할 수 있습니다.

 

그럼 추가할 수 있다고 하니 추가해볼까요? 발송할 내용, 시각, 메시지, 사운드 등, 배지 등등을 담아보겠습니다.

 

제일 먼저. badge속성에 대해 알아보겠습니다.

* badge 설명

-. badge속성은 앱 아이콘에 표시되는 값입니다. 즉 사용자가 확인을 안 한 알림이 있다고 표시를 해주는 것입니다.

( 카톡을 안 읽었을 때 오른쪽 위에 표시된 숫자라고 생각을 하시면 됩니다. )

※ 참조

- 만약 나는 badge를 넣기 싫다!라고 하면 위에 선언해줬던 options부분에서 뱃지를 빼 주면 됩니다.

 

badge를 값을 넣어주겠습니다. :)

 

* 코드 설명

- badge는 UNMutableNotificationContent의 알림을 담는 객체에 정의를 해줄 수 있습니다.

- UNMutableNotificationContent객체의 badge속성에 1을 넣어줍니다.

 

title, subtitle, body에 대해 알아보겠습니다.

* title, subtitle, body 설명

- subtitle은 UserNotificationCenter에서 생긴 속성입니다.

- body는 전달하고 싶은 내용을 넣을 수 있으며 긴 문장도 전달이 가능합니다.

- subtitle은 생략되는 경우가 많은데 title 하고 body는 거의 둘이 세트로 쓰입니다.

 

그럼 이제 로컬 알림의 알림 창에 표시될 title과 subtitle, body를 표시해주겠습니다.

* 코드 설명

- UserNotficationCenter객체에 속성을 추가해줍니다.

 

알림을 울렸을 때의. sound에 대해 알아보겠습니다. 이것은 알림이 도착했을 때 울리는 것으로 카톡에서는 카톡, 당근 마켓에서는 당근~이라는 알림 소리 같은 게 여기서 설정이 됩니다.

 

* 코드 설명

- 여기서는 기본적으로. default값을 설정해주었지만 아무 소리를 안 나게 설정해줄 수도 있고 직접 제작한 사운드를 설정할 수도 있습니다.

 

알림 메시지를 identifier 할 UserInfo에 대해 알아보겠습니다.

 

* 코드 설명

- 이건 화면에 표시되지는 않지만 이 알림을 눌러서 연결되는 앱 델리게이트 메서드에서 알람을 식별할 때 사용합니다.

- 알림 메시지를 클릭했을 때 뭔가를 처리해주기 위해서 추가 데이터가 필요하면 이 속성에 커스텀 데이터를 정의하여 전달을 하면 됩니다.

- 예를 들어 다른 곳에서 if문을 걸어 key값이 value가 맞으면 해당 로컬 알림을 불러올 수 있습니다. :)

( 이것은 싱글톤이기에 가능한 거겠죠? )

 

이제 UserMutableNotificationCenter의 알림 창에 넣을 속성 값을 다 지정해 주었습니다.

 

이제는 UNTimeIntervalNotificationTrigger인 알림 발송 시간 설정에 대해 알아보겠습니다.

 

* 코드 설명

- 알림 발송 보낼 시간을 설정하는 것으로 UNTimeIntervalNotificationTrigger는 몇 초 후에 발생하는 시간을 설정하는 객체입니다.

- 위 코드에서는 timeInterval인자 값을 5를 줌으로써 5초 후에 자동 발송한다고 설정했습니다.

( timeInterval의 단위는 초단위입니다. )

- 두 번째 인자 값은 repeats는 반복을 설정해주는 매개변수로 false를 줌으로써 반복하지 않게 설정을 해주었습니다.

- 따라서 위 코드는 5초 뒤에 반복하지 않게 설정해주세요라고 하는 것입니다.

※ 추가 설명

- 만약 특정 시각을 지정해서 알림 메시지를 전송하려고 하면 UNCalendarNotificationTrigger로 지정을 해주면 됩니다.

지금까지 구성한 발송 조건 객체들을 알림 요청하는 UNNotificationRequest객체로 만들면 됩니다.

 

* 코드 설명

- 이 객체는 세 개의 인자 값을 이루어져 있습니다.

  • 첫 번째 인자 값 identifier는 해당 알림의 식별자 아이디
  • 두 번째 인자 값 content는 알림에 발송할 내용
  • 세 번째 인자 값 trigger는 발송 시각 조건

각 인자 값에 해당하는 내용을 넣어주면 됩니다.

- 식별자는 여러 개의 알림 중에서 알림을 식별할 때 많이 사용을 합니다.

 

알림 요청 객체까지 모두 생성을 했으니 알림 발송을 담당하는 센터인 UNUserNotificationCenter에 추가해주면 끝이 납니다.

 

* 코드 설명

- 노트피케이션센트는 iOS의 스케줄링에 해당 로컬 알림을 등록하고 정해진 시간에 발송을 하는 역할이므로. add함수를 통해 요청 객체를 스케줄링에 등록을 해주면 됩니다.

 

 

처음부터 쭈우욱 순서대로 차례대로 설명을 했습니다. 근데 너무 길고 복잡하기도 해서 순서대로 정리를 한번 해보겠습니다. :)

 

※ 정리

  1. AppDelegate에 userNotification을 import해줍니다.
  2. UNUserNotificationCenter의 .requestAuthorization을 통하여 사용자 알림설정 허용 여부 메시지를 표출합니다.
  3. 사용자가 알림을 설정해줬을때 알림을 받을수 있게 조건문을 설정해 줍니다.
  4. UNMutableNotificationContent( )를 통해 알림 객체를 생성하고 전달 메시지, 사운드, 배지를 설정해줍니다.
  5. UNTimeIntervalNotificationTrigger나 UNCalendarNotificationTrigger을 통해 알림 전송 시각, 몇초후 알람을 보낼지 설정해줍니다.
  6.  4, 5번에서 생성해준 객체를 UNNotificationRequest에 넣어줘서 알림 요청 객체를 생성해줍니다.
  7. 마지막으로 6에서 최종 생성된 알림 요청 객체를 UNUserNotificationCenter에 등록을 해줘 스케줄링 센터에 값을 등록한 다음 정한 시간에 알림을 보내줍니다.

 

이제 위에서 생성해준 로컬 알림이 작동하는지 확인해 보겠습니다.

로컬 알림을 띄우는 방법에 대해 알아봤습니다.

 

다음에는 알림을 처리하는 것에 대해 알아보겠습니다 ㅎㅎ

반응형
Comments