iOS-Children-Study / Growth-Study

성장로드맵 체크포인트 기반 스터디 레포입니다.
1 stars 0 forks source link

박도진_0411 #6

Open DojinPark opened 1 year ago

DojinPark commented 1 year ago

1 앱구조 (계속)

- I386, X86_64, armv7s, arm64의 의미를 설명할 수 있다.

- RegionCode, LanguageCode, PreferredLangues의 차이점을 설명할 수 있다.

- List 화면에서 메모리 절약을 위한 View 재사용 로직을 이해하고 있다. 예) UITableView나 UICollectionView 등의 동작에 대한 예시 예) 이미지 다운로드, 파일 열기 등 비동기와 관련된 기능이 있을 때 재사용 로직에서 처리해야 할 작업의 예시

- 백그라운드 처리가 필요할 때 backgroundTask를 처리하는 방법을 알고 있다.

- 다국어를 지원할 수 있다.

- 앱이 inactive인 상태는 어떤 경우인지 설명할 수 있다.

DojinPark commented 1 year ago

I386, X86_64, armv7s, arm64의 의미를 설명할 수 있다.

참고링크

아키텍쳐 요약 macOS iOS, iPadOS Mac Catalyst tvOS watchOS
i386(32bit intel) 제~일옛날것 (iOS ~6.1) 시뮬레이터 전용
x64_64(64bit intel) 완전옛날것 (iOS 7.0~)
armv7 옛~날것 ~A5 armv7k
armv7s 옛날것 A6
x86_64 인텔맥 인텔맥(2005~2021) O 시뮬레이터 전용 시뮬레이터 전용
arm64 A칩, M칩 애플실리콘(2022~) A7~ (iOS <=6.1), M칩 O O arm64_32
DojinPark commented 1 year ago

RegionCode, LanguageCode, PreferredLangues의 차이점을 설명할 수 있다.

regionCode (deprecated)

: 사용자의 국가 코드

Locale.current.regionCode // get-only

languageCode (deprecated)

: 사용자 국가의 언어 코드

Locale.current.languageCode // get-only

preferredLanguages

: 사용자가 OS "언어 및 지역" 설정에서 지정한 값 "언어코드-지역코드"

Locale.current.preferredLanguages // get-only

DojinPark commented 1 year ago

List 화면에서 메모리 절약을 위한 View 재사용 로직을 이해하고 있다.

테이블뷰/콜렉션뷰 .dequeueReusableCell()

Apple: dequeueReusableCell(withIdentifier:)

다들 아실거라 생각. 셀 오브젝트를 재사용해서 오브젝트를 새로 할당, 파괴 하는 시간을 줄여주고, 메모리 사용량을 줄여주는 함수.

원리나 성능에 대한 자료는 잘 없음..!

비동기 작업을 함께 처리할 때 (셀에 이미지 다운로드 하기)

Apple: Asynchronously Loading Images into Table and Collection Views

코드 사진

요약: dequeueReusableCell 먼저, NSCache 를 이용한 이미지 다운로드를 나중에! 참고: 코드 사진의 ImageCache 는 예시 코드에 따로 작성된 커스텀 클래스임!

테이블뷰/콜렉션뷰 구현 방법 두 가지: 우리가 쓰던 방법 vs 미래

  1. tableView(:numberOfRowsInSection:), tableView(:cellForRowAt:) 등의 함수를 override 하는 방법

  2. UITableViewDiffableDataSource 와 NSDiffableDataSourceSnapshot 을 이용하는 방법

Apple: Updating Collection Views Using Diffable Data Sources (iOS 15.0+)

// 1. 데이터 소스 선언
self.dataSource = UITableViewDiffableDataSource<Section: Identifiable, Item: Identifiable> { (tableView: UITableView, indexPath: IndexPath, item: Item) -> UITableViewCell? in
    return tableView.dequeueConfiguredReusableCell(using:myCellRegistration, for: indexPath, item: myItem)
}

// 2. 스냅샷을 이용해 데이터 수정
// 예) 새로운 아이템 추가
snapshot = self.dataSource.snapshot()
snapshot.appendItems([newIem], toSection: mySection)

모던 웨이 오브 컴포징 콜렉션 뷰

Apple: Implementing Modern Collection Views (iOS 14.0+)

위 링크의 방법을 따라 UICollectionViewCompositionalLayout 을 이용하면 복잡한 레이아웃을 명시적인 스타일로 구성할 수 있음(SwiftUI 배우시는 분들 환영할 듯!). 기본적으로 제공되는 컴포넌트에 텍스트 넣고, 이미지도 넣고, 배지도 넣고 이것저것 요소를 뷰를 직접 짜지 않고 구성할 수 있음.

DojinPark commented 1 year ago

백그라운드 처리가 필요할 때 backgroundTask를 처리하는 방법을 알고 있다.

모르고 있다. SDK 개발하면서 그런거 못해봤습니다...

apple: Using background tasks to update your app

medium: Swift iOS BackgroundTasks framework

