ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • User Notifications
    iOS 2021. 3. 18. 19:05

    안녕하세요. 그린입니다!

    이번 포스팅에서는 User Notifications에 대해 학습해보겠습니다😃

    User Notifications?

     -> 처음 해당 주제를 보고 노티피케이션이라는 말만 듣고 Notification Center와 동일한건줄 알았습니다.

     무언가를 관찰하고 액션을 취해준다는것은 동일하지만 실 사용은 많이 다른것 같았습니다.

     예를들어 실사용에서는 푸시 알람 같은것을 생각해보면 됩니다!! (게임, 미리알림 등 무언가 배너에 푸시가 오는것들이 다 해당됩니다.)

     : User Notifications의 앞글자를 따서 UN으로 하기 서브 클래스 이름이 시작됩니다.

     : 해당 Notification을 동작 시키기 위해서는 Request와 Trigger가 필요합니다.

     : Content를 구성하여 Request 하게 됩니다.

    User Notifications의 종류

     1) Local Notification

     : 외부 서버를 통하지 않고 내부 앱에서 푸시 알림을 보내는 경우

     -> 미리알림, 알람 앱의 푸시 알림 등.. (배터리 부족 같은 시스템이 감지하는것과는 다름)

     2) Remote Notification

     : 외부 서버에서 APNs에 푸시 Notification을 보내주어 디바이스에 나타내는 경우

     (JSON 형태의 딕셔너리로 만들어 보내줌)

     -> 로컬보다는 지연이 있고 손실될 우려가 있음

     -> 게임에서의 이벤트 알림, 쿠폰 등등 여러 앱의 실사용에서 볼 수 있는 서버의 푸시 알림

    Local Notification을 구현하는 방법

    import UIKit
    import UserNotifications
    
    class ViewController: UIViewController {
        let content = UNMutableNotificationContent()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound,.badge], completionHandler: {didAllow,Error in print(didAllow) })
            
            configureNotification()
            deliverNotification()
        }
        
        func configureNotification() {
            content.title = "Notificaion 푸시 알림 테스트!!"
            content.subtitle = "Notification 푸시 알림이다요!"
            content.body = "Notification 푸시 알림 테스트중입니다!!"
            content.badge = 1
        }
    
        func deliverNotification() {
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
            let request = UNNotificationRequest(identifier: "Second", content: content, trigger: trigger)
            let center = UNUserNotificationCenter.current()
            center.add(request, withCompletionHandler: nil)
        }
    }

    -. 뷰 로드 시 푸시 알림을 가도록 구현해본 케이스

    -. UserNotifications를 import

    -. 뷰 로드 시 푸시 알림을 허용할것인지 묻는 인증에 대한 기능 구현 (권한 얻기)

    -. content를 전역 상수로 두어 정보를 담음

    -. configureNotification(): content의 여러 정보들을 설정

    -. deliverNotificaion(): 어떻게 해당 알림을 동작시킬지에 대한 Trigger와 그 Trigger 및 Identifier 정보를 담은 Request 생성,

       UNUserNotification센터에 해당 요청을 추가

    -. 해당 두 메서드를 구현하여 ViewDidLoad()에서 호출

    -. content.badge: 앱 아이콘에 빨간 네모난창으로 알림 표시를 나타내주는것 (몇개의 알림이던 badge의 수를 정해준 수로 나타남)

    badge
    푸시 알림

    Notification에 이미지를 넣어주는 방법

    let imageName = "green"
    guard let imageURL = Bundle.main.url(forResource: imageName, withExtension: ".png") else { return }
         
    let attachment = try! UNNotificationAttachment(identifier: imageName, url: imageURL, options: .none)
    content.attachments = [attachment]

    1) 원하는 이미지를 프로젝트 파일 폴더에 저장

    2) imageURL을 구성

    3) UNNotificationAttachment 메서드를 사용하여 이미지 저장

    4) content에 해당 이미지를 삽입

    Notofication 이미지 삽입

    [느낀점 및 깨달은점]

    1) Notification을 생성하고 호출하면 그만이 아니라 해제하는 시점과 다시 호출하는 시점등 여러 부분에서 신경써서 관리를 해줘야하는

    아주 까다로운 친구...😭

     -> Notification의 Identifier를 가지고 호출 및 해제를 관리해주는것도 하나의 방법! 

    2) App의 NotificaitonDelegate를 다뤄주는 부분은 AppDelegate에서 해주는것이 더 적합하게 느껴졌다.

    처음 ViewController에서 해당 Notification을 구성하고 불러주었으니까 막연하게 VC에서 Delegate를 Extension하여 기능을 구현해주었는데 만약 App이 닫혀있고 푸시 알림을 통해 다시 앱의 뷰가 로드된다면 뷰가 정상적으로 로드되지 않거나 지연될때 해당 기능의 역할을

    제대로 수행하지 못할것이다.

     -> 어디서 꼭 해줘야하는 정해진것은 아니지만 역할의 차이라고 생각된다. AppDelegate가 App의 전반적은 부분의 역할을 함으로

     더 적합하다고 정리될 수 있다.

     3) Remote Notification도 해보고싶었는데 해당 서버에 대한 설정과 또한 애플개발자등록을 해야해서 과금이...! 다음기회에!🤑

     

    [참고자료]

    야곰의 iOS-StartCamp 강의 및 활동학습중

    https://developer.apple.com/documentation/usernotifications

    'iOS' 카테고리의 다른 글

    User Notification (2)  (0) 2021.03.23
    OAuth  (0) 2021.03.22
    View Drawing Cycle  (0) 2021.03.15
    iOS File System  (0) 2021.02.25
    Responder Chain / Touch Event  (0) 2021.02.22
Designed by Tistory.