SwiftUI UserNotifications 만들기

반응형
728x90
반응형
(Image Ref: Local Notifications in Swift 5 and iOS 13 with UNUSerNotificationCenter)
 
 
Introduction

  이번포스팅은 메인 이미지와 같이 iOS App을 이용할 때, 특정 시간, 혹은 특정 조건을 만족할 때 사용자에게 알려주는 알림메시지 구현방법에 대해 알아보려고 합니다. 알림 메시지는 특정 시간이 경과 후, 특정 일자 및 시간, 특정 위치에 대해 in/out 할때 등의 조건들이 있습니다.  본 포스팅은 가장 먼저 사용자 알림설정을 위해 권한설정을 살펴보고, UserNotification 예제를 살펴보도록 하겠습니다. 그리고 기본 소스코드에서 트리거(Trigger)만 변경하여 알림 설정 하는 방법을 알아보도록 하겠습니다. 

 

 

 
권한 설정

 
Notification 알림 설정을 위해서 info.plist 파일에 아래의 정보를 추가 합니다.
  • Application supports indirect input events : YES
 
권한 설정을 하지 않으면, project build는 되지만, 앱 실행시 notification alarm을 확인 할 수 없습니다. 
 
 
Local Notification 구현

SwiftUI에서 LocalNotification 구현하기 블로그의 소스코드를 가지고 확인을 해보도록 하겠습니다. (영문 원본 페이지는 참조: Local Notifications in Swift 5 and iOS 13 with UNUSerNotificationCenter 와 같습니다.) 향후 변경된 내용을 위해 블로그의 내용을가지고 선행학습을 합시다.  참조로만 사용하고 싶지만, 시간이 지나 오래되면 각 블로그들이 폐쇄됨에 따라 소스코드 일부를 본 블로그에 사용합니다. 
 
 
ContentView.swift
import SwiftUI

struct ContentView: View {
     func setNotification() -> Void {
           let manager = LocalNotificationManager()
           manager.requestPermission()
           manager.addNotification(title: "This is a test reminder")
           manager.schedule()
           //manager.scheduleNotifications()
         }
       
       var body: some View {
           VStack {
               Text("Notification Demo")
               Button(action: { self.setNotification() }) {
                   Text("Set Notification!")
               }
           }
       }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
 
LocalNotificationManager.swift
import Foundation
import UserNotifications

struct Notification {
    var id: String
    var title: String
}


class LocalNotificationManager {
    var notifications = [Notification]()
    
    func requestPermission() -> Void {
        UNUserNotificationCenter
            .current()
            .requestAuthorization(options: [.alert, .badge, .alert]) { granted, error in
                if granted == true && error == nil {
                    // We have permission!
                }
        }
    }
    
    func addNotification(title: String) -> Void {
        notifications.append(Notification(id: UUID().uuidString, title: title))
    }
    
    func schedule() -> Void {
          UNUserNotificationCenter.current().getNotificationSettings { settings in
              switch settings.authorizationStatus {
              case .notDetermined:
                  self.requestPermission()
              case .authorized, .provisional:
                  self.scheduleNotifications()
              default:
                  break
            }
        }
        
    }
        
    
    func scheduleNotifications() -> Void {
        for notification in notifications {
            let content = UNMutableNotificationContent()
            content.title = notification.title
          
            content.sound = UNNotificationSound.default
            content.subtitle = "This is Subtitle : UserNotifications tutorial"
            content.body = "This is Body : 블로그 글 쓰기"
            content.summaryArgument = "Alan Walker"
            content.summaryArgumentCount = 40
            
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
            let request = UNNotificationRequest(identifier: notification.id, content: content, trigger: trigger)
            
            UNUserNotificationCenter.current().add(request) { error in
                guard error == nil else { return }
                print("Scheduling notification with id: \(notification.id)")
            }
        }
    }
}
 

 

 

수행결과
 
결과는 버튼을 선택하고, 홈버튼을 누르게되면 우측 그림과 같이 알람 메시지가 출력됩니다. 
 
 
알림 메시지 설정

  알림 메시지를 설정하기위해서는 UNMutableNotificationContent를 사용합니다. UNMutableNotificationContent를 사용하면 알림 메시지의 제목(title), 본문(body), 사운드(sound), 뱃지(badge) 설정이 가능합니다. 또한, launchImageName, userInfo, attachments 설정이 가능합니다. 
 
그리고 개발 페이지를 조금 더 살펴보면 Setting the Notification Summary 가 있습니다. 
  • Setting the Notification Summary
    • summaryArguments: String. (알림 메시지 분류(category))
    • summaryArgumentCount: Int (알림 메시지 수)
 
이부분을 설정하게되면 알림마다 각각의 AppName(category)를 가지게 됩니다. 그리고 각 카테고리별로 발생한 알림 메시지의 숫자가 있는데, 이 알림 메시지의 숫자가 증가하는 숫자는 summaryArgumentCount로 설정을 하면 됩니다. 
 
그외 Identifying the Content는 필요에 따라 찾아보고 사용하면 될 것 같네요!
 
 
트리거(UNNotificationTrigger) 설정

  트리거의 종류는 아래와 같이 4종류가 있습니다. 시간 경과(Time Interval), 캘린더(Calendar), 위치(Location), Push(?)로 구성 되어있습니다. 
 
상위 코드에서 트리거만 변경하면 쉽게 사용 가능합니다. 애플 공식 홈페이지에 나와있는 소스코드를 확인해보도록 하겠습니다. (각각의 페이지는 상위 트리거 링크를 이용하여 확인하시기 바랍니다.)
 
UNTimeIntervalNotificationTrigger
// Fire in 30 minutes (60 seconds times 30)
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: (30*60), repeats: false)

 

UNCalendarNotificationTrigger

var date = DateComponents()
date.hour = 8
date.minute = 30 
let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
UNLocationNotificationTrigger
let center = CLLocationCoordinate2D(latitude: 37.335400, longitude: -122.009201)
let region = CLCircularRegion(center: center, radius: 2000.0, identifier: "Headquarters")
region.notifyOnEntry = true
region.notifyOnExit = false
let trigger = UNLocationNotificationTrigger(region: region, repeats: false)
 
이제 사용하는 방법을 알아보았으니, 자신만의 UserNotification Library를 만들어서 사용하면 어떨까요?  
참…쉽..쉽죠??
728x90
반응형

댓글

Designed by JB FACTORY