나의 발자취
[UIKit] Remote Push Notification Alert 구현 (feat.APNs) 본문
원격 푸쉬 알림을 알려면, 먼저 서비스 흐름도 이해를 해야한다.
서비스 흐름도
APNS 서버에 우리 앱을 등록하면, 디바이스 토큰을 부여하게 된다. 우리는 그러면 이 토큰을 가지고 APN에 요청을 보낼 수 있는 것이다.
우리가 우리 앱에서 바로 APNS에 들어가지 않는다. 토큰을 받은 다음 알림을 받을 유저에 해당하는 디바이스 토큰만 가지고 와서, APNS 서버에 content와 같이 보내주면 APNS 서버가 우리 대신 그 디바이스들에게 알람을 모두 내보내는 것이다.
구현 단계를 생각해보면,
1. APNS 서버에 디바이스 토큰 요청을 보낸다.
2. APNS 서버로부터 디바이스 토큰을 받아서 우리 서버에 요청을 한다.(DB에 저장)
3. 우리 서버가 그 토큰을 가지고 APNS 서버에 요청을 한다.
디바이스 토큰은 항상 바뀔 수 있다. 로그인 시 아이디와 함께 보내야하기 때문에 습관적으로 토큰을 보내면 된다.
서버를 들여다 보면, 이렇게 토큰키와, .env에는 중요한 Team ID나 Bundle ID와 같은 정보들을 집어넣어준다.
다시 UIKit으로 와서,
2024.11.21 - [앱 개발/iOS] - [UIKit] Notification 기능 구현하기
이 프로젝트에서 이어서 한다.
일단, Signing & Capabilites에서 Push Noti를 추가가 되었는지 확인한다.
1. 토큰 요청
AppDelegate.swift
전에 if문을 비워넣었는데,
이제 첫번째 서비스 흐름도를 요청할것이다.
if granted {
// 1. APNs 서버에 Token 요청
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
}
그럼 아래와 같이 된다.
2. 토큰 처리 작업
두번째. 요청을 했으면 APNs 서버가 토큰을 줄것이다. 그걸 받는 작업을 할것이다.
AppDelegate class 안의 제일 밑부분에 만들어준다. application 혹은 deviceToken을 치면 이런 메서드가 나온다.
디바이스 토큰을 지금 Data 타입으로 넘겨주고 있다. (byte 데이터타입) 이 타입을 스트링으로 변환해줄것이다.
그리고 이 아이들을 hexa로 (1 byte = 2 hexa) 바꿔줄것이다.
// 2. APNs로부터 Device Token 받기
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
var token: String = ""
for i in 0..<deviceToken.count {
token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
}
print("APNs token: \(token)")
// 토큰 저장
UserDefaults.standard.set(token, forKey: "token") // 저장해놨다가 로그인했을 때 id와 같이 토큰을 서버에 등록하는 것
}
이쯤에서 한번 개인 소유 디바이스로 실행을 해준다.
그럼 내 휴대폰 로컬에서 앱이 켜지면서 APNs token이 나온다.
3. 서버로 디바이스 토큰 보내기
.env에 bundle id, team id가 잘 입력되었는지 확인한다.
그리고 백엔드를 실행해준다. npx nodemon app (이나 자기가 설정한 명령어로)
Postman에서 x-www-form-urlencoded 형식으로
key: deviceToken, value: 아까 받은 APNs Token값을 넣어서 POST로 넣어준다.
(이때 APNs Token value를 넣고선 엔터를 치지 않는다. 그이유는 \n으로 인식이 되기 때문이고, 나도 알고싶지 않았다)
전송을 누르면 정상적으로 remote alert가 내 휴대폰으로 전송되는 것이 확인된다.
didReceive
그리고, 우리가 알람 배너를 누르면 앱이 실행되도록 해놓은 것이 이 기능이다. (didReceive) 유저가 터치를 했을 때, push받은 내용으로 어떤 특정한 기능을 해야할 때 구현하는 것이다.
// 유저 알람 클릭 액션 -> 앱으로 접속
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
let info = response.notification.request.content.userInfo
// print(info["name"] ?? "")
completionHandler()
}
willPresent
원칙적으로, 앱이 실행중일 때 배너가 뜨는 것은 하지 않지만, 만약에 앱이 실행중일 때에도 알림을 구현하고 싶으면 willPresent를 구현해준다.
// 앱 실행중에 들어오는 push alert
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
let info = notification.request.content.userInfo
// print(info["name"] ?? "")
completionHandler([.banner, .sound])
}
'앱 개발 > iOS' 카테고리의 다른 글
[SwiftUI] Social Login 기능 도입하기 - KaKao (1) | 2024.11.27 |
---|---|
[SwiftUI] Social Login 기능 도입하기 - Apple (0) | 2024.11.26 |
[SwiftUI] Notification 기능 구현하기 (2) | 2024.11.21 |
[UIKit] Notification 기능 구현하기 (0) | 2024.11.21 |
이어서 (0) | 2024.11.19 |