본문 바로가기
Xcode/IOS

IOS) Local Notification을 이용해보자 2부

by 후르륵짭짭 2020. 11. 25.
728x90
반응형

 

안녕하세요 후르륵짭짭 입니다.

이번엔 저번에 이어서 Local Notification에 대해서 알아보려고 합니다!!ㅎㅎㅎ

2020/11/22 - [Xcode/IOS] - IOS) Local Notification을 이용해보자 1부

 

저번에는 Local Notification에 대한 정의와 간단한 호출 방법 그리고 ForeGround에서 보여지는 방법에 대해서 공부 했습니다.

이번에는 Badge의 숫자를 줄이는 방법, 그리고 알림에 선택지를 만들어 주는 방법과 그에 따라서 상황에 맞게 기능을 작동 시키는 방법 등

여러가지를 알아보려고 합니다.

 

** 시작하기 **

 

 - Badge 초기화 하기 -

 //일반적인 Notification 호출 방법
 
 func generateNotification(){
        
        let content = UNMutableNotificationContent()
        
        content.title = "Hello World"
        content.body = "Main Script"
        content.sound = UNNotificationSound.default
        //화면에 보여지는 빨간색
        content.badge = 2
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
        let identifier = "Local Notification"
        let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
        
        notificationCenter.add(request) { (error) in
            if let err = error {
                print(err.localizedDescription)
            }
        }
         
    }

이러한 코드로 Notification을 호출 했습니다.

그때 content.badge = 2 로 되어 있는데, 이것은 백그라운드 상태로 갈 때, 우리 앱 아이콘 위에 빨간색으로 두개가 생깁니다.

하지만 아무리 눌러도 빨간색이 사라지지 않습니다 ㅎㅎㅎ.

따라서 이거에 대한 문제 해결 방법으로 UIApplication을 사용해줘야합니다.

 

하지만 여기서 알아야 할 것이, IOS13 버전 이후로는 Appdelegate에서 UI업데이트 역할일 SceneDelegate로 옮겨졌습니다.

따라서 각각 해줘야 합니다.

//뱃지 초기화 시키는 방법 IOS 13 이하
    func applicationDidBecomeActive(_ application: UIApplication) {
        UIApplication.shared.applicationIconBadgeNumber = 0;
    }
//뱃지 초기화 시키는 방법 IOS 13 이상
    func sceneDidBecomeActive(_ scene: UIScene) {
        // Called when the scene has moved from an inactive state to an active state.
        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
        
        UIApplication.shared.applicationIconBadgeNumber = 0;
    }

 

 - 알림 눌렀을 때, 특정 행동 취하기 - 

알림을 누르면 특정 행동을 할 수 있도록 만들어줘야합니다.

따라서 UNUserNotificationCenterDelegate 에서 didReceive 함수를 호출 해주세요.

//눌렀을 때, 특정한 활동을 수행 할 수 있도록 하기
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        
        if response.notification.request.identifier == "Local Notification" {
            print("Hello Local Notification")
        }

        completionHandler()
        
    }

여기서 response는 우리가 눌렀을 때 반응하는 객체입니다.

따라서 이전에 호출 함수에서 만든 identifier와 동일하게 response.notification.request.identifier 하게 해줍니다.

그리고 print()함수를 찍어주고 마지막에 completionHandler() 클로저를 수행 해서 마쳤음을 알려주세요!

이렇게 하면 원하는데로 print()가 호출 되는 것을 알 수 있습니다.

 

 - 알림을 누르면 특정 View로 이동하기 -

위에 처럼 그냥 Print()만 하면 무슨 의미가 있겠습니까?ㅎㅎㅎㅎ

그래서 이번에는 Navigation 상태에서 화면 뷰를 이동하는 것을 구현 해보도록 하겠습니다.

일단 IOS13 버전 부터는 SceneDelegate로 나눠져 있다고 설명 했습니다.

따라서 AppDelegate에 SceneDelegate의 rootView를 가져와야합니다.

 guard let rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController else {
               return
        }

