240905 TIL

나고수·2024년 9월 6일
0

2024 TIL

목록 보기
62/94
post-thumbnail

① 배운 것

IOS 알림올때 뱃지 표출하게 하는방법

  1. 안드로이드의 sharedPreferece 같은것이 ios의 userDefaults이고 이걸 활용해서 뱃지 표출을 한다.
  2. 노티에서 badge 라는 키값으로 아무숫자나 주면됨
{"aps":
    {"alert":"Notification Hub test notification2",
     "badge":1, 
     //이 숫자가 올바른 필요는 없다. 항상 1로 내려줘도 됨. 
     //이 숫자를 프론트에서 가공해서 쓰는것임.
     "sound":"Default"}
} 
  1. extension(여기서는 NotificationExtension과 사용)과 연계하여 userDefault를 사용해야하는데 그러면 app group이라는것을 지정해줘야함
  • 여기여기를 참고하여 app group 등록 후 app-group 기능이 포함된 profiles를 다시 만들고 다운받아서 xcode signing&capability에 세팅해줘야함
  • 🚨 주의 할 점 : target에서 Runner과 NotificatonServiceExtension 모두 app group을 설정해줘야함
    그렇지 않으면 둘 사이에 userDefaults가 공유되지 못한다.

그런데 XCode에 app group이 포함된 새로운 profiles를 등록할때는 일일이 세팅해주지 않아도 되고 일단 애플디벨로퍼에서 app group이 포함된 profiles를 만들어 놓기만 하고 automatically managing singing을 클릭하면 등록된 profiles 중에 적용 가능한걸 알아서 적용시켜준다.

그리고 만약 앱디스트리뷰션을 사용하고자 한다면, profiles만들때 device를 개발자 device만 선택해서 등록하는게 아니라 앱 디스트리뷰션에서 테스트할 유저들 device도 모두 선택해서 등록해야한다. 그렇지 않으면 앱 디스트리뷰션에서 '기기가 등록되었으며 이제 준비가 끝났습니다. 앱을 테스트할 준비가 되면 이메일이 전송됩니다.'라는 문구가 뜨고 앱을 다운 받을 수 없다.

  1. AppDelegate.swift에 applicationWillEnterForeground(앱이 Foreground(화면) 에 나오기 시작할 때 실행되는 메소드), applicationDidBecomeActive(백그라운드로 갔던 앱이 다시 정면에 나타난 이후 실행되는 메소드, applicationWillEnterForeground 이후에 실행됨)에 userDefaults의 뱃지 갯수를 초기화 하는 코드를 넣는다.
    사실 applicationWillEnterForeground여기에만 뱃지 갯수 초기화하는 코드를 넣었어도 되었을것 같다.
 func resetBadgeCount() {
   if let userDefaults = UserDefaults(suiteName: "group.co.a.b") {
     userDefaults.set(0, forKey: "badge")
     UIApplication.shared.applicationIconBadgeNumber = 0
   }
 }

 override func applicationWillEnterForeground(_ application: UIApplication) {
   resetBadgeCount()
 }

 override func applicationDidBecomeActive(_ application: UIApplication) {
   resetBadgeCount()
 }
  1. UNNotificationServiceExtension의 didReceive함수(알림을 받으면 호출됨) 에 알림을 표출 시키기 직전에 아래 코드를 넣어 뱃지 갯수를 설정한다.
 if let userDefaults = UserDefaults(suiteName: "group.co.a.b") {
   let badgeCount = userDefaults.integer(forKey: "badge")
   if badgeCount > 0 {
     userDefaults.set(badgeCount + 1, forKey: "badge")
     //서버에서 badge라는 키값으로 준 데이터에 프론트에서 가공한 숫자를 넣어줌 
     bestAttemptContent!.badge = badgeCount + 1 as NSNumber
   } else {
     userDefaults.set(1, forKey: "badge")
     bestAttemptContent!.badge = 1
   }
 }
 //알림표출
 contentHandler(bestAttemptContent!)

ios의 userDefaults는 여기서 확인가능

ios UNNotificationServiceExtension에서 flavor에 따라 다른 값 보여주는 방법

  • userDefults를 활용한다.
  • AppDelegate.swift의 application함수에 아래 코드를 활용해 현재 flavor을 저장한다.
if let userDefaults = UserDefaults(suiteName: "group.co.a.b") {
  let flavor = Bundle.main.infoDictionary ? ["App Flavor"]
  userDefaults.set(flavor, forKey: "flavor")
}
  • UNNotificationServiceExtension에서 아래 함수로 userDefault에 저장된 flavor을 확인해 필요한 처리를 한다.
 func getImageBaseUrl() -> String {
   let urlMap = [
     "dev": "dev",
     "prod": "prod"
   ]

   if let userDefaults = UserDefaults(suiteName: "group.co.a.b"),
     let flavor = userDefaults.string(forKey: "flavor"),
       let url = urlMap[flavor] {
         return url
       }

   return ""
 }
  • UNNotificationServiceExtensio에서 직접 Bundle.main.infoDictionary ? ["App Flavor"]을 호출하는 것은 작동이 안됨.

알림의 구조

  • notification과 data로 이루어짐.
  • 보통 notification의 title, body를 활용하는것이 일반적!

② 회고 (restropective)

  • ios를 암것도 몰랐지만 알고보면 로컬저장이라던지 앱 라이프사이클이라던지 안드로이드와 비슷한 점이 많은것같다. 역시 하나를 잘해두면 다른 것은 좀 쉽게 가져갈 수 있다.
  • 하지만 ios만의 profiles나 app-group, extension같은건 처음해봐서 좀 어려웠다.
  • ios는 알림 뱃지 표시하는것도 정말 어렵다 쉽지않군 😑
  • 어쨌든 안드로이드와 ios 모두 메시지타입 푸시알림을 해내서 아주 뿌듯하다.

③ 개선을 위한 방법

profile
되고싶다

0개의 댓글