대부분 앱을 사용하시다보면 푸시알림을 무수히 받아보셨을거예요. 저도 잠시 계약한 스타트업에서 진행하고 있는 프로젝트에서도 Push 알림을 구현해야한다고 하셔서 푸시알림에 대해 알아보려 합니다!
기본적으로 iOS의 push는 2가지가 있습니다.
- 로컬 푸시 (Local Notification) : 앱 자체로부터 push를 앱에 띄우는 것
- 서버 푸시 (Remote Notification) : 서버로부터 push를 앱에 띄우는 것
사실 제가 필요로 하는건 서버 푸시이지만, 서버 푸시를 하려면 뭐 certification과 provisioning profile을 등록하고... APNs에 연결해야하며... 애플 개발자 계정이 필요하고....어쩌구 저쩌구..... 너무 복잡해서ㅠㅠㅠ 일단 간단하게나마 로컬 푸시를 먼저 다뤄보려고 해요😂
Local Notification (로컬 푸시) 구현하기
1. UNUserNotificationCenter 인스턴스 가져오기
로컬푸시는 생각보다 간단합니다! 일단 iOS에서 Push를 다루는 객체는 UNUserNotificationCenter 라는 싱글톤 객체입니다. 저는 화면에 있는 버튼을 통해서 푸시알림을 발생시키려고 하니까, ViewController에 아래 코드를 추가해줬어요 :)
2. 사용자에게 알림 권한 요청하기
그리고 푸시 알람을 사용하기 위해 UNAuthorizationOptions 객체를 활용해서 사용자에게 알림 권한을 요청하도록 했습니다!
3. 푸시 알림으로 보낼 정보 세팅하기
이제 Push할 내용을 전송하는 sendLocalNotification( )을 구현해볼게요. Content, Trigger, Request 객체를 활용해서 푸시알림을 trigger할 시간을 설정하고, 알림을 전송할 거예요.
여기서 주의할 점은 trigger에 들어가는 timeInterval이 몇초 후에 푸시알림이 발생하는지를 결정하는데, 저는 보통 시간 설정할 때 마이크로세컨드로 봐서 1000이 1초일 거라고 생각했거든요?? 근데 알고보니 1000이 1000초였어요ㅋㅋㅋㅋㅋㅋ 그것도 모르고 처음에 왜 푸시알람이 안오지... 했다는... 네.......ㅋㅋㅋㅋ
4. Delegate 등록하기
지금까지 푸시 알람을 보내기 위한 권한 허용과, 푸시 알람을 보내는 메서드까지 구현했습니다! 하지만 아직 끝이 아니예요. 우리가 푸시 알람 요청한걸 앱에서 다시 받을 수 있도록 delegate를 구현해야겠죠? 그럼 이제 우리가 보낸 Notification에 대한 Delegate를 구현해봅시다 :)
Delegate 는 ViewController가 아닌 AppDelegate 에서 구현해줄거예요. 특정 ViewController에 구현되어 있으면 푸시알림을 받지 못할 가능성이 있기 때문에 앱이 실행될때 처음부터 delegate를 등록해주기 위해 AppDelegate에서 구현을 해야해요❗️
그럼 이렇게 앱이 켜져있을 때에도, 켜져있지 않을 때에도 푸시알림을 정상적으로 받아내는 것을 보실 수 있습니다😄😄
그리고 가끔 테스트하다보면 Xcode에 있는 디폴트로 지정된 provisioning profile 에서는 푸시알림이 오지 않는 버그가 있다고 해요! 그럴 경우에는 실제 디바이스 말고 시뮬레이터에서 테스트해보시는게 더 좋을 수 있습니다 🌝
저는 이제.. 너무나도 복잡해보였던 서버 푸시 알림에 대해 공부하러 가봐야겠어요ㅠㅠ.....👣👣
Reference
- [iOS] 로컬 푸시 알림 구현 방법 (Local Notification)
- [iOS - swift] 서버 푸시 (remote notification), APNs (Apple Push Notification service)
'iOS > iOS' 카테고리의 다른 글
CATransform3D 애니메이션 (1) (0) | 2021.05.15 |
---|---|
What's the difference between a singleton and a shared instance in Swift? (0) | 2021.05.10 |
커뮤니케이션 패턴 (Delegate, Notification, KVO, Target-Action) (0) | 2021.05.04 |
Promises (0) | 2021.04.29 |
CGRect, CGPoint, CGSize (0) | 2021.04.16 |
댓글