본문 바로가기
개발/iOS

SwiftUI] 스위프트UI에서 UNUserNotificationCenter 사용하기

by lucidmaj7 2019. 11. 20.
728x90
반응형

지난번 포스트에서 iOS의 UNUserNotificationCenter를 이용해보는 예제를 알아 보았었다. 

 

이번에는 iOS13에서 발표된 SwiftUI를 이용하여 사용할 때는 어떻게 사용하는지 무엇이 다른지 알아 보겠다.

 

 

1. SwiftUI에서 viewDidLoad 함수 구현은 어떻게?

viewDidLoad는 iOS view생명주기(LifeCycle)에서 뷰가 로드된 후의 작업을 정의할 수 있다. 부모클래스의 함수를 override하여 정의한다. 대부분 윈도우의 MFC나 안드로이드나 이런 방식으로 정의 한다. 

swiftUI는 UI요소마다 Modifier를 설정하여 속성을 변경한다. SwiftUI에서 Action을 정의할 때에도 같은 방식으로 정의한다.

SwiftUI도 다를바가 없다. SwiftUI에서도 onAppear, onDisappear를 사용하여 뷰가 나타나거나 사라질 때의 작업을 정의 할 수 있다. 

 

참고: https://www.hackingwithswift.com/quick-start/swiftui/how-to-respond-to-view-lifecycle-events-onappear-and-ondisappear

 

How to respond to view lifecycle events: onAppear and onDisappear - a free SwiftUI by Example tutorial

Was this page useful? Let us know! 1 2 3 4 5

www.hackingwithswift.com

따라서 SwiftUI에서는 아래와 같이 정의 할 수 있다.

var body: some View {
      
        VStack{
            Text("Hello, Notification!")
            Button(action: {
                print("push button")
              
                
            }) {
                Text(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/)
            }
        }
       .onAppear {
                print("onAppear")
                //퍼미션을 요구한다.
                UNUserNotificationCenter.current().requestAuthorization(
                   options: [.alert,.sound,.badge], completionHandler: {didAllow,Error in
                   print(didAllow) //
                })
       }
    }

body의 최상위 뷰인 VStack 선언하고 VStack의 onAppear함수를 정의 해주면된다. 여기에 우리가 원하던 앱이 실행 되었을 때 퍼미션 요구 알림을 띄울 수 있다.

허용을 눌러라..제발

2. 버튼에 액션을?

이전의 Storyboard를 이용한 버튼 액션 정의는 버튼을 스토리보드에 추가하고 소스코드에 Action함수를 정의하여 연결 해주었다. SwiftUI에서는 이 모든 작업이 하나의 소스파일에서 정의된다. 

 

 VStack{
            Text("Hello, Notification!")
            Button(action: {
                print("push button")
                self.notiSet()
                
            }) {
                Text(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/)
            }
        }

버튼을 추가하고 action함수를 정의해 주면된다. 위 소스에서 self.nofiSet함수에 우리가 원하던 Notification설정이 정의 되어 있다.

 

 

전체 코드를 보자.

 

//
//  ContentView.swift
//  notiSwiftUI
//
//

import SwiftUI
import UserNotifications



struct ContentView: View {
    func notiSet() -> Void{
        let content = UNMutableNotificationContent()
                    content.title = "Test Cron"
                    content.subtitle = "알림입니다."
                    content.body = "알람이야....!!"
                    content.badge = 1
                    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats:false)

                    let request = UNNotificationRequest(identifier: "timerdone", content: content, trigger: trigger)
                    UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
    }
    
    
    var body: some View {
      
        VStack{
            Text("Hello, Notification!")
            Button(action: {
                print("push button")
                self.notiSet()
                
            }) {
                Text(/*@START_MENU_TOKEN@*/"Button"/*@END_MENU_TOKEN@*/)
            }
        }
       .onAppear {
                print("onAppear")
                //퍼미션을 요구한다.
                UNUserNotificationCenter.current().requestAuthorization(
                   options: [.alert,.sound,.badge], completionHandler: {didAllow,Error in
                   print(didAllow) //
                })
       }
    }
    
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

 

SwiftUI에서 코드는 위와 같다.

오히려 직관적이며 심플함이 느껴진다.

 

 

 

728x90
반응형

댓글