Sign In
Swift | 학습 내용 정리

[Swift - UIKit] iOS에서의 기본적인 Notification System

한결
알림센터나 사이드 푸쉬 등으로 특정 블록 형태의 UI가 뜨는 것을 Notification 이라고 한다. 카카오톡에서 친구가 채팅을 보냈을 때, 쿠팡에서 특가 상품이 떴을 때, 주변에 토스를 사용하는 사용자가 발견되었을 때와 같은 상황에서 주로 알림이 온다. 이런 기본적인 '알림'이라고 하는 것을 다룰 수 있는게 iOS Notification System이다.
내장된 User Notification Framework를 이용하여 쉽게 알림을 구현할 수 있다.
리모트 방식의 알림은 서버를 통해 인증된 유저에게만 보여줄 수 있기 때문에 APNs 라고하는 서비스를 거쳐야 한다.

Notification System의 두 가지 방식

Notification 방식은 Local, Remote 형태가 있다. 이름에서 두 방식의 차이를 대강 알 수 있다.
Local
알림에 전달할 내용이 전부 앱에 들어있다.
루틴한 내용이나 비슷한 컨텐츠를 전달해주는 용도로 사용된다. (디데이, 루틴, 투두 어플 등)
Remote
서버단에서 보내는 알림을 컨트롤하는 형식. (푸시 알림이라고도 함)
(서버에서 데이터가 오기 때문에) 유저가 알 수 없는 시간에 서로 다른 컨텐츠를 전달해주는 용도로 사용된다.
광고, 개인화된 추천, 채팅 알림(ex. 카카오톡 채팅별 알림) 등의 알림이 리모트 형식이다.

Notification System에서 유의해야 할 점

Notification이 동작하기 위해서는 반드시 유저에게 권한 동의를 받아야 한다. 아이폰의 여러 앱을 써보면 알겠지만, 앱을 처음 실행할 때나 앱을 실행시키고 있는 도중에도 계속 '알림'에 대한 권한을 획득하려고 하는 뷰가 나타난다. 어떤 앱에서는 '권한이 어떤 시점에서 부여되지 않았다'는 사실을 알려주는 alert을 보여줄 때도 있다.
User Authorization ==> Notification Request ==> Notify
애플에서는 알림에 대한 유저 동의 여부를 강하게 체크한다.
무분별하게 알림을 내뱉는 앱은 앱의 사용 경험을 넘어서 아이폰의 사용 경험 자체를 헤칠 수 있기 때문에 애플에서 권한 획득을 중요하게 생각하는 것 같다.
커머스나 앱 자체로 비즈니스 가치가 발생하는 서비스들은 사용자에게 알림 권한을 획득하기 위해서 노력한다.
앱이 종료된 시점에도 우리 서비스가 있고, 우리 서비스를 통해 새로운 이점을 얻을 수 있다는 사실을 알림을 통해 간편하게 전달할 수 있기 때문이다.
더불어, 애플은 Notification에 대해서 아래와 같은 정책을 운영하고 있다.
Notification은 고유한 identifier를 가진다. 하나의 앱에서 최대 64개의 identifier를 운영할 수 있다.
64개의 idendifier를 넘기면 앱이 종료될 수 있다. (무분별한 알림을 방지하는 장치인 것 같다.)
64개를 넘기기 전에 알림을 리프레시 할 수 있는 앱 내부 정책, 코드 관리가 필요해 보인다.
TimeInterval로 반복할 수 있는 최소 시간은 60초다.
60초 보다 적은 시간 단위로 동일한 알림을 반복할 수는 없다.
(역시 무분별한 반복적인 알림을 방직하는 장치로 보인다.)
Notification은 기본적으로 앱의 background에서 동작한다.
background는 앱이 켜져있지 '않은' 상태를 의미한다.
반대는 foreground인데, delegation을 통해서 앱이 실행중인 상태에서도 Notification이 오도록 설정할 수는 있다.
Notification Center나 배너 상태 등에서 유저가 Notification 자체를 인지했는지는 알 수 없다.
유저가 해당 알림을 터치했을 경우에만 확인할 수 있다.

UNUserNotificationCenter를 이용해서 간단하게 Notification을 구현해보자

// AppDelegate class AppDelegate { func application(.., didFinishLaunchingWithOptions) { UNUserNotificationCenter.current().delegate = self getAuthorization() // 런칭 시점에 권한을 획득하는 알럿을 띄우자. } } extension AppDelegate: UNUserNotificationCenterDelegate { func getAuthorization() { UNUserNotificationCenter.current().requestAuthorization( options: UNAuthorizationOptions(arrayLiteral: .alert, .badge, .sound)) { success, fail in if success { print("success") } else { if let fail { print(fail) } } } } }
AppDelegate 단에서 앱이 런칭되는 시점에 Notification에 대한 권한을 획득하는 코드를 추가하자.
UNAuthorizationOptions를 이용해서 획득하고자 하는 알림 형식을 정해줄 수 있다.
// 간단하게 알림을 관리하는 구조체를 작성해봤다. struct ControlNotification { enum NotificationInterval: Double { case byFiveSeconds = 5 case byOneMinute = 60 case byOneHour = 3600 case byHalfSingleDay = 43200 case bySingleDay = 86400 } static func sendNotification(_ t: String, body: String, seconds: NotificationInterval, repeats: Bool = false) { let content = UNMutableNotificationContent() content.title = t content.body = body let trigger = UNTimeIntervalNotificationTrigger(timeInterval: seconds.rawValue, repeats: repeats) let request = UNNotificationRequest( identifier: "inapp-repeat-noti-1", content: content, trigger: trigger ) UNUserNotificationCenter.current().add(request) } }
UNMutableNotificationContent, UNTimeIntervalNotificationTrigger, UNNotificationRequest 클래스로 Notification을 위한 인스턴스를 생성하여 알림을 제어하는 코드를 작성할 수 있다.
Ha
Subscribe to 'hankyeol'
Subscribe to my site to be the first to receive notifications and emails about the latest updates, including new posts.
Join Slashpage and subscribe to 'hankyeol'!
Subscribe
👍