티스토리 뷰

728x90
반응형

local push 를 통해서 custom notification interface 를 적용해보자.

  • 먼저, 권한을 얻고자하는 view controller 에서 local push 를 등록해보자
import UserNotifications

class ViewController: UIViewController {

    let userNotificationCenterr = UNUserNotificationCenter.current()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        requestNotificationAuthorization()
        sendNotification(seconds: 10)
    }

    func requestNotificationAuthorization() {
        let authOptions = UNAuthorizationOptions(arrayLiteral: .alert, .badge, .sound)
 //1.
        userNotificationCenterr.requestAuthorization(options: authOptions) {
            success, error in
            print("success: \(success)")
            if let error = error {
                print("Error: \(error)")
            }
        }
    }

    func sendNotification(seconds: Double) {
        let notificationContent = UNMutableNotificationContent()

        notificationContent.title = "알림 테스트 타이틀"
        notificationContent.body = "알림 테스트 바디"

//2.
        notificationContent.categoryIdentifier = "TEST_NOTIFICATION"

        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: seconds, repeats: false)
        let request = UNNotificationRequest(identifier: "testNotification", content: notificationContent, trigger: trigger)

        userNotificationCenterr.add(request) { error in
            if let error = error {
                print("Notification Error: \(error)")
            }
        }
    }
}

주석)

1: 권한요청

2: categoryIdentifier 를 설정해서 custom notification 을 지정해줄 것이다.


extension 으로 만든 스토리보드와 뷰컨트롤러를 이용해서 cutom interface 를 만들 수 있다.

  • info.plist

UNNotificationExtensionContentHidden

  • interface 에서 default content 를 숨길 수 있다. (YES: 숨기기)

UNNotificationExtensionCategory

  • 키를 통해서 앱에서 수신할 수 있는 notification 을 구분한다.

UNNotificationExtensionInitialContentSizeRatio

  • The initial size of the view controller's view for an app extension, expressed as a ratio of its height to its width.
  • 0 과 1 사이의 숫자 값이다. cutom interface 의 aspect ratio 를 표현한다. default 는 1이다.
  • MainInterface.storyboard

  • NotificationViewController.swift
class NotificationViewController: UIViewController, UNNotificationContentExtension {

    @IBOutlet var titleLabel: UILabel?
    @IBOutlet weak var bodyLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any required interface initialization here.
    }

    func didReceive(_ notification: UNNotification) {

        self.titleLabel?.text = notification.request.content.title
        self.bodyLabel.text = notification.request.content.body
    }

}

custom action 도 추가해보자

  • 위의 local push 를 등록한 view controller 에 다음의 코드를 추가한다.
func setCutomAction() {
    let acceptAction = UNNotificationAction(identifier: "ACCEPT_ACTION",
          title: "Accept",
          options: UNNotificationActionOptions(rawValue: 0))
    let declineAction = UNNotificationAction(identifier: "DECLINE_ACTION",
          title: "Decline",
          options: UNNotificationActionOptions(rawValue: 0))

    let meetingInviteCategory =
          UNNotificationCategory(identifier: "TEST_NOTIFICATION",
          actions: [acceptAction, declineAction],
          intentIdentifiers: [],
          hiddenPreviewsBodyPlaceholder: "",
          options: .customDismissAction)

    // Register the notification type.
    userNotificationCenterr.setNotificationCategories([meetingInviteCategory])
}

func sendNotification(seconds: Double) {
// ...

    notificationContent.title = "알림 테스트 타이틀"
    notificationContent.body = "알림 테스트 바디"

    // 추가
    notificationContent.userInfo = ["MEETING_ID" : "meetingID",
                        "USER_ID" : "userID" ]

    notificationContent.categoryIdentifier = "TEST_NOTIFICATION"
// ...                        
}
  • AppDelegate.swift 파일에 다음의 코드를 추가한다.
func userNotificationCenter(_ center: UNUserNotificationCenter,
       didReceive response: UNNotificationResponse,
       withCompletionHandler completionHandler:
         @escaping () -> Void) {

   // Get the meeting ID from the original notification.
   let userInfo = response.notification.request.content.userInfo
   let meetingID = userInfo["MEETING_ID"] as! String
   let userID = userInfo["USER_ID"] as! String

   // Perform the task associated with the action.
   switch response.actionIdentifier {
   case "ACCEPT_ACTION":
      print("Accept action - meetingID: \(meetingID), userID: \(userID)")
      break

   case "DECLINE_ACTION":
        print("Decline action - meetingID: \(meetingID), userID: \(userID)")
      break

   // Handle other actions…

   default:
      break
   }

   // Always call the completion handler when done.
   completionHandler()
}

  • Accept 버튼을 누르게 되면 우리가 등록한 custom action handler 가 작동한다.

코드에 대한 설명은 아래의 글을 참고

hyun9iOS) AppleDeveloper - Declaring Your Actionable Notification Types
hyun9iOS) AppleDeveloper - Customizing the Appearance of Notifications

728x90
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
링크
Total
Today
Yesterday