티스토리 뷰
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
반응형
'iOS > Notification' 카테고리의 다른 글
iOS) Generating a Remote Notification - APNs payload 알아보기 (0) | 2022.02.26 |
---|---|
iOS) APNs(Apple Push Notification Service) - FCM Token 으로 앱에서 메시지 수신하기 (2) | 2022.01.16 |
iOS) AppleDeveloper - Customizing the Appearance of Notifications (0) | 2021.07.22 |
iOS) AppleDeveloper - Declaring Your Actionable Notification Types (0) | 2021.07.22 |
iOS) APNs(Apple Push Notification Service) (4) | 2021.07.22 |
댓글
TAG
- rxswift
- MOYA
- github
- Widget
- UserDefaults
- IOS
- OpenSourceLibrary
- WWDC
- SwiftUI
- MVVM
- watchOS
- WidgetKit
- Firebase
- 서버통신
- YPImagePicker
- containerBackground
- Objective-C
- Algorithm
- WWDC22
- urlsession
- 2022 KAKAO TECH INTERNSHIP
- Notification
- APNS
- RxCocoa
- Swift
- projectsetting
- async/await
- CloneCoding
- configurable widget
- Protocol
최근에 올라온 글
최근에 달린 댓글
글 보관함
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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