Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/developeracademy-postech/2024-nc2-m44-notification
NC2 Notification study of Ace and Groo
https://github.com/developeracademy-postech/2024-nc2-m44-notification
Last synced: about 7 hours ago
JSON representation
NC2 Notification study of Ace and Groo
- Host: GitHub
- URL: https://github.com/developeracademy-postech/2024-nc2-m44-notification
- Owner: DeveloperAcademy-POSTECH
- Created: 2024-06-13T02:15:43.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2024-06-20T06:11:09.000Z (5 months ago)
- Last Synced: 2024-08-12T15:10:36.931Z (3 months ago)
- Language: Swift
- Size: 935 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ๐ฑ DiaryNotification
NC2 Notification study of Ace and Groo## ๐ผ๏ธ Prototype
### ๊ธฐ๋ณธ prototype
ํ์์ด ์ผ๊ธฐ๋ฅผ ์์ฑํ๊ณ ์ ์ถํ๋ฉด ์ ์๋์ด ์ผ๊ธฐ๋ฅผ ํ์ธํ๊ณ ๋์ฅ์ ์ฐ๋๋ค.
https://github.com/DeveloperAcademy-POSTECH/2024-NC2-M44-Notification/assets/77305722/7ee52c02-8fb1-4a8d-86d2-dcdad94f0124
### Local notification
ํ์์ด ์ง์ ํ ์๊ฐ์ ์ผ๊ธฐ ์์ฑ ์๋ฆผ์ ๋ฐ๋๋ค. ๊พน ๋๋ฌ์ ์ฑ์ ๋ค์ด๊ฐ์ง ์๊ณ ๋ ์ผ๊ธฐ๋ฅผ ์์ฑํ ์ ์๋ค.
https://github.com/DeveloperAcademy-POSTECH/2024-NC2-M44-Notification/assets/77305722/d6b8c9c0-f0ab-48da-90da-2cec1bd7aa2a
### Remote notification
ํ์์ด ์ผ๊ธฐ๋ฅผ ์ ์ถํ๋ฉด ์ ์๋์๊ฒ ์ผ๊ธฐ์ ๋ด์ฉ์ด ๋ด๊ธด ์๋ฆผ์ด ์ ์ก๋๋ค.
https://github.com/DeveloperAcademy-POSTECH/2024-NC2-M44-Notification/assets/77305722/c049a275-4fc9-452a-babd-0d2bc425f874
## ๐ฅ Youtube Link
(์ถํ ๋ง๋ค์ด์ง ์ ํ๋ธ ๋งํฌ ์ถ๊ฐ)## ๐ก About Notification
### Local Notification
์๊ฐ, ๊ณต๊ฐ์ด๋ผ๋ trigger๋ฅผ ์ด์ฉํ์ฌ ๋๋ฐ์ด์ค๋ก ์๋ฆผ์ ๋ณด๋ธ๋ค. notification์ ํตํด ์ฌ์ฉ์์๊ฒ ์ ์ ํ ๋์ ์ ์ ํ ํํ ์๋ฆผ์ ์ ๊ณตํจ์ผ๋ก์จ ๋จ์ํ ๋ฆฌ๋ง์ธ๋๊ฐ ์๋ ํน์ ํ๋์ ๊ถ์ ํ ์ ์๋ค.
### Remote Notification
์๊ฒฉ์์ ํน์ ํธ๋ฆฌ๊ฑฐ๊ฐ ๋ฐ์ํ๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์ ์๋ฆผ์ ๋ฐ์์ํค๋ ๊ธฐ์ ์ด๋ค.
## ๐ฏ What we focus on?
- **Trigger**: Local Notification์ ๊ฒฝ์ฐ ์๊ฐ, ๊ณต๊ฐ์ Trigger ๋ก ์ฌ์ฉํ์ฌ ์๋ฆผ์ ์ค ์ ์๋ค. ๊ทธ ์ค ์๊ฐ์ด ๊ณํ๊ณผ ๋ฐ์ ํ๊ธฐ๋ ํ๊ณ , ์๊ฐ์ด๋๋ผ๋ ํ์ด๋จธ, ํน์ ๋ ์ง, ํน์ ์๊ฐ ๋ฑ์ ๋ฐ๋ผ ๋ฌ๋ฆฌ ์๋์ ์ค์ ํ ์ ์์ด์ ์ฑ์ use case์ ์ ์ ํ ์๋ฆผ์ ๊ตฌํํ๊ณ ์ ํ๋ค.
- **Notification Action**: ์๋ฆผ์ ๋ฐ๊ณ ๋จ์ํ ์ฑ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์๋๋ผ, ์ฑ์ ๋ค์ด์ค์ง ์์๋ ๋ฏธ๋ฆฌ ์ค์ ํ ๊ณผ์ ์ ์คํํ ์ ์๊ฒ ํ์ฌ ์ฌ์ฉ์์ ํธ๋ฆฌ์ฑ์ ๋์ด๊ณ ๋ชฉ์ ์ ๋ถํฉํ๋ ์๋ฆผ์ ๋ณด๋ด๊ณ ์ ํ๋ค.
- **Text Input Action:** Notification action ์ค์ ๋ฒํผ์ ํด๋ฆญํ๋ ๊ฒ์์๋ง ๋๋๋ ๊ฒ ์๋๋ผ ๋ฐ๋ก ํ์ํ ํ ์คํธ๋ฅผ ์ ๋ ฅํ ์ ์๋ ๊ฒ์ผ๋ก, use case์ ์ ์ ํ ์๋ฆผ์ ๊ตฌํํ๊ณ ์ ํ๋ค.
- **Remote Notification** ์ ๊ฒฝ์ฐ ์๋ฒ์์ ์ํ๋ ๋๋ก trigger๋ฅผ ์ง์ ํ ์ ์๋ค. ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋ง์ถฐ ์๋ฆผ์ ์ ์กํ๊ธฐ ์ํด์๋ ํ์์ด๋ค. ํธ์ ์๋ฆผ์ ๊ตฌํํ๊ธฐ ์ํด์๋ APNs ๋ฅผ ํฌํจํ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋๋ฐ, ํด๋น ์ธํ๋ผ๋ฅผ ๊ตฌ์ถํ๋ ๋ฒ์ ๋ํด ์ง์คํ๋ค.## ๐ผ Use Case
> ์ ์ ํ ์๋ฆผ์ ์ฃผ์ด ํ์์ ์ผ์ ํ ์๊ฐ์ ์ผ๊ธฐ๋ฅผ ์์ฑํ๊ณ , ์ ์๋์ ํ์์ด ์ ์ถํ ์ผ๊ธฐ๋ฅผ ํ์ธํ๊ฒ ํ์.
## ๐ ๏ธ About Code
### Local Notification
---
**์๊ฐ์ trigger๋ก ์๋ฆผ ์ค์ ํ๊ธฐ**
```swift
let dateComponents = Calendar.current.dateComponents([.hour, .minute], from: date)
trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)
```**๋ณด๋ด๋ ์๋ฆผ์ category ์ค์ ํ๊ธฐ**
```swift
let textAction = UNTextInputNotificationAction(
identifier: "TEXT_ACTION",
title: "๊ฐ๋จํ๊ฒ ์ผ๊ธฐ ์ฐ๊ธฐ",
options: [],
textInputButtonTitle: "์ ์ถ",
textInputPlaceholder: "์ผ๊ธฐ๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์"
)let basicNotificationCategory = UNNotificationCategory(
identifier: "STUDENT_NOTIFICATION",
actions: [textAction, acceptAction],
intentIdentifiers: [],
hiddenPreviewsBodyPlaceholder: "์ผ๊ธฐ๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์",
options: .customDismissAction
)
```**์์ ํ ์๋ฆผ์ category์ ๋ฐ๋ผ action ์ค์ ํ๊ธฐ**
```swift
func userNotificationCenter(
_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void
) {
if response.notification.request.content.categoryIdentifier == "STUDENT_NOTIFICATION" {
switch response.actionIdentifier {
case "TEXT_ACTION":
print("didReceive: text inputโ)
if let userInput = (response as? UNTextInputNotificationResponse)?.userText {
print(userInput)
UserDefaults.standard.set(userInput, forKey: "diary")
UserDefaults.standard.set(true, forKey: "isDiarySubmitted")
// โฆ
```### Remote Notification
---
**APNs ๋ฑ๋ก ํ ๋๋ฐ์ด์ค ํ ํฐ ์์ฒญ**
```swift
application.registerForRemoteNotifications()
```**๋๋ฐ์ด์ค ํ ํฐ DB ์๋ฒ์ ์ ์ฅ**
```swift
private func saveUserTokenToFirestore(userId: String, token: String) {
db.collection("users").document(userId).
setData(["fcmToken": token], merge: true) { error in
// ..
}
}
```**FCM ํ ํฐ ์์ฑ**
```swift
func messaging(_ messaging: Messaging,
didReceiveRegistrationToken fcmToken: String?) {
let dataDict: [String: String] = ["token": fcmToken ?? ""]
NotificationCenter.default.post(
name: Notification.Name("FCMToken"),
object: nil,
userInfo: dataDict
)
}
```**Firebase Functions ํธ์ถ**
```swift
func sendNotificationToUser
(userId: String,title: String, body: String) {
let data: [String: Any] = [
"userId": userId,
"title": title,
"body": body
]
functions.httpsCallable("sendNotification").call(data)
{ result, error in
//..
}
}
```**Firebase Function ์์ ์๋ฆผ ์ ์ก (JavaScript)**
```jsx
exports.sendNotification = onCall(async (data, context) => {
const { userId, title, body } = data;
//..
const userDoc = await getFirestore().
collection('users').doc(userId).get();
const fcmToken = userDoc.data().fcmToken;
const message = {
notification: {
title: title,
body: body
},
token: fcmToken
};
await admin.messaging().send(message);
//..
}
}
```## :people_hugging: Authors
|||
|:-:|:-:|
|Groo
[@treesofgroo](https://github.com/treesofgroo)|์ด์ํ Ace
[@dgh06175](https://github.com/dgh06175)|