BGAppRefreshTask vs BGProcessingTask

같은 BGTask 지만 어떻게 실행되느냐에 따라 subclass 인 BGAppRefreshTask 나 BGProcessingTask 로 취급됨. (제가 제대로 이해헀다면...)

BGAppRefreshTask BGProcessingTask
실행 시점 Background로 보낸 직후 부터 OS에서
스마트하게 실행시점 판단하여 실행 함.
아이폰이 idle 상태가 되어야 실행 됨.
expriation limit 30초 5분 정도
OS 에서 스케쥴 가능한 최대 태스크 수 1개 10개
특징 - 백그라운드로 보낼 때 마다 피드에
새로운 데이터 업데이트 하는 정도에 적합
- 앱을 사용하지 않은 지 1주일 이내 까지 실행 됨.
그리고 태스크를 늦어도 이틀 이내에는 실행하려고 함.
- 실행 조건으로 네트워크 연결 상태, 배터리 상태를 고려 함.

백그라운드 태스크를 위해 필요한 사전 설정

  1. XCode 프로젝트에서 Capability 추가 하기.
    • Background fetch = BGAppRefreshTask
    • Background processing = BGProcessingTask
백그라운드 태스크 설정
  1. Info.plist 에 "Permitted background task scheduler identifiers" 에 id 스트링을 등록할 태스크 개수 만큼 추가하기.

  2. 유저가 설정에서 "백그라운드 앱 새로 고침" 을 활성화 해두어야 함...

    // 코드 상에서 확인하는 법
    switch UIApplication.shared.backgroundRefreshStatus {
        case .available:
        case .denied:
        case .restricted: // "자녀 보호 제한" 같은거 걸려 있어서 설정 자체를 못할 때
        default:
    }

구현 방법

import BackgroundTasks

// BGTask 등록 하기.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    // 앱이 시작 됨.

    BGTaskScheduler.shared.register(forTaskWithIdentifier: "com.마이BGTask아이디", using: nil) { task in

        self.handleAppRefresh(task: task as! BGAppRefreshTask)

        task.expirationHandler = {
            // 태스크 Expired
            task.setTaskCompleted(success: false)
        }

        // 태스크 실행 전 최소 대기 시간. 1주일 이하로 설정하면 됨.
        task.earliestBeginDate = Date(timeIntervalSinceNow: 60)

        // 남은 Expiration Time 조회하는 법
        UIApplication.shared.backgroundTimeRemaining

        // 실행할 코드
        123123123

        // 태스크 완료
        task.setTaskCompleted(success: true)

        // 주의: BGTaskScheduler.shared.register 는 AppDelegate 의 func application: didFinishLaunchingWithOptions: 같은 곳에서 한 번만 실행하는 것이 좋음. 중복 실행하면 크러쉬 남!!
    }
}

// 태스크 실행 대기 시키는 법.
func applicationDidBecomeActive(_ application: UIApplication) {
    // 앱이 백그라운드로 감.

    do {
        let backgroundAppRefreshTaskRequest = BGAppRefreshTaskRequest(identifier: "com.마이BGTask아이디")
        backgroundAppRefreshTaskRequest.earliestBeginDate = Date(timeIntervalSinceNow: 15 * 60)
        try BGTaskScheduler.shared.submit(backgroundAppRefreshTaskRequest)
    } catch {
        // BGTaskSchedulerErrorCodeUnavailable = 유저가 거부함..ㅠ
        // BGTaskSchedulerErrorCodeTooManyPendingTaskRequests = 이미 할 일 넘 많음 ㅠ
        // BGTaskSchedulerErrorCodeNotPermitted = 프로젝트 Capability 설정 까먹으셨음 ㅠ
    }
}
DojinPark commented 1 year ago

다국어를 지원할 수 있다.

iOS Swift 다국어 설정 - Code Localizing

  1. 전제: UI에 표시할 텍스트 쓸 일이 있으면 코드에 바로 쓰지 않고 *.strings 파일에서 가져다 써야 합니다.
Screenshot 2023-04-11 at 18 02 26
  1. 프로젝트 설정에서 언어 추가 하기
다국어설정
  1. 그러면 *.strings 파일에 새로운 언어가 자동으로 추가됩니다!
Screenshot 2023-04-11 at 18 02 26
  1. *.strings 파일은 이렇게 작성하고, 코드상에서 String.localizedStringWithFormat(_ string, VarArg) 로 가져다 쓰면 됩니다.
다국어설정 3 Screenshot 2023-04-11 at 18 05 32
DojinPark commented 1 year ago

앱이 inactive인 상태는 어떤 경우인지 설명할 수 있다.

Medium: Active, Inactive, Background State

위 세가지 값은 UIApplication.shared.applicationState 으로 코드 상에서 확인 가능 그리고 두 가지 상태가 더 있음 iOS interview questions 2023: Application States

다섯가지 State 변화에 대한 동작은 전부 AppDelegate 함수로 관리 가능!!!

JooYoung1121 commented 1 year ago

Widget