티스토리 뷰
푸시알림은
서버를 사용해서 푸시를 보내는 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의 이해도도 조금은 생겼지만, 추후 정리해서 블로깅 해봐야겠습니다.
이해하는데 도움이 됐어요
'iOS' 카테고리의 다른 글
[iOS] 빈화면 터치시 TextField 키보드 내리기 (0) | 2022.02.27 |
---|---|
[iOS] 생명주기 메소드 AppDelegate & SceneDelegate (Lifecycle method) (0) | 2022.02.25 |
구조체(Struct)/ 클래스 (Class) (0) | 2022.02.16 |
[iOS] Alamofire - GET (0) | 2022.02.13 |
[iOS] UITextField placeholder 위치 조정 (0) | 2022.02.11 |
- Total
- Today
- Yesterday
- Swift inout
- RIBs tutorial
- Swift init
- iOS error
- Swift final
- Swift 프로퍼티
- swift property
- Swift joined()
- swift protocol
- Swift Error Handling
- RTCCameraVideoCapturer
- Swift ModernRIBs
- swift (programmers)
- 원티드 프리온보딩
- 2023년 회고
- CS 네트워크
- Swift
- swift 고차함수
- swift reduce
- removeLast()
- Swift 프로그래머스
- Swift RIBs
- Combine: Asynchronous Programming with Swift
- Swift Leetcode
- Class
- ios
- Swift 내림차순
- Swift joined
- swift programmers
- Swift 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |