목록iOS/iOS (26)
iOS 개발 공부
Dynamic App Icon특정기간이나 특정 조건에서 앱 아이콘을 바꾸고 싶을 때 앱 배포를 하지 않고 앱 아이콘을 바꾸는 방법Assets 에 원하는 AppIcon(BIcon, CIcon, DIcon) 들을 추가 Targets → Build Setting(All) → Alternate App Icon Sets 에서 Assets에 추가한 AppIcon(BIcon, CIcon, DIcon) 들을 입력UIApplication.shared.setAlternateIconName(String?:) 호출https://github.com/user-attachments/assets/345e9eda-495d-4ce7-a5f1-4d2f496ffb33 import UIKitclass ViewController: UIV..
App SandboxApp Sandbox는 커널 수준에서 강제 적용되는 접근 제어 기술macOS 앱의 시스템 리소스와 유저 데이터에 대한 접근을 제한하여 앱이 손상되었을 피해를 최소화앱 샌드박스는 권한 부여를 통해 요청된 리소스에 대한 앱의 액세스를 제한하여 시스템 리소스 및 사용자 데이터에 대한 보호를 제공Mac APP Store로 배포되는 모든 app 들은 App Sandbox를 적용흔히 iOS는 보안이 좋다라고 나오는 말이 App Sandbox 때문Without App Sandbox & With App SandboxApp Sandbox가 적용되지 않는 앱은 모든 유저 데이터와 시스템 리소스에 접근 가능하기 때문에 보안 취약점이 발생한다면 모든 데이터 및 리소스를 해커가 가져갈 수 있게 됨.그래서 a..
Responder Chain에서 나온 hitTest터치 이벤트에 반응한 View가 어떤것인지 알아보기 위해 필요한 것이 hitTestHitTest터치 이벤트가 발생한 포인트에 있는 view중 view hierarchy에서 가장 멀리 있는 하위 view즉 최상단의 view를 반환여기서 말하는 최상단의 View는 view hierarchy의 최상단 객체가 아니라사용자가 보았을 때 가장 상위의 View를 말함아래 사진에서 검은색 화살표 부분을 터치했을 때를 예시로 들면 ViewB를 말함hitTest가 필요한 이유hitTest를 사용하여 터치 이벤트를 받을 view를 정할 수 있다.ViewB의 hitTest를 사용하면 위 그림과 같이 ViewB를 터치했을 때 ViewB를 터치한 것이 아니라터치 이벤트가 발생한 ..
UIResponderAn abstract interface for responding to and handling events.이벤트의 응답 및 처리를 위한 추상 인터페이스 Responder objects(UIResponder의 인스턴스들)들은 UIKit 앱 이벤트 처리를 위한 backbone을 구성UIApplication, UIViewController, 및 모든 UIView(UIWindow포함)와 같은 많은 핵심객체들이 Responder이벤트가 발생하면 UIKit이 이 이벤트를 처리할 수 있도록 앱의 Responder objects에 전달 이벤트에는 여러종류가 있음touch events, motion events, remote-control events, press events 가 포함예를 들어 t..
Libarary사용하는 주체가 기능을 요청하여 사용Framework사용하는 주체와 기능의 제어권이 역전테스트 불가능데모앱 가능독립적으로 빌드, 테스트가 가능한 세부모듈을 둘 수 없음Static Framework앱의 실행 파일 안에 복사앱 실행파일에 직접 복사되어 있으므로 런타임상 속도 빠름참조가 아닌 복사이므로 안정적dynamic에 비해 메모리 더 소모Framwork안에 이미지 파일과 같은 리소스 파일이 있어도 사용불가Dyanamic Framework런타임 상에서 Mach-O 파일과 참조관계Framework내에 이미지나 뷰같은 리소스 파일, Bundle을 Embed할 수 있음빌도속도 상승메모리 상 필요할 때 load시키므로 lazy함디버그시 필요한 dSYM파일을 프레임워크 개발자가 따로 제공해야함stat..
앱을 만들다가 view에 cornerRadius를 주었는데 적용이 되지 않다고 버튼을 클릭했을 때 적용되는 문제를 발견 // 하위뷰의 코드 override func layoutSubviews() { super.layoutSubviews() buttons.forEach { button in button.clipsToBounds = true button.layer.cornerRadius = button.bounds.height / 2 } } 디버깅을 해보니 버튼의 frame이 잡히지 않은 시점 즉 frame이 0인 시점에서 button.layer.cornerRadius = button.bounds.height / 2 을 해주어 cornerRadius가 0이되어 발생하는 문제인것을 확인. 왜 하위 뷰의 fra..
개인 프로젝트를 진행을 하다가 보니 메모리의 크기가 점점 늘어나서 앱이 죽어버리는 경우가 생겼다. 왜 메모리가 늘어나는지 메모리 그래프를 사용하여 확인해보니 ViewModel이 없어지지 않고 Cell과 순환참조를 하고 있었다. 로직에서 왜 문제인지 찾지 못해 한줄한줄 디버깅 해보니 cell에서 viewModel에 bind할 때가 문제였다. bind한 stream이 없어지지 않고 계속해서 살아있어서 cell과 viewModel이 사라지지 않고 있었던 것이다. 그래서 알게된 것은 tableViewCell이나 collectionViewCell에서 rxSwift나 combine을 사용하여 bind할 경우 주의해야 한다는 것이다. iOS에서는 효율적인 메모리관리를 위해 cell을 Reuse하는데 이때 bind해준..
NaverMap SDK SPM 왜 지원안해줌 ?프로젝트에서 mapKit대신 navermap을 사용하기로 결정하였는데 Tuist를 사용하여 프로젝트를모둘화를 하게되어 cocoapods를 사용하지 못하게 되었다그런데 naverMap SDK는 cocoapods으로만 의존성을 추가할 수 있게 되어있었다 ,,,, https://github.com/navermaps/ios-map-sdk GitHub - navermaps/ios-map-sdk: 네이버 지도 iOS SDK 데모 앱네이버 지도 iOS SDK 데모 앱. Contribute to navermaps/ios-map-sdk development by creating an account on GitHub.github.com 아무리 찾아보아도 NaverMap SD..
의존성 역전이 왜 필요한지 알아봅시다. 먼저 의존성 주입이 무엇인지를 간단히 알아본다면의존성 : 서로 다른 객체 사이에 의존관계가 존재주입 : 외부에서 객체 또는 데이터를 생성해서 넣는 것 import UIKitclass Person { var name: String init(name: String) { self.name = name }}// Person에 name "바지" 주입let 사람 = Person(name: "바지") Person(name: "바지") 이부분이 바로 의존성을 주입해주는 것입니다. 외부에서 name에 값을 주고 있으니까요. 그럼 이제 의존성주입이 무엇인지 간단히 알아봤으니 왜 의존성 역전이 필요한지 알아보겠습니다. 아래와 같은 코드가 있다고..