TIL

[Sesac IOS] 20일차 TIL

20일차 수업을 듣고 새로 공부한 것과 공부할 것을 정리한 글입니다.


Learned

User Notification(UN) 프레임워크

  • 앱으로부터 사용자의 기기에 알림을 표시하는 기능을 담당하는 프레임워크
  • 알림은 앱 실행 여부와 상관없이 알림 센터에 표기되며 옵션에 따라 커스텀 사운드와 뱃지를 사용할 수 있다.
  • 사용자가 앱 알림 권한을 허용했을때 알림이 표시되고 알림에 대해 특정 작업을 할때까지 계속 표시된다.
  • 디바이스 설정에서 앱 알림 표시 여부를 설정할 수 있다.
  • 알림을 생성하는 환경에 따라 로컬(Local)과 원격(Remote) 알림으로 나뉜다.
  • 로컬 알림(Local Notification)
    • 앱 내부에서 알림을 생성해 사용자 기기에 표시하는 방법
    • UserDefault처럼 앱 내부에 알림 정보(컨텐츠, 트리거)가 저장돼있어서
      대체적으로 비슷한 컨텐츠와 트리거로 구성된다.
    • 대표적으로 알람, 캘린더, To Do같은 1인 앱에서 사용한다. 
    • 무료 개발자 계정 상태에서도 구현할 수 있고 시뮬레이션 환경에서 테스트할 수 있다.
  • 원격 알림(Remote Notification)
    • 푸시(Push) 알림이라고 하며 서버에서 알림을 생성해 표시하는 방법
    • 서버에서 알림 정보를 만들기 때문에 다양한 콘텐츠와 일정하지 않은 트리거로 구성된다.
    • 대표적으로 카카오톡 채팅, 특정 시기의 프로모션 광고 등에 사용된다.
    • 서버에서 생성한 알림이 애플의 알림 서버(APNS, Apple Push Notification Service)를 통해 사용자에게 전달되기 때문에 애플의 인증을 받은 유료 개발자 계정이 있어야 한다.
    • 보통 시뮬레이션 환경이 아닌 실제 기기에서만 테스트할 수 있다.
원격 알림은 iOS 버전에 따른 정책과 최적화에 따라 알림이 전달되지 않거나 정확도가 떨어질 수 있다.

 

  • 사용자에게 알림 권한 승인을 요청할때 뱃지, 사운드같은 옵션 기능을 함께 요청할 수 있다.
  • 앱 최초 실행 시 권한 승인 요청 알럿을 띄우고 이후에는 띄우지 않는다.
  • 만약 승인되지 않은 경우 디바이스 설정의 앱 알림 화면으로 유도하는 코드를 작성해야한다.
  • 알림에 표시할 컨텐츠를 담당하는 객체 : UNNotificationContent
    • title, subtitle, body, sound 등의 데이터를 입력할 수 있다.
  • 알림의 발동(트리거)을 담당하는 객체 : UNNotificationTrigger
    • 시간 간격, 특정 시각, 위치에 따라 알림을 발동시킬 수 있다. 
    • 반복 알림 설정 시, 시간 간격을 최소 60초 이상으로 설정해야한다.
    • 반복 설정한 알림은 요청이 없어질때까지 계속 남아있다.
  • 알림의 요청을 담당하는 객체 : UNNotificationRequest
    • 알림의 컨텐츠와 트리거, 식별자 정보를 포함
    • 식별자가 다른 알림들은 별개로 취급되어 기기의 알림센터에 쌓인다.
    • 식별자가 같은 알림은 쌓이지 않고 수정되는 형태로 동작한다.
    • 알림을 관리해야할 필요성이 있는 경우 의미있는 식별자를 사용한다.
  • 기본적으로 알림은 foreground(Active, Inactive) 상태에서는 표시되지 않는다.
  • 사용자가 특정 동작을 했을때 뱃지 값과 알림이 변경되는 기능은 코드로 작성해야한다.
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

            // 디바이스에 전달된 알림 제거
            UNUserNotificationCenter.current().removeAllDeliveredNotifications()

            // 요청된(예약된) 알림까지 제거
            UNUserNotificationCenter.current().removeAllPendingNotificationRequests()

            UNUserNotificationCenter.current().delegate = self

            return true
        }

        // foreground 상태에서 알림 수신
        func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
            completionHandler([.list, .banner, .badge, .sound])
            // IOS 14 이상부터 alert이 list와 banner로 나뉘었다.

        }
}
    
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
        func sceneDidBecomeActive(_ scene: UIScene) {
            // 뱃지 제거
            UIApplication.shared.applicationIconBadgeNumber = 0
        }
}
  • iOS 14 버전부터 alert이 list와 banner로 나뉘었다.
  • iOS 15 버전부터 방해금지모드 같은 다양한 모드가 생기면서 알림에 우선순위가 생김.

 

Custom Font

  • 앱에 등록해서 사용하는 폰트는 앱의 용량에 포함됨.
  • 앱 용량을 최적화하기 위해 네비게이션 타이틀처럼 앱의 일부에만 폰트가 사용되는 경우
    이미지를 사용하기도 함.
  • 폰트마다 지원하는 문자가 달라서 어떤 글자는 보여지지 않을 수 있음.
  • 많은 앱에서 애플의 시스템 폰트(SF)를 쓰는 이유는 앱의 용량과 지원하는 문자의 다양성 때문
  • info.plist에 Fonts provided by application 키 추가해서 폰트 사용
  • .otf 또는 .ttf 파일을 프로젝트에 추가하고, 프로젝트 설정의 build phase에서 등록 확인
  • 폰트 파일 이름과 실제 폰트 이름이 다를 수 있으므로 반드시 폰트 이름 확인 후 사용
for family in UIFont.familyNames {
    for name in UIFont.fontNames(forFamilyName: family) {
        print(name)
    }
}

 

Learning

  • 카카오톡처럼 채팅 알림을 탭 했을때 채팅방으로 이동하는 기능 알아보기
  • 특정 채팅방에서 받은 알림 수 만큼 뱃지 변경하는 기능 알아보기
  • 사용자가 현재 채팅 화면 외에 알림만 받을 수 있는 기능 알아보기

이상입니다.

'TIL' 카테고리의 다른 글

[Sesac IOS] 22일차 TIL  (0) 2022.08.03
[Sesac IOS] 21일차 TIL  (0) 2022.08.01
[Sesac IOS] 19일차 TIL  (0) 2022.07.28
[Sesac IOS] 18일차 TIL  (0) 2022.07.27
[Sesac IOS] 17일차 TIL  (0) 2022.07.26