๋ฐ์ํ
UNNotificationServiceExtension
์๊ฒฉ ํธ์ ๋ ธํฐํผ์ผ์ด์ ์ ์ปจํ ์ธ ๋ฅผ ์์ ํ๋ ๊ฐ์ฒด. ์ฌ์ฉ์์๊ฒ ์ ๋ฌ๋๊ธฐ ์ ์ ์ํ๋จ
class UNNotificationServiceExtension : NSObject
- notification service ์ฑ ๊ธฐ๋ฅ ํ์ฅ => ์ฌ์ฉ์์๊ฒ remote notification ์ด ์ ๋ฌ๋๊ธฐ ์ด์ ์ ์ปจํ ์ธ ๋ฅผ ์ปค์คํฐ๋ง์ด์ง ํ ์ ์๋ ๊ธฐ๋ฅ
- UI๋ฅผ ๊ฐ์ง์ง ์์
- notification ์ด ์ฌ์ฉ์์ ๊ธฐ๊ธฐ์ ์ ๋ฌ๋๋ฉด ๋ฐ์นญ๋จ
- notification ์ ๋ด์ฉ์ ์์ ํ๊ฑฐ๋ ์ด๋ฏธ์ง, ๋น๋์ค ๋ฑ์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์์ผ๋ฉฐ ์ํธํ ํน์ ๋ณตํธํ๋ฅผ ์ํํ ์๋ ์์
- silent notification, ์ฌ์ด๋๋ง ์ฌ์์ํค๊ธฐ, ์ฑ ์์ด์ฝ์ ํ์๋๋ ๋ฑ์ง๋ ๋ณ๊ฒฝ ๋ถ๊ฐ
- UNNotificationServiceExtension์ ์ง์ ์์ฑํ๋ ๊ฒ์ด ์๋๋ผ target์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํจ
- target์ ์ถ๊ฐํ๋ฉด UNNotificationServiceExtension์ ์๋ธ ํด๋์ค๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ด๋ฅผ ์์ ํ์ฌ ์ฌ์ฉํจ
- ์ฑ์ด remote notification์ ๋ฐ์ -> ์์คํ ์ด UNNotificationServiceExtension์ didRecive(_:withContentHandler:) ๋ฉ์๋๋ฅผ ๋ก๋ํจ
ํ๊ฒ ์ถ๊ฐํ๊ธฐ
- File > New > Target ์ ์์๋๋ก ์ ํํ์ฌ Target์ ์ถ๊ฐํด ์ค ๋๋ xcodeproj์์ ํ๋จ์ + ๋ฒํผ ๋๋ฌ์ ์ถ๊ฐ
- Notification Service Extension ์ ํ
- Product Name๊ณผ Team ์ค์ ํ Finish ์ ํ. Language๋ obj-c ์ ํ ๊ฐ๋ฅ
ํ๊ฒ ์ค์ ํ๊ธฐ
- ๋น๋ ํ์ง ๋ง๊ณ xcodeproj ์์ ์ถ๊ฐํด ์ค notification service target ์ ํ ํ Automatically manage signing ์ฒดํฌ ํด์ง (์ฒดํฌ ํด ๋์ผ๋ฉด Bundle Identifier๋ถํฐ Provisioning Profile๊น์ง ์๋์ผ๋ก ์์ฑ๋จ )
- ๋ฐ๋ก ๋ฐ์ ๋ด์ฉ์ ์๋ ์์ฑ์ ์ฐธ๊ณ
- ๋ฐ์ด๋๋ฆฌ ์ด์ ๋๋ฌธ์ ์ฑ ์ฌ์ฌ ์์ฌ๋ผ๊ฐ => Automatically manage signing ์ฒดํฌ ํ๋ฉด ์๋์ผ๋ก ํ๋ก๋น์ ๋ ํ๋กํ์ผ์ ์ค์ ํด ์ค
๋ง์ฝ ์๋์ผ๋ก ์ค์นํ๋ค๋ฉด developer.apple.com > Identifiers > notification service extension identifiers ์ ํ > Capabilities ์ถ๊ฐ- ํ์ธํด ๋ณด๋ Push Notifications๋ฅผ ํฌํจ์ํค์ง ์์๋ ๋จ
- save > confirm ๋๋ฅด๋ฉด ๊ธฐ์กด์ ์์ฑํด ๋์๋ provisioning profile์ด invoke ๋จ
ํ๋ก์ ํธ๋ก ๋์์์ Notification Service Extension Target ์ ํ > ์๋จ์ + ๋ฒํผ ๋๋ฌ์ Capabilities ์ถ๊ฐ > Push Notifications ์ ํ- ํ์ธํด ๋ณด๋ Notification Service์ Push Notifications Capabilities๋ ์ถ๊ฐํ์ง ์์๋ ๋จ
โญ ์ค์ โญ
- target ์ ํ๋ ์ํ์์ General ํญ์ผ๋ก ์ด๋
- Identity์์ version build๋ ์ฑ ๋ฒ์ ๋ฐ๋ผ๊ฐ์ผ ํจ. ๋น๋๋ ๊ฐ๋ฐ์์ run์ ์ ์ ๋์ํ์ง๋ง ์ฑ ์คํ ์ด์ ์ ๋ก๋ํ ๋ ๋ฌธ์ ์๊น
- ๊ผญ Deployment Info ๋ฒ์ ์ด ์ฑ์์ ์ค์ ํ OS ๋ฒ์ ๊ณผ ๊ฐ์์ง ํ์ธ
Bundle Identifier์ Provisioning Profile ์์ฑํ๊ธฐ
- developer ์ฌ์ดํธ์ ๋ก๊ทธ์ธ ํ Certificates, Identifiers & Profiles ํญ๋ชฉ์์ Identifiers ์ ํ
- + ๋ฒํผ ๋๋ฌ์ Bundle Identifier ์ถ๊ฐ
- App IDs ์ ํ ํ Continue ์ ํ -> App ์ ํ ํ Continue
- Description์ Bundle ID ์์ฑ
- โญ ์ด๋ Bundle ID๋ ์ฑ์ ๋ฒ๋ค ์์ด๋๊ฐ com.test.app ์ด์๋ค๋ฉด com.test.app.XXXX ์ด๋ ๊ฒ prefix๋ฅผ ๋ฐ๋ผ๊ฐ์ผํจ (XXXX ๋ถ๋ถ์ ์ํ์๋ ์ด๋ฆ์ผ๋ก ํ์๋ฉด ๋ฉ๋๋ค)
- โญ ๋ง์ฝ com.test.app.XXXX.XXXX ์ด๋ ๊ฒ dot์ด ๋ ๋ฒ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ ์ฑ ์คํ ์ด ์ฌ๋ฆด ๋ Bad Identifier ๊ฒฝ๊ณ ๋ฐ์ํจ (๋ฏธ๋ฆฌ ์ข ์๋ ค์ฃผ์ง ์ ํ...)
- Bundle ID ์์ฑ ํ provisioning profile ์์ฑ (๊ธฐ์กด ์ฑ์ provisioning profile ์์ฑ๊ณผ ๋์ผ)
- ๊ฐ๋ฐ์์๋ iOS App Development, ์ฑ์คํ ์ด ์ฌ๋ฆด ๋ App Store ์์ฑํด ์ฃผ๋ฉด๋จ(๊ธฐ์กด ์ฑ provisioning profile ์์ฑ๊ณผ ๋์ผ)
- App ID์์ ๋ฐฉ๊ธ notification service extension์ ์ํด ์์ฑํ Bundle Identifier ์ ํ ํ continue, download
- ๋ค์ ํ๋ก์ ํธ๋ก ๋์์์ Bundle Identifier ์์ , Provisioning Profile ์ Import ํด์ฃผ๋ฉด ๋จ (๊ฐ๋ฐ์์๋ configurations๋ฅผ Debug, ์คํ ์ด ๋ฐฐํฌ์ Release ์ ์ ์ฉ)
Pod ์ถ๊ฐ
target 'Notification Service Extension ์ด๋ฆ ' do
pod 'Firebase/Messaging'
end
- target ๋ช ์นญ์ target ์ถ๊ฐ์ ์ ๋ ฅํด ์ฃผ์๋ Product Name (์๋ ์ด๋ฏธ์ง ์ฐธ๊ณ )
Processing Notifications
func didReceive(
_ request: UNNotificationRequest,
withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void
)
- notification ๋ณ๊ฒฝ์ ์์ฒญํ ๋ค ์๋ฃ๋๋ฉด cotentHandler๋ก ๋ณ๊ฒฝ๋ content ์ ๋ฌ
- request์ ์๋ notification request ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์.
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
var bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
bestAttemptContent.title = "์์ ๋จ : \(bestAttemptContent.title)"
bestAttemptContent.body = "์์ ๋จ : \(bestAttemptContent.content)"
Messaging.serviceExtension().populateNotificationContent(bestAttemptContent, withContentHandler: contentHandler)
contentHandler(bestAttemptContent)
}
}
- request.content๋ฅผ ์์ ํ ๋ค contentHandler๋ก ์ ๋ฌ, Firebase์ Messagin.serviceExtension().populateNotificationContent์ ์์ ๋ notification๊ณผ handler ์ ๋ฌ
์ถ๊ฐ
func serviceExtensionTimeWillExpire()
- didReceive์์ completion block ์ฒ๋ฆฌ๊ฐ ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํจ (๋ํ๋จผํธ์๋ last chance to execute the block์ด๋ผ ์ค๋ช ๋์ด ์์)
- ์ฉ๋์ด ํฐ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ํ ๊ฒฝ์ฐ ํด๋น ๋ฉ์๋ ์ฒ๋ฆฌ ํ์(๋ง์ฝ didReceive์์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ์ํํด์ ์ ํด์ง ์๊ฐ ๋ด์ completion handler์ ์คํํ์ง ๋ชปํ ๊ฒฝ์ฐ ์ค๋ฆฌ์ง๋ ์ปจํ ์ธ ๊ฐ ํ์๋จ)
mutable_content ์ถ๊ฐํ๊ธฐ
- apns ํ์ผ์ ์ฌ์ฉํ ๋ "mutable-content" : true ํน์ "mutable-content" : 1 ์ ๋ณด๋ด์ผ ํจ
- firebase์์ ํ์ด๋ก๋๋ "mutable_content" : true ํน์ "mutable_content" : 1
- โญ์ฃผ์ ์ฌํญ(์ฝ์ง ๊ตฌ๊ฐ ์ฃผ์โ) : firebase์์ payload๋ ์ธ๋๋ฐ!!!, apns์์๋ ์ง๋๊ธฐ
- (์ฝ์ง ๊ตฌ๊ฐ ์ฃผ์โ) ํน์ ํธ์ ์์ ํ์๋ ๋ฐฑ์๋ ๋ถ ๋ฐ๋ก ์๊ณ ๋๋ ํ๋ก ํธ๋ง ํ๋ค -> ๋ณ๊ฒฝ๋ ํธ์๋ก ์์ค๋๋ฐ ๋ฐฑ์๋ ์์ ๋๋ฌ๋ค๊ณ ์๋ด๋ฐ์ ->ํ๋ก ํธ๋ ๋ฌธ์ ์๋๊ฑฐ ๊ฐ๋ค -> ์๋ ๋ฐฉ๋ฒ์ผ๋ก ํ์ธ
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
- UNUserNotificationCenterDelegate ์ didReceive, willPresent์์ ๋ธ๋ ์ดํฌ ํฌ์ธํธ ๊ฑธ๊ณ ์ฝ์๋ก
- didReceive์์๋ response.notification.request, willPresent์์๋ notification.requet ํ์ธ
- mutableContent: YES๋ก ์์ผ ์ ์ ์๋. ์ด ๋ถ๋ถ์ด NO๋ก ์ค๋ฉด payload ์์น๋, ์คํ ํ์ธ
์ฑ์คํ ์ด ์ ๋ก๋
- ์คํฌ๋กค ๋ด๋ ค์ NotificationService์ ๋ฐฐํฌ์ฉ ํ๋ก๋น์ ๋ ํ์ผ ์ ํ
์๋ฌ ํธ๋ค๋ง
- ์์ ๋ ํธ์๋ก ์์ฌ๊ฒฝ์ฐ
- mutable_content ๋ฅผ true๋ก ๋ณด๋ด๊ณ ์๋์ง ํ์ธ
- ๋น๋๊ฐ ์๋จ
- DerivedData ์ญ์ -> ๋น๋ ํด๋ฆฐ -> ์ฌ๋น๋ (DerivedData ์ญ์ ํ๋ ๋ฒ : terminal์์ rm -rf ~/Library/Developer/Xcode/DerivedData ์ ๋ ฅํ์ฌ ์ญ์ )
- pod ํ์ผ์ ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ํผ : pod update > ๋น๋ ํด๋ฆฐ > ์ฌ ๋น๋
- multiple pod ํ์ธ : target์ ์ค๋ณต๋ pod์ด ๋ค์ด๊ฐ ๊ฒฝ์ฐ
=> ์ค๋ณต๋๋ pod์ shared_pods์ผ๋ก ์ ์ํ์ฌ ์ฌ์ฉ.
=> ํ๊ฒ์ use_frameworks! ์ถ๊ฐํ๊ธฐ -> pod update
=> GoogleUtilities ์ถ๊ฐํด์ผ ํ๋ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ๊ฒฝ๊ณ ๋ธ ์ด๋ pod์ ์ถ๊ฐํด์ฃผ๊ณ pod update ํน์ install
- ์ฑ์คํ ์ด์ ์์ฌ๋ผ๊ฐ
- Notification Service extension version์ด ์ฑ์ ๋ฒ์ ๊ณผ ์ผ์นํ๋ ์ง ํ์ธ
- bad identifier์ธ์ง ํ์ธ (bundle ID ๊ธฐ์ค์ด ์๊ฐ๋ณด๋ค ์๊ฒฉ...) : ์๋ฅผ ๋ค์ด ์ฑ์ ๋ฒ๋ค ์์ด๋๊ฐ com.app.ex์ธ๋ฐ Notification Service Extension ์ bundle id์ .์ด ๋ ๊ฐ ์ด์์ธ ๊ฒฝ์ฐ bad identifier! com.app.ex.notification.service => com.app.ex.notification์ผ๋ก ์์
์ฐธ๊ณ ์ฌ์ดํธ
https://developer.apple.com/documentation/usernotifications/unnotificationserviceextension
https://yoonandro.tistory.com/98
ํน์ ์ด์ํ๊ฑฐ๋ ์ ๋ชป๋ ๊ฒ์ด ์๋ค๋ฉด ์ธ์ ๋ ๋๊ธ ๋ถํ๋๋ ค์!
728x90
๋ฐ์ํ
'๐ iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] UIButton ์์ง์ผ๋ก ๋ฐฐ์นํ๊ธฐ with Configuration (2) | 2022.06.28 |
---|---|
[iOS/Swift] UICollectionViewCell ์์๋ณด๊ธฐ (0) | 2022.06.27 |
[Swift] MVVMC์ Coordinator ์์๋ณด๊ธฐ (0) | 2022.06.14 |
[Swift] UITextField borderStyle ํ ์คํธ ํ๋ ํ ๋๋ฆฌ ์ค์ (0) | 2022.06.13 |
[Swift] MVVMC ๊ฐ๋จํ๊ฒ ์์๋ณด๊ธฐ (0) | 2022.06.11 |
๋๊ธ