SwiftUI UserNotifications Library

반응형
728x90
반응형
 
Introduction

 이전 포스팅 내용에 이어 SwiftUI를 이용하여 UserNotification 라이브러리와 관련된 내용을 포스팅하려합니다. 이번 포스팅은 Notification Library를 만들까? 혹은 cocoapods을 이용하여 라이브러리를 사용할까? 고민을 하다 라이브러리를 사용하는 방법에 대해 설명하고자 합니다. 사용하는 라이브러리는 DLLocalNotifications 라이브러리를 사용합니다. 이후에 필요한 부분은 직접 구현해서 사용하시면 됩니다. 
 

 

 

 

 
DLLocalNotifications Download & Install

DLLocalNotifications에 접속하면 cocoapods을 이용하여 설치하는 방법이 나와 있습니다. cocoapods을 이용하는 방법은 이전 포스팅을 확인 해주시기 바랍니다. 
 
아래는 간단한 명령문만 추가해두도록 하겠습니다.
 
 
  • Xcode Project path 에 들어가서 아래의 명령문 수행
    • pod init
  • 생성된 Podfile 에 아래의 내용 추가 
    • pod ‘DLLocalNotifications'
  • 명령문 실행
    • pod install
  • 프로젝트 실행
    • (projectName).xcworkspace // 프로젝트명 확인 필수 
 
 
권한 설정

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

 

 

 

 
NotificationMgr.swift

cocoapods 페이지에 나와있는 소스코드를 실행하기위해서는 몇가지 추가를 해둬야 합니다. 예를 들어 MapKit을 이용하는 코드와 사용자에게 권한 허용을 문의하는 메시지를 띄우는 부분을 추가해야합니다.  코드를 조금씩 살펴본 후, 전체적으로 보도록 하겠습니다. 
 
사용자 권한 획득 문의
 
func requestPermission() -> Void {
           UNUserNotificationCenter
               .current()
               .requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
                   if granted == true && error == nil {
                       // We have permission!
                       print(granted)
                   }
                   print(granted)
           }
       }
App 실행시 사용자에게 권한 획득을 위해 상위 코드를 추가합니다. 
 
Single fire notification
    func SingleFireNotificationRun() {
        
        let triggerDate = Date().addingTimeInterval(5) // sec

        let firstNotification = DLNotification(identifier: "test01", alertTitle: "test01-title", alertBody: "body01", date: triggerDate, repeats: .none)

        let scheduler = DLNotificationScheduler()
        scheduler.scheduleNotification(notification: firstNotification)
        scheduler.scheduleAllNotifications()
    }
cocoapods페이지에 나와있는 코드 입니다. 일부 수정하였고, 특정시간 경과 후 알림 메시지를 가시화 하는 코드입니다. 
이때, 특정 시간 경과를 위해, triggerDate 변수에 값을 입력해주시면 됩니다. 값은 초(sec)로 입력을 해주시면 됩니다. 그 외에는 이전 포스팅에서 확인하였던 것과 같이 title, body, repeats 등을 추가하시면 됩니다. 
 
Repeating Notification starting at a Date
    func RepeatingNotification() {
        let firstNotification = DLNotification(identifier: "test02", alertTitle: "test02-title", alertBody: "body02", date: Date(), repeats: .minute)

        let scheduler = DLNotificationScheduler()
        scheduler.scheduleNotification(notification: firstNotification)
        scheduler.scheduleAllNotifications()
    }
상위 코드는 repeats를 이용하여 반복을 지정할 수 있습니다. 반복은 아래와 같이 정의되어있으니 참고 바랍니다. 
public enum RepeatingInterval: String {
    case none, minute, hourly, daily, weekly, monthly, yearly
}
 
 
Notification that repeats from one Date to another with a time interval period
    func RepeatingNotificationR02() {
        let scheduler = DLNotificationScheduler()
        scheduler.repeatsFromToDate(identifier: "test03", alertTitle: "test03-title", alertBody: "body03", fromDate: Date().addingTimeInterval(0), toDate: Date().addingTimeInterval(300) , interval: 2, repeats: .none )
        scheduler.scheduleAllNotifications()
    }
