Open DojinPark opened 1 year ago
아키텍쳐 | 요약 | 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 |
: 사용자의 국가 코드
Locale.current.regionCode // get-only
예) "KO"
사용 예) 광고 요청시 유저 타겟팅 정보로 넘길 수 있음.
: 사용자 국가의 언어 코드
Locale.current.languageCode // get-only
: 사용자가 OS "언어 및 지역" 설정에서 지정한 값 "언어코드-지역코드"
Locale.current.preferredLanguages // get-only
예) ["ko-KR", "en-KR"]
지역은 하나만 설정 가능
예) UITableView나 UICollectionView 등의 동작에 대한 예시
예) 이미지 다운로드, 파일 열기 등 비동기와 관련된 기능이 있을 때 재사용 로직에서 처리해야 할 작업의 예시
Apple: dequeueReusableCell(withIdentifier:)
다들 아실거라 생각. 셀 오브젝트를 재사용해서 오브젝트를 새로 할당, 파괴 하는 시간을 줄여주고, 메모리 사용량을 줄여주는 함수.
원리나 성능에 대한 자료는 잘 없음..!
Apple: Asynchronously Loading Images into Table and Collection Views
요약: dequeueReusableCell 먼저, NSCache 를 이용한 이미지 다운로드를 나중에! 참고: 코드 사진의 ImageCache 는 예시 코드에 따로 작성된 커스텀 클래스임!
tableView(:numberOfRowsInSection:), tableView(:cellForRowAt:) 등의 함수를 override 하는 방법
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 배우시는 분들 환영할 듯!). 기본적으로 제공되는 컴포넌트에 텍스트 넣고, 이미지도 넣고, 배지도 넣고 이것저것 요소를 뷰를 직접 짜지 않고 구성할 수 있음.
모르고 있다. SDK 개발하면서 그런거 못해봤습니다...
apple: Using background tasks to update your app
medium: Swift iOS BackgroundTasks framework
같은 BGTask 지만 어떻게 실행되느냐에 따라 subclass 인 BGAppRefreshTask 나 BGProcessingTask 로 취급됨. (제가 제대로 이해헀다면...)
BGAppRefreshTask | BGProcessingTask | |
---|---|---|
실행 시점 | Background로 보낸 직후 부터 OS에서 스마트하게 실행시점 판단하여 실행 함. |
아이폰이 idle 상태가 되어야 실행 됨. |
expriation limit | 30초 | 5분 정도 |
OS 에서 스케쥴 가능한 최대 태스크 수 | 1개 | 10개 |
특징 | - 백그라운드로 보낼 때 마다 피드에 새로운 데이터 업데이트 하는 정도에 적합 |
- 앱을 사용하지 않은 지 1주일 이내 까지 실행 됨. 그리고 태스크를 늦어도 이틀 이내에는 실행하려고 함. |
- 실행 조건으로 네트워크 연결 상태, 배터리 상태를 고려 함. |
Info.plist 에 "Permitted background task scheduler identifiers" 에 id 스트링을 등록할 태스크 개수 만큼 추가하기.
유저가 설정에서 "백그라운드 앱 새로 고침" 을 활성화 해두어야 함...
// 코드 상에서 확인하는 법
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 설정 까먹으셨음 ㅠ
}
}
iOS Swift 다국어 설정 - Code Localizing
Medium: Active, Inactive, Background State
위 세가지 값은 UIApplication.shared.applicationState
으로 코드 상에서 확인 가능
그리고 두 가지 상태가 더 있음 iOS interview questions 2023: Application States
다섯가지 State 변화에 대한 동작은 전부 AppDelegate 함수로 관리 가능!!!
@main
struct WidgetService: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
WidgetView()
}
}
1 앱구조 (계속)
- I386, X86_64, armv7s, arm64의 의미를 설명할 수 있다.
- RegionCode, LanguageCode, PreferredLangues의 차이점을 설명할 수 있다.
- List 화면에서 메모리 절약을 위한 View 재사용 로직을 이해하고 있다. 예) UITableView나 UICollectionView 등의 동작에 대한 예시 예) 이미지 다운로드, 파일 열기 등 비동기와 관련된 기능이 있을 때 재사용 로직에서 처리해야 할 작업의 예시
- 백그라운드 처리가 필요할 때 backgroundTask를 처리하는 방법을 알고 있다.
- 다국어를 지원할 수 있다.
앱의 life-cycle event를 받는 delegate의 종류와 종류별 차이를 설명할 수 있다.
앱을 포그라운드 상태에서 백그라운드로 전환했다가 다시 포그라운드로 전환했을 때 호출되는 delegate의 함수에는 어떤 것들이 있는지 설명할 수 있다.
- 앱이 inactive인 상태는 어떤 경우인지 설명할 수 있다.
UIViewController에서 앱의 백그라운드와 포그라운드 진입에 따라 어떤 추가적인 작업을 해야 하는지 설명할 수 있다.
Xcode의 Capabilities에 있는 Background Modes의 종류를 알고 있다.
URI scheme 방식의 문제점을 알고 있다.
App Lifecycle
Universal Link
Multitasking