본문 바로가기
👨‍💻 프로그래밍/🍎 iOS 개발

🍎 iOS에서 서버를 거치지 않고 알림 보내기 (UserNotifications)

by 개발자 진개미 2024. 8. 2.
반응형

뭘 하려는 건지?

한 마디로 아래와 같이 앱에서 알림을 보내려 하는 겁니다. 

 

보통 이러한 알림을 보내기 위해서는 APN이라는 서버를 따로 둬서 보내야 하는데요. (참고) 서버쪽에서 로직을 돌려야 하거나 인터넷의 특정 정보를 조건으로 알림을 보내야 한다면 여전히 그렇게 해야 합니다. 예를 들어 특정 책이 나올 때 알림을 보낸다고 하면 인터넷의 특정 정보를 주기적으로 확인해서 그 조건이 만족되면 알림을 보내야 하니 이 경우는 APN을 써야 합니다.

하지만 그렇지 않고 간단하게 반복되는 알림이라면 APN을 거치지 않고 비교적 간단하게 처리할 수 있습니다. 매일 특정 시간에 보낸다던가, 유저가 등록한 날짜마다 반복해서 보낸다던가...


UserNotification API

핵심은 UserNotification이라는 API입니다! (공식문서)

UNUserNotificationCenter에서 알림을 다 관리합니다. 여기에 요청을 보내면 얘가 적절한 때에 알림을 보내 줍니다. 유저가 알림에 관한 설정을 바꾸거나 동의를 철회한 것 등도 모두 여기서 확인할 수 있습니다.

알림을 보내달라는 요청은 UNNotificationRequest를 통해 해야 합니다. 얘는 3가지 정보를 받는데요.

  • 고유 아이디 (그냥 UUID로 해도 됩니다)
  • 알림 내용 (UNNotificationContent)
  • 알림을 언제 보낼 것인지 (UNNotificationTrigger)

 

import UserNotifications

// 오전 9시에 1번 보내는 알림
func addNotification() {
    let center = UNUserNotificationCenter.current()
	
    let addRequest = {
        let content = UNMutableNotificationContent()
        content.title = ""
        content.subtitle = ""
        content.sound = UNNotificationSound.default

        var dateComponents = DateComponents()
        dateComponenets.hour = 9
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

        let request = UNNotificationRequest(identifier: UUID().uuidString, content: center, trigger: trigger)

        center.add(request)
    }
	
    center.getNotificationSettings { settings in
        if settings.authorizationStatus == .authorized {
            // 알림을 설정해 놨을 때만 알림 요청 추가하기
            addRequest()
        } else {
            // 알림을 추가하지 않았으면 수락 요청하기
            center.requestAuthorization(options: [.alert, .badge, .sound] { success, error in
                if success {
                    addRequest()
                } else if let error {
                    print(error.localizedDescription)
                }
            }
        }
    }
}

개발 해 보기

큰 그림에서의 절차는 간단합니다.

  1. XCode에서 알림 관련 설정하기
  2. UNUserNotificationCenter 가져오기
  3. 알림 요청 만들기 (UNNotificationRequest)
  4. (아직 받지 않았다면) 유저에게 알림 보내도 되는지 허락 받기
  5. 알림 요청 추가하기

 

🐜 1 - XCode에서 알림 관련 설정하기

만약 info.plist에 알림 권한이 필요하다고 정확히 명시하지 않으면 앱을 키자마자 강제 종료됩니다. (!) 그래서 정확히 추가했는지 꼼꼼히 확인하고 테스트해야 합니다!

1. 먼저 Signing & Capabilities에 가서 Capability 추가 버튼을 누릅니다.

 

2. 다음으로 Push Notifications을 검색 후 추가해 주시면 됩니다.


🐜 2 - UNUserNotificationCenter 가져오기

간단합니다. UserNotificationsimport 하고

import UserNotifications

 

.current()를 사용해 가져오면 끝 입니다. 애플의 API에서 Singleton 패턴의 shared와 비슷합니다.

let center = UNUserNotificationCenter.current()

 


🐜 3 - 알림 요청 만들기 (UNNotificationRequest)

이제 가장 중요한 알림 객체를 만들어야 합니다. UNNotificationRequest는 조합이 너무 많아서 공식 문서를 찾아가며 필요한 걸 채택하는게 좋습니다. 일단 UNNotificationTrigger도 4가지가 있습니다. (공식문서)

UNCalendarNotificationTrigger 특정 날짜/시간에 보내는 알림
UNTimeIntervalNotificationTrigger 특정 시간 후에 보내는 알림 (5분 후 등)
UNLocationNotificationTrigger 특정 장소에 가면 보내는 알림
UNPushNotificationTrigger APN 서버에서 결정해 보내는 알림

 

Trigger를 선택했다면 Content를 채워 넣으면 됩니다. 만약 주기적으로 반복되는 알림이라면 로직을 처리해 두면 되는데 테스트를 철저히 하는걸 추천 드립니다... 저는 여기서 굉장히 많은 실수를 했습니다.

 


🐜 4 - (아직 받지 않았다면) 유저에게 알림 보내도 되는지 허락 받기

우선 유저가 알림을 허가했는지 안 했는지를 설정에서 가져와야 합니다. 우선 UNNotificationCenter의 getNotificationSettings를 사용하면 closure안에서 settings를 사용할 수 있고, 여기에서 authorizationStatus를 가져올 수 있습니다.

center.getNotificationSettings { settings in
	let authorizationStatus = settings.authorizationStatus
}

authorizationStatus는 5개가 있는데요. (공식문서) 각각 적절한 처리를 해 주시면 됩니다.

notDetermined 아직 1번도 유저한테 안 물어봄
denied 유저가 알림 받는 걸 거부함
authorized 유저가 알림 받는 걸 허락함
provisional 임시로 방해되지 않는 알림만 보내는 걸 허락함
ephemeral 일시적으로 특정 시간에만 보내는 걸 허락함

 

만약 notDetermined라면 수락창을 요청할 수 있습니다. (denied라면 설정에서 켜 달라고 UI에서 안내해야 합니다.)

center.requestAuthorization(options: [.alert, .badge, .sound] { success, error in
    if success {
        // 허락한 경우 로직
    }
}

 


🐜 5 - 알림 요청 추가하기

알림 요청은 UNNotificationCenter.add()를 사용해서 UNNotificationRequest를 추가하면 끝입니다!

center.add(request)

참고


반응형