상위 코드는 A(fromDate)시간으로부터 B(toDate)시간까지 간격C(interval)으로 알림을 가시화 하는 코드 입니다. 
 

 

 

 
Modifying elements of the notification
    func ModifyingNotification() {
        let firstNotification = DLNotification(identifier: "firstNotification", alertTitle: "Notification Alert", alertBody: "You have successfully created a notification", date: Date(), repeats: .minute)

        // You can now change the repeat interval here
        firstNotification.repeatInterval = .none

        // You can add a launch image name
        //firstNotification.launchImageName = "Hello.png"

        let scheduler = DLNotificationScheduler()
        scheduler.scheduleNotification(notification: firstNotification)
        scheduler.scheduleAllNotifications()
    }
상위 코드는 앞서 설명한 코드에서 추가로 수정이 필요할 경우 수정하는 방법입니다. 코드에 조금 오류가 있는데,  repeatInterval  변수가 접근권한이 없다고 나옵니다. swift(?) 의 버전 업 등으로 인해, 생긴 문제 같은데 해결 방법은 라이브러리파일(DLNotification.swift) 파일로 이동하여 아래와 같이 수정하시면 됩니다. 
public class DLNotification {
    
    // Contains the internal instance of the notification
    internal var localNotificationRequest: UNNotificationRequest?
    
    // Holds the repeat interval of the notification with Enum Type Repeats
    public var repeatInterval: RepeatingInterval = .none

    …(생략)

}
변수 앞에 “public” 만 추가해주시면 됩니다.
 
Location Based Notification
    func LocationBasedNotification() {
        
        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 locationNotification = DLNotification(identifier: "LocationNotification", alertTitle: "Notification Alert", alertBody: "You have reached work", region: region )

        let scheduler = DLNotificationScheduler()
        scheduler.scheduleNotification(notification: locationNotification)
        scheduler.scheduleAllNotifications()
    }
상위 코드는 latitude, longitude의 위치에 따라 알림 메시지를 띄워주는 코드입니다. 그리고 각 위치에 가까이 갈때, 혹은 멀어 질 때에 대해 설정을 notifyOnEntry, notifyOnExit로 설정이 가능합니다. 
 
Adding action buttons to a notification
    func AddingActionButton() {
        let scheduler = DLNotificationScheduler()
               
        let standingCategory = DLCategory(categoryIdentifier: "standingReminder")
               
        standingCategory.addActionButton(identifier: "willStand", title: "Ok, got it")
        standingCategory.addActionButton(identifier: "willNotStand", title: "Cannot")
               
        scheduler.scheduleCategories(categories: [standingCategory])
    }
(이부분은 실행을 해도 정확히 뭔지 모르겠네요… 추후 확인씨 추가 포스팅 하도록 하겠습니다)

 

 
Cancelling a notification
scheduler.cancelNotification(notification: notification)
마지막으로 알림메시지를 취소할 경우 상위코드와 같이 사용하시면 됩니다. 
 

 

 

 
ContentView.swift

이제 버튼을 눌려서 실행하기 위해서 다음과 같이 코드를 작성 하시면 됩니다. 
import SwiftUI

struct ContentView: View {
    func setNotification() -> Void {
        let manager = NotificationMgr()
        manager.requestPermission()
        
        manager.SingleFireNotificationRun()
        manager.RepeatingNotification()
        manager.RepeatingNotificationR02()
        
        //manager.ModifyingNotification()
        //manager.LocationBasedNotification()
        
        //manager.AddingActionButton()
      }
    
    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()
    }
}
이전 포스팅의 내용과 구성이 동일하니 참고 바랍니다. 
 
참고로, 알림 메시지는 총 64개까지 등록이 가능하다고 합니다. 64개라하니, eventselect socket 모델에 socket 이벤트를 감지하는 코드가 생각나네요. 그렇다고, App만들 때 64개의 예약만 만드시지는 않겠죠? 방법은 많이 있으니까~
알림 메시지에 대해 알아보았는데 참 쉽죠~? 아래 다른 라이브러리를 확이해보시고, 사용해보시기 바랍니다. 기능은 조금 더 많으나, 복잡해보이기도 하니까 조금만 노력하시면 확인 하실 수있습니다. 
 
 
Reference

 
 
728x90
반응형

댓글

Designed by JB FACTORY