Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 리펙토링
- UICollectionView
- Refactoring
- 애니메이션
- Protocol
- SWIFT
- rxswift
- MVVM
- swift documentation
- 스위프트
- map
- 리펙터링
- HIG
- ribs
- UITextView
- combine
- RxCocoa
- clean architecture
- Xcode
- 리팩토링
- uitableview
- 클린 코드
- uiscrollview
- tableView
- Clean Code
- swiftUI
- Human interface guide
- Observable
- collectionview
- ios
Archives
- Today
- Total
김종권의 iOS 앱 개발 알아가기
[iOS - swift] 로컬 푸시 (local notification) 본문
푸시의 종류
- 로컬 푸시(local notification): 앱으로부터 push를 앱에 띄우는 것
- 서버 푸시(remote notification): 서버로부터 push를 앱에 띄우는 것 - ios-development.tistory.com/264
푸시 권한 요청
- 푸시를 다루는 객체는 `UNUserNotificationCenter`의 싱글톤 객체 활용
class ViewController: UIViewController {
let userNotiCenter = UNUserNotificationCenter.current() // 추가
override var viewDidLoad() {
super.viewDidLoad()
}
}
- 사용자에게 알림 권한 요청을 하는 메소드 추가: UNAuthorizationOptions 객체로 요청
class ViewController: UIViewController {
let userNotiCenter = UNUserNotificationCenter.current()
override var viewDidLoad() {
super.viewDidLoad()
}
// 사용자에게 알림 권한 요청
func requestAuthNoti() {
let notiAuthOptions = UNAuthorizationOptions(arrayLiteral: [.alert, .badge, .sound])
userNotiCenter.requestAuthorization(options: notiAuthOptions) { (success, error) in
if let error = error {
print(#function, error)
}
}
}
}
푸시 내용 전송
- 알림을 전송하는 메소드 추가: Content, Trigger, Request 객체를 이용
- trigger객체는 날짜, 지역 등을 설정할 수 있는 기능 존재
class ViewController: UIViewController {
let userNotiCenter = UNUserNotificationCenter.current()
override func viewDidLoad() {
super.viewDidLoad()
requestAuthNoti()
requestSendNoti(seconds: 3)
}
// 사용자에게 알림 권한 요청
func requestAuthNoti() {
let notiAuthOptions = UNAuthorizationOptions(arrayLiteral: [.alert, .badge, .sound])
userNotiCenter.requestAuthorization(options: notiAuthOptions) { (success, error) in
if let error = error {
print(#function, error)
}
}
}
// 알림 전송
func requestSendNoti(seconds: Double) {
let notiContent = UNMutableNotificationContent()
notiContent.title = "알림 title"
notiContent.body = "알림 body"
notiContent.userInfo = ["targetScene": "splash"] // 푸시 받을때 오는 데이터
// 알림이 trigger되는 시간 설정
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: seconds, repeats: false)
let request = UNNotificationRequest(
identifier: UUID().uuidString,
content: notiContent,
trigger: trigger
)
userNotiCenter.add(request) { (error) in
print(#function, error)
}
}
}
- noti의 delegate는 AppDelegate에 구현
: 특정 ViewController에 구현되어 있으면 푸시를 받지 못할 가능성이 있으므로 AppDelegate에서 구현
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
UNUserNotificationCenter.current().delegate = self // <- 추가
return true
}
}
// 추가
extension AppDelegate: UNUserNotificationCenterDelegate {
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .badge, .sound])
}
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
// deep link처리 시 아래 url값 가지고 처리
let url = response.notification.request.content.userInfo
completionHandler()
}
}
* 주의: xcode의 있는 디폴트로 지정된 provisioning profile에서는 푸시가 안오는 버그가 있으므로, device보다는 simulator에서 테스트
'iOS 응용 (swift)' 카테고리의 다른 글
[iOS - swift] 빈 화면 탭 시 키보드 내리는 방법 (화면 터치 시 키보드 숨김처리) (0) | 2021.03.22 |
---|---|
[iOS - swift] long touch 시 개발자모드 불러오기 (0) | 2021.03.22 |
[iOS - swift] os_log, Logger, 통합 로깅 시스템 (unified logging system) (0) | 2021.03.21 |
[iOS - swift] Web crawling(웹 크롤링), web scraping, (swiftsoup, Alamofire, 한글 깨짐) (0) | 2021.03.17 |
[iOS - swift] app store로 이동 (버전 업데이트, 다시 돌아온 경우 처리, 현재 버전, 최신 버전 가져오는 방법) (6) | 2021.03.15 |
Comments