티스토리 뷰

728x90

푸시알림은 

서버를 사용해서 푸시를 보내는 Remote Notification

기기에서 푸시를 보내는 Local Notification 가 있으며

오늘은 Local Notification 에 대해 공부해 보겠습니다. 


이걸 만들어 볼거에요


구현

 

import 

푸시를 구현하기 위해 UserNotifications 프레임워크를 import 해옵니다.

import UserNotifications

 

알림 권한 요청

사용자에게 푸시 알림을 받을지 권한 허용 팝업을 띄워줍니다. 

 

 

위 팝업은 많이 보셨을거에요. 

사용자에게 알림권한을 허용받아야 알림이 가게돼요. 

먼저, 허용을 받기 위해 팝업을 띄워 주는걸 구현 해보겠습니다.

import UIKit
import UserNotifications

class NotificationViewController: UIViewController {
    // 1 
    // UNUserNotification.current() 인스턴스화
    let notificationCenter = UNUserNotificationCenter.current()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        notificationCenter.delegate = self
        
        // 2 
        // 사용자에게 푸시 권한 요청 함수호출
        requestNotificationAuthorization()
    }
    
    func requestNotificationAuthorization() {
    
	// 3
	// 알려줄 방식 (뱃지, 사운드)
        let authOptions: UNAuthorizationOptions = [.badge, .sound] 
        
        // 4
        // 위 '알려줄 방식들을' 권한 요청
        notificationCenter.requestAuthorization(options: authOptions) { granted, error in
            if let error = error {
                print("ERROR: \(error)")
            } else {
                print("didAllow ===> \(granted)")
            }
        }
    }

}

 

1. UNUserNotificationCenter를 사용할 수 있게 인스턴스화 시켜줍니다.

 

2. 화면이 로드된 직 후 알림 권한허용 팝업을 띄우기 위해 viewDidLoad() 
함수호출을 requestNotificationAuthorization() 해줍니다.

3. 팝업에서 알림기능중 어떤 기능을 허용할 건지 Array에 담아 넣어줍니다. 
-> [.badge, .sound]

 

4. requestAuthorization(options: ) 메소드를 사용하며, 
options에 3번 에서 Array에 담아놓았던걸 넣어주면 됩니다. 
마지막 completionHandler에 사용자가 권한을 허락해 줬는지 분기 처리를 해줍니다.  granted(결과값),  error(에러)

 


푸시 내용 전송

 

알림 내용을 전송하는데에는 세 가지 메소드가 필요합니다.

Content, Trigger, Request 인데요. 

하나씩 간단하게 설명해보자면

 

Content

 

알림 내용을 말하며, UNMutableNotificationContent() 를 사용해서 생설할 수 있습니다.

아래와 같이 인스턴스화 시켜줍니다. 

let notificationContent = UNMutableNotificationContent()

 

여러가지 프로퍼티 (속성) 들이 있지만, 여기선 title, body를 넣어 볼게요. 

 

@objc func sendNotification() {
        // Content 인스턴스화
        let content = UNMutableNotificationContent()
      
        // 알림 제목에 표현될 부분
            content.title = "여긴 제목 !!"
        // 알림 내용에 표현될 부분
            content.body = "여기엔 알림 내용이 나온다아"

    }

 

이렇게 하면 일단 Content 부분은 간단하게 구성이 됐고, 다음 trigger 를 알아볼게요.

 

 

 

trigger

 

알림을 언제 보내줄건지 조건을 정해주는 메소드에요. 

아래는 trigger가 발동되는 조건 입니다.

 

  • time interval: 시간 간격
  • calendar: 특정 시간
  • location: 위치

 

원하는상황에 맞게 알림을 보내면 되겠네요. 

저는 버튼을 누르면 5초 후에 알림이 가게 만들려고 해요. 

그럼 시간 간격 trigger로 할거니까 

UNTimeIntervalNotificationTrigger(timeInterval: TimeInterval, repeats: Bool) 를 쓰면 되겠죠.

 

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5.0, repeats: false)

 

메소드 인자에 원하는 값을 넣어 줍니다.

  • timeInterval: 알림이 얼마나 있다가 보내질건지 (초 단위)
  • repeates: 알림 반복
@objc func sendNotification() {
        let content = UNMutableNotificationContent()
      
        content.title = "여긴 제목 !!"
        content.body = "여기엔 알림 내용이 나온다아"

        // sendNotification이 호출되면 5초 후에 알림, 반복X
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5.0, repeats: false)

    }

 

 

request

 

content로 알림의 내용을 구현했고,

trigger로 언제 알림을 보낼지 정했습니다.

