도서 '꼼꼼한 재은 씨의 스위프트: 기본편'을 공부하면서 정리한 내용입니다.
전체 목록은 여기에서 볼 수 있습니다.

  • 로컬 알림은 앱 내부에서 만든 특정 메시지를 iOS의 알림 센터를 통해 전달하는 방법이다
  • 앱이 종료되어 있거나 백그라운드 상태일 때 메시지를 전달할 수 있다
  • 로컬 알림을 구현하기 위해서는 UserNotification 프레임워크를 이용해야한다

💡 알림 승인 메시지창 띄우기


9F532B37-238A-406E-9DB0-062D5793411C.jpg
로컬 알림 또는 푸시 알림을 사용하기 위해 사용자에게 미리 승인받는 과정을 거쳐야 한다. 앱이 처음 실행되었을 때 알림 승인 메시지창이 뜨도록 해보자.

  1. open AppDelegate.swift
  2. import UserNotifications
  3. application메소드에 코드 추가 (앱이 처음 실행될 때 호출되는 메소드)
    let notiCenter = UNUserNotificationCenter.current()
    notiCenter.requestAuthorization(options: [.alert, .badge, .sound]) { (didAllow, e) in }

    let notiCenter = UNUserNotificationCenter.current() : 시스템에서 제공하는 인스턴스를 받아온다.
    notiCenter.requestAuthorization : 알림 설정 동의 메시지를 띄우는 메소드 호출한다.
    options: [.alert, .badge, .sound] : 메소드의 첫번째 인자값으로 알림 메시지에 포함될 항목들을 정한다. array type.
    { (didAllow, e) in } : 메소드의 두번째 인자값으로 클로져를 트레일링 형식으로 표현한 것이다. didAllow는 사용자가 알림 동의 메시지창에서 버튼을 눌렀을 때 동의 여부를 bool 타입으로 받는 매개변수이고 e는 오류 발생시 사용하는 오류 객체 타입의 매개변수이다. in뒤에 didAllow의 값에 따른 기능을 정의할 수 있다. 이를 이용하여 didAllow가 true일 때 디바이스 토큰 정보를 서버에 보내는 기능을 구현할 수 있다.

💡 앱이 비활성화일 때 알림 띄우기


2019-05-17 17-30-28.2019-05-17 17_32_19.gif
앱을 사용하는 도중 전화가 오거나 SMS가 도착하는 경우, 또는 홈 버튼을 눌러 앱을 백그라운드로 내렸을 때 앱은 비활성화가 된다. 앱이 비활성화가 되면 호출되는 메소드를 이용해서 로컬 알림을 띄워보자.

  1. open AppDelegate.swift

  2. applicationWillResignActive메소드에 코드 추가 (앱이 비활성화일 때 호출되는 메소드)

    UNUserNotificationCenter.current().getNotificationSettings { settings in
     if settings.authorizationStatus == UNAuthorizationStatus.authorized {
       // 알림 동의 o
    
         let nContent = UNMutableNotificationContent()
         nContent.badge = 1
         nContent.title = "title"
         nContent.subtitle = "subtitle"
         nContent.body = "body"
         nContent.sound = UNNotificationSound.default
         nContent.userInfo = ["name": "sogih"]
    
         let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
             // 앱이 비활성화 되고나서 5초 후에 알림 발생, 반복x
         let request = UNNotificationRequest(identifier: "wakeup", content: nContent, trigger: trigger)
    
         UNUserNotificationCenter.current().add(request)
           //생성된 알림 요청 객체를 notification center에 추가
     } else {
         // 알림 동의 x            
     }
    }

    getNotificationSettings : 사용자가 Allow 버튼을 클릭했다면 getNotificationSettings 메소드의 인자값 클로저에 전달되는 settings 객체에서 .authorizationStatus 속성값은 UNAutorizationStatus.authorized로 저장된다.
    UNMutableNotificationContent() : 로컬 알림 발송 내용을 정의하는 객체
    UNTimeIntervalNotificationTrigger() : 로컬 알림 발송 조건을 정의하는 객체
    UNNotificationRequest() : 로컬 알림 요청을 정의하는 객체

💡 앱이 활성화일 때 알림 띄우기, 받은 알림 처리하기


2019-05-17 18-00-46.2019-05-17 18_02_58.gif

사용자가 알림 메시지를 클릭하여 앱을 실행시켰을 때 알림 메시지에 맞는 별도의 액션을 처리해 주어야 할 경우가 있다. 앱이 활성화 상태일 때도 알림이 뜨게하고, 사용자가 알림을 클릭했을 때 이를 감지할 수 있도록 하는 방법을 알아보자.

  1. open AppDelegate.swift

  2. AppDelegate 클래스 정의 부분에 UNUserNotificationCenterDelegate 프로토콜 추가

    class Appdelegate: UIResponder, UIApplicationCenterDelegate, UNUserNotificationCenterDelegate {
    }

    UNUserNotificationCenterDelegate : 이 프로토콜에 '앱이 실행되는 도중에 알림 메시지가 도착하면 호출되는 메소드'와 '사용자가 알림 메시지를 클릭하면 호출되는 메소드'가 정의되어있다.

  3. apllication 메소드에 코드 추가

    notiCenter.delegate = self 
     // 알림 메시지 클릭 이벤트를 앱 델리게이트 클래스가 감지할 수 있도록함
  4. AppDelegate 클래스 내부에 userNOtificationCenter(_:willPresent:withCompletionHandler:) 메소드를 구현 (앱이 실행 중이건 아니건 알림 뜬다)

    // 앱이 실행되고 있는 중에도 알림 메시지가 도착하면 호출되는 메소드
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
         completionHandler([.alert, .badge, .sound])
    }
  5. AppDelegate 클래스 내부에 userNotificationCenter(_:didReceive:withcompletionHandler:) 메소드를 구현 (알림을 클릭했을 때 실행할 액션 정의)

    // 사용자가 알림 메시지를 클릭하면 호출되는 메소드
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    completionHandler()
    print("\(response.notification.request.identifier) 알림을 누르셨네요")
     // 알림의 식별자를 참조함
    }