이렇게 말이죠 ㅎㅎ

 let storyboard = UIStoryboard(name: "Main", bundle: nil)
        
        
        if response.notification.request.identifier == "Local Notification" {
            print("Hello Local Notification")
            
            if  let secondVC = storyboard.instantiateViewController(withIdentifier: "SecondViewController") as? SecondViewController,
                   let navController = rootViewController as? UINavigationController{

                navController.pushViewController(secondVC, animated: true)
                
            }
            
        }

그리고 위에 처럼 저렇게 구성 해줍니다 ㅎㅎㅎ

일반적인 Navigation과 동일한 방법 입니다 ㅎㅎㅎ

 

 - 알림에 특정 액션 취하게 해주기 -

이제 알림을 아래로 내리면 특정 활동을 취할 수 있도록 하겠습니다.

   //알람을 선택 적으로 주는 방법
    func CategoryNotification(input : String){
        
        let content = UNMutableNotificationContent()
        
        // Action 카테고리 이름
        let userActions = "User Actions"
        
        content.title = "\(input)"
        content.body = "\(input) show to you"
        content.sound = UNNotificationSound.default
        content.badge = 1
        
        // Action 카테고리 등록
        content.categoryIdentifier = userActions
        
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 5, repeats: false)
        let identifier = "Category Notification"
        let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
        
        notificationCenter.add(request) { (error) in
                   if let error = error {
                       print("Error \(error.localizedDescription)")
                   }
               }
       
        // Snooze Action 추가
        let snoozeAction = UNNotificationAction(identifier: "Snooze", title: "Snooze", options: [])
        // Delete Action 추가 wiht 빨간색 .destructive
        let deleteAction = UNNotificationAction(identifier: "Delete", title: "Delete", options: [.destructive])
        
        // 카테고리 서류 작성
        let category = UNNotificationCategory(identifier: userActions,
                                                     actions: [snoozeAction, deleteAction],
                                                     intentIdentifiers: [],
                                                     options: [])
        // 카테고리 등록
        notificationCenter.setNotificationCategories([category])
        
    }

코드가 복잡해 보이는데, 그냥 액션 등록을 해주는 것 입니다. 

일반적인 Local Notification 호출과 비슷한데, category가 추가 된 것 뿐 입니다.

위에 있는 것 그대로 사용하면 어느정도 이해가 될 것 입니다.

 

이제 AppDelegate에 가서 아래 처럼 해줍니다.

//눌렀을 때, 특정한 활동을 수행 할 수 있도록 하기
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        
        guard let rootViewController = (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.window?.rootViewController else {
               return
        }
        
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        
        if response.notification.request.identifier == "Local Notification" {,,,}
        
        //actionIdentifier에서는 화면 전환을 어떻게 하는지 잘 모르겠다.
        switch response.actionIdentifier {
            case UNNotificationDismissActionIdentifier:
                    print("Dismiss Action")
            case UNNotificationDefaultActionIdentifier:
                    print("Default")
            case "Snooze":
                    print("Snooze")
                
            case "Delete":
                    print("Delete")
            default:
                    print("Unknown action")
        }
        
        
        completionHandler()
        
    }
    

이렇게 response.actionIdentifier를 해주면 됩니다.

Default는 그냥 첫 알람 나오는 것을 클릭 했을 때 반응 하는 겁니다!

참고로 actionidentifier에서는 다른 창으로 화면 전환이 되지 않습니다!!!

 

지금까지 Local Notification에 대해서 알아봤습니다. 

이외에도 다양하게 사진을 넣거나 다양한 기능을 추가 할 수 있습니다.

또한 백엔드에서 보내주는 Push Notification도 있습니다.

나중에 기회가 된다면 이 부분에 대해서도 다뤄보도록 하겠습니다.

 

소스 코드 :

github.com/HururuekChapChap/Xcode_TestProj/tree/master/push_notification/push_notification

728x90
반응형

댓글