투케이2K

35. (ios/swift) 로컬 노티피케이션 알림 발송 및 확인 실시 - UNUserNotificationCenter 본문

IOS

35. (ios/swift) 로컬 노티피케이션 알림 발송 및 확인 실시 - UNUserNotificationCenter

투케이2K 2021. 10. 29. 19:02
반응형

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT


[소스 코드 : 뷰컨트롤러 : 알림 권한 요청 및 알림 보내기]

import UIKit

class ViewController: UIViewController {
    
    // MARK: - [액티비티 메모리 로드 수행 실시]
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        print("")
        print("===============================")
        print("[ViewController >> viewDidLoad() :: 액티비티 메모리 로드 실시]")
        print("===============================")
        print("")
        
        // [노티피케이션 알림 권한 요청 수행 실시]
        self.requestAuthNoti()
    }
    
    
    
    // MARK: - [사용자에게 노티피케이션 알림 권한 요청]
    let userNotiCenter = UNUserNotificationCenter.current()
    func requestAuthNoti() {
        let notiAuthOptions = UNAuthorizationOptions(arrayLiteral: [.alert, .badge, .sound]) // 노티 알림 설정 값
        self.userNotiCenter.requestAuthorization(options: notiAuthOptions) { (success, error) in
            // [success 부분에 권한을 허락하면 true / 권한을 허락하지 않으면 false 값이 들어갑니다]
            if let error = error {
                print("")
                print("===============================")
                print("[ViewController >> requestAuthNoti() :: 노티피케이션 권한 요청 에러]")
                print("[error :: \(error.localizedDescription)]")
                print("===============================")
                print("")
            }
            else {
                print("")
                print("===============================")
                print("[ViewController >> requestAuthNoti() :: 노티피케이션 권한 요청 응답 확인]")
                print("[success :: \(success)]")
                print("===============================")
                print("")
                // [알림 발생 실시]
                self.sendNotiMessage(_seconds: 1.0, _title: "title", _content: "content")
            }
        }
    }
    
    
    
    // MARK: - [노티피케이션 알림 전송]
    func sendNotiMessage(_seconds: Double, _title: String, _content: String) {
        print("")
        print("===============================")
        print("[ViewController >> sendNotiMessage() :: 노티피케이션 알림 전송 실시]")
        print("[_seconds :: \(String(_seconds))]")
        print("[_title :: \(String(_title))]")
        print("[_content :: \(String(_content))]")
        print("===============================")
        print("")
        // [알림 타이틀 및 내용 정의 실시]
        let notiContent = UNMutableNotificationContent()
        notiContent.title = _title // 타이틀
        notiContent.body = _content // 내용
        notiContent.badge = 1 // 뱃지 표시
        notiContent.sound = UNNotificationSound.default // 알림음 설정 [무음일 경우 진동]

        // [알림이 trigger 발생 되는 시간 설정]
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: _seconds, repeats: false)

        // [알림 값 설정 실시]
        let request = UNNotificationRequest(
            identifier: UUID().uuidString, // 식별자
            content: notiContent, // 알림 제목, 내용
            trigger: trigger // 발생 시간 정의
        )

        // [알림 추가 실시]
        self.userNotiCenter.add(request) { (error) in
            if let error = error {
                print("")
                print("===============================")
                print("[ViewController >> sendNotiMessage() :: 노티피케이션 알림 전송 에러]")
                print("[error :: \(error.localizedDescription)]")
                print("===============================")
                print("")
            }
        }
    }

}

[소스 코드 : AppDelegate : 알림 받기]

import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        print("")
        print("===============================")
        print("[AppDelegate >> didFinishLaunchingWithOptions]")
        print("[설명 :: 앱 프로세스 완료 및 앱 실행 실시]")
        print("===============================")
        print("")
        
        // MARK: [노티피케이션 알림 딜리게이트 지정]
        UNUserNotificationCenter.current().delegate = self

        return true
    }

    
    // MARK: UISceneSession Lifecycle
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        print("")
        print("===============================")
        print("[AppDelegate >> configurationForConnecting]")
        print("[설명 :: Scene 만들기 위한 구성 객체 반환 : 스토리보드 , info]")
        print("===============================")
        print("")

        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        print("")
        print("===============================")
        print("[AppDelegate >> didDiscardSceneSessions]")
        print("[설명 :: Scene 구성 객체 해제 실시]")
        print("===============================")
        print("")
    }
    
} // [AppDelegate 종료]



// MARK: - [노티피케이션 알림 딜리게이트 추가]
extension AppDelegate: UNUserNotificationCenterDelegate {
    
    // [앱이 foreground 상태 일 때, 알림이 온 경우]
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("")
        print("===============================")
        print("[AppDelegate >> willPresent :: 앱 포그라운드 상태 푸시 알림 확인]")
        //print("[userInfo :: \(notification.request.content.userInfo)]")
        print("===============================")
        print("")
        
        // [completionHandler : 푸시 알림 상태창 표시]
        completionHandler([.banner, .list, .badge, .sound])
    }

    // [앱이 background 상태 일 때, 알림이 온 경우]
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {

        print("")
        print("===============================")
        print("[AppDelegate >> didReceive :: 앱 백그라운드 상태 푸시 알림 확인]")
        print("===============================")
        print("")

        // [completionHandler : 푸시 알림 상태창 표시]
        completionHandler()
    }
}

 

[소스 코드 : SceneDelegate : 알림 뱃지 초기화]

    func sceneDidBecomeActive(_ scene: UIScene) {
        print("")
        print("===============================")
        print("[SceneDelegate >> sceneDidBecomeActive]")
        print("[설명 : Scene 활성화 및 사용자 이벤트에 응답 실시]")
        print("===============================")
        print("")

        // [앱 접속 시 : 푸시 알림 뱃지 카운트 초기화 실시]
        UIApplication.shared.applicationIconBadgeNumber = 0
    }

 


[결과 출력]


 

반응형
Comments