request를 사용하려면 UNNotificationRequest 클래스를 사용하면 되는데 아래처럼 세가지 파라미터를 받아요.

 let requests = UNNotificationRequest(identifier: String, content: UNNotificationContent, trigger: UNNotificationTrigger)

 

  • identifier: 알림 요청이 여러가지 있을때 구분할 수 있게 만들어주는 구분자 입니다. 
                       대부분의 경우 UUID().uuidString으로 구분해줍니다. (고유의 값을 자동으로 지정해줍니다.)
    print("uuid:", UUID().uuidString)
    // uuid: 57E3B304-C1EA-484E-96D7-2E21FF7FB974​
                       

  • content, trigger: 위에 content, trigger 만들었던 걸 여기에 넣어줍니다.
@objc func sendNotification() {
        let content = UNMutableNotificationContent()

        content.title = "여긴 제목 !!"
        content.body = "여기엔 알림 내용이 나온다아"
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5.0, repeats: false)
        
        // 요청할 구분자 지정
        let request = UNNotificationRequest(identifier: UUID().uuidString,
                                            content: content,
                                            trigger: trigger)

}

 

 

자, 이제 마지막 입니다. 

 

알림요청에 대한 모든 정보request에 들어있죠?

'이런 정보를 보낼거야 보내줘' 라고 notificationCenter (알림을 보내는 곳)에 알림 등록을 해줘야하는데요.

 

첫 부분 팝업 띄울때 만들었던 거요.

let notificationCenter = UNUserNotificationCenter.current()

 

알림등록을 해봅시다.

add(request:, withCompletionHandler:) 메소드를 이용하면 등록할 수 있는데요. 

notificationCenter.add(request: UNNotificationRequest, withCompletionHandler: ((Error?) -> Void)?)

 

  • request
    - request에 작성했던 부분을 이곳에 넣어줍니다.

  • withCompletionHandler
    에러 처리

 

아래는 버튼이 눌렸을 때 알람을 보내기 위한 전체 코드 입니다.

@objc func sendNotification() {
        let content = UNMutableNotificationContent()

        content.title = "여긴 제목 !!"
        content.body = "여기엔 알림 내용이 나온다아"
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5.0, repeats: false)
        
        let request = UNNotificationRequest(identifier: UUID().uuidString,
                                            content: content,
                                            trigger: trigger)
        
        // notificationCenter에 알림 등록
            notificationCenter.add(request) { error in
                if let error = error {
                    print("Notification Error: ", error)
                }
            }
    }

 

여기까지 하면 알림이 이제 올겁니다. 

다만, 백그라운드 상태, 앱이 꺼졌을때만 올거에요.

즉 앱이 켜진 상태 (Foreground) 에선 알림이 오지 않는데 

이 부분도 구현해 볼거에요.

 


 

앱 켜놓은 상태 (Foreground) 알림 받기

 

사용자가 앱을 사용중일 때도 알림이 오게 하고싶다면

AppDelegate.swift 에서 아래와 같이 코드 작업을 해줘야 합니다.

 

// AppDelegate.swift

import UIKit
import UserNotifications

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

	func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
                                                              // 1 
        UNUserNotificationCenter.current().delegate = self    // 추가
        return true
    }
}

extension AppDelegate: UNUserNotificationCenterDelegate {
    // 2
    // 앱 실행 중(Foreground) 알림을 수신했을때 실행되는 메소드
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.list, .banner])
    }
  }

 

1. didFinishLaunchingWithOptions에  UNUserNotificationCenter.current().delegate = self 를 추가 합니다.

 

2. UNUserNotificationCenterDelegate에

    userNotificationCenter(_:willPresent:withCompletionHandler:) 메소드를 선택합니다.

    해당 메소드는 앱을 띄워놓은 상태 (Foreground) 에서 알림을 받았을 때 실행됩니다.

 

여기까지 하게되면 알림을 앱이 실행중일 때도, 앱이 꺼졌을때도, 백그라운드상태일 때도 받을수 있게 됩니다.

 

 


요약

알림을 보내려면 

필수 메소드가 존재하며 (Content, trigger, request)

다 구현해도 Foreground에서 알림을 받을때는 

AppDelegate.swift 에서 추가로 코드를 작성해줘야합니다.

 

이번 블로깅을 하면서 UUID의 개념도 알게 되었고, 

trigger의 종류에서 location은 지금 앱 만드는기능에 추가해보고 싶고,

didFinishLaunchingWithOptions의 이해도도 조금은 생겼지만, 추후 정리해서 블로깅 해봐야겠습니다.

 


이해하는데 도움이 됐어요

@hope1053

onelife2live

김종권님

728x90