iOS에선 두 가지의 Notification이 존재합니다.
앱 자체에서 알림을 보내는 Local Notification과 서버에서 알림을 보내는 Push Notification 입니다.
오늘은 그 중 하나인 Push Notification에 대해 보고 구글 Firebase를 사용해 보내는법까지 알아보려 합니다.
Push Notification
Push Notification에 대해 이야기 하기 전에 주의 사항이 있습니다.
✅ 유료 애플 개발자 계정 등록 필수!!!
애플에서 푸시 알림 인증키를 제공받아야 하는데 유료계정이 아니면 제공을 안해준다고 하네요... 꼭 등록을 하고 시도하세요!!!
APNs
Push Notification에 대해 이야기하려면 먼저 APNs에 대해 알아야합니다.
APNs란 Apple Push Notification Service로 Push Notification을 설정하고 받아오려면 거쳐가야하는 Apple에서 만든 알람 서비스 플랫폼입니다.
카카오톡을 예시로 이야기 해보면 순서는 다음과 같습니다.
1. 앱을 실행하면 APNs에 권한요청(토큰 발급 요청)
2. 설정이 잘 되어있으면 APNs에서 push 받을 수 있게 토큰 제공
3. 카카오톡 서버에 전달
4. 카카오톡 서버가 APNs에게 "조제 에게 보내주세요!" 전달
5. APNs에서 조제에게 보내줌
이와 같이 APNs는 앱에서 remote notification을 보내려면 반드시 거쳐가야 합니다.
Firebase
1. import
Firebase를 SPM으로 받아줍니다. 링크는 https://github.com/firebase 여기 있습니다.
다운 받으실 때 FirebaseMessaging을 꼭 클릭 해줍니다.
다음은 Targets의 Signing & Capabilities 에서 기능을 추가해줍니다. + 버튼을 누르시면 됩니다.
그 다음 Backgroundmode와 push Notification을 선택해 등록해주시면 됩니다.
그 다음 Background Modes에서 Remote notifications를 선택해주시면 됩니다.
2. p8 인증서 발급
다음은 key를 발급 받을 차례입니다.
애플 개발자 홈페이지로 들어간 뒤 키를 발급 받습니다.
그리고 Apple Push Notifications service (APNs)를 꼭 체크하고 키를 발급해줍니다.
그리고 발급받은 키를 다운받으면 인증서 형식으로 키를 쓸 수 있게 됩니다.
❎ 주의사항 ❎
과거엔 발급받은 키를 1년마다 갱신을 해줘야 했다고 합니다... ( 실수로 갱신 못하면 🥶...) 이 땐 p12인증서 였습니다.
하지만 현재는 p8 인증서로 바뀌고 한 번 키를 발급받으면 영구적으로 사용이 가능하다고 하니 다행이죠!!!
그래도 주의할점이 하나 있는데 바로 '발급 받은 키는 하나로 여러 앱에서 사용이 가능하나 키를 삭제하면 모든 앱의 푸시알림이 사라진다' 는 점과 '재 다운로드가 불가능한 점' 입니다.
그래서 키를 잘 관리해야합니다!!!
3. Firebase message 설정
그 다음 구글 Firebase 홈페이지로 들어가 Messaging을 추가해줍니다.
업로드 버튼을 누르면 인증키 업로드 화면이 나옵니다.
찾아보기에선 다운받은 P8을 넣어주면 되고 키 ID는 P8파일의 _ ... p8 사이의 ...을 넣어주면 되고 마지막으로 팀ID는 Apple Developer 계정에서 받은 ID를 등록해주면 키가 발급됩니다.
4. AppDelegate 설정
이제 코드를 작성해 줄 차례입니다.
firebase의 문서보기에서 클라우드 메시징에 들어가서 하나씩 코드를 작성해봅시다.
1. 원격 알림 시스템에 앱 등록
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// 파이어베이스 등록
FirebaseApp.configure()
// 원격 알림 시스템에 앱 등록
if #available(iOS 10.0, *) {
// For iOS 10 display notification (sent via APNS)
UNUserNotificationCenter.current().delegate = self
let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
UNUserNotificationCenter.current().requestAuthorization(
options: authOptions,
completionHandler: { _, _ in }
)
} else {
let settings: UIUserNotificationSettings =
UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
application.registerUserNotificationSettings(settings)
}
application.registerForRemoteNotifications()
return true
}
extension AppDelegate: UNUserNotificationCenterDelegate {
}
위의 코드를 통해 App이 시작하면 원격알림 시스템에 앱이 등록됩니다.
2. 메시지 대리자 설정
Messaging.messaging().delegate = self
extension AppDelegate: MessagingDelegate {
}
3. 현재 등록된 토큰 가져오기
Messaging.messaging().token { token, error in
if let error = error {
print("Error fetching FCM registration token: \(error)")
} else if let token = token {
print("FCM registration token: \(token)")
}
}
4. 토큰 갱신 모니터링
extension AppDelegate: MessagingDelegate {
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
print("Firebase registration token: \(String(describing: fcmToken))")
let dataDict: [String: String] = ["token": fcmToken ?? ""]
NotificationCenter.default.post(
name: Notification.Name("FCMToken"),
object: nil,
userInfo: dataDict
)
// TODO: If necessary send token to application server.
// Note: This callback is fired at each app startup and whenever a new token is generated.
}
}
토큰 정보가 언제 바뀌는지 체크하는 부분입니다.
5. 재구성 사용 중지
extension AppDelegate: UNUserNotificationCenterDelegate {
func application(application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
}
}
5. 알림등록
이제 알림을 등록해줄 차례입니다.
알림 제목과 알림테스트를 작성하고 나머지 밑에 단계도 진행해주시면 됩니다.
테스트도 가능한데 우측중간 쯤 테스트 메시지 전송 버튼을 누르고 FCM 인증키를 그대로 작성해주면 됩니다.
FCM 인증키는 위에 작성한 코드에서 출력이 되어 디버그영역 쪽을 확인하시면 이렇게 나와있습니다.
이 코드를 복사해서 등록하시면됩니다.
그리고 마지막 5단계에서 노티피케이션을 누르면 메인화면이 아니라 어떤 링크 예를들면 쿠팡에서 온 노티피케이션을 눌렀는데 쿠팡 메인화면이 아니라 해당 제품의 구매화면으로 이동해지는 기능을 추가할 수 있습니다.
예를들어, 카카오톡 같은경우는 키값, 밸류로 받아서 pushType이 1이면 대화방, 2면 선물함 등으로 보내주는 식이라고 합니다.
그리고 이를 사용하는 코드는 다음과 같습니다.
// 푸시클릭시 앱이 아니라 세부화면으로 이동
// 유저가 클릭해야만 사용가능
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
print("사용자가 푸시를 클릭했습니다.")
print(response.notification.request.content.body)
print(response.notification.request.content.userInfo)
let userInfo = response.notification.request.content.userInfo
if userInfo[AnyHashable("josee")] as? String == "project" {
print("Josee Project")
} else {
print("NOTHING")
}
}
그리고 마지막으로 푸시받은 장면을 이렇게 확인하실 수 있습니다.
'iOS' 카테고리의 다른 글
[iOS] GCD 누구냐 넌 - 1. GCD의 등장배경 (0) | 2022.12.26 |
---|---|
[iOS] - Realm 마이그레이션 정리 (0) | 2022.10.13 |
[iOS] Map Kit View 사용하기 - 1 (0) | 2022.08.11 |
[iOS] User Notification Ⅰ. 로컬 알림(Local Notification) (0) | 2022.07.29 |
[iOS] WKWebView (0) | 2022.07.28 |