전체 글

 iOS developer. https://swiftycody.github.io 로 이전했습니다.
· iOS/Combine
시퀀스 연산자들은 Publisher자체가 시퀀스라고 보면됨. 시퀀스 연산자들은 개별 방출값이 아닌 Publisher 전체를 다룸. 값 찾기 min() Publisher가 Finish될 때까지 기다렸다가, 최소값만 방출시켜줌. Comparable 프로토콜을 따르는 경우 별도의 파라미터없이 최소값을 찾아줌. var subscriptions = Set() // 1. 숫자를 방출하는 Publisher let publisher = [1, -50, 246, 0].publisher // 2. min 연산자로 최소값을 찾아서 print publisher .print("publisher") .min() .sink(receiveValue: { print("최소값은 \($0)") }) .store(in: &subscript..
· iOS/Combine
반응형 프로그래밍의 핵심 아이디어는 시간에 따른 비동기 이벤트 흐름을 모델링하는 것. Combine에서는 시퀀스가 시간에 따라 값에 반응하고 변환하는 다양한 연산자들을 제공. Time shifting delay(for:tolerance:scheduler:options) (Rx의 delay) Upstream Publisher가 값을 내보낼 때마다 delay 연산자는 잠시 동안 값을 유지한 다음 사용자가 지정한 스케줄러에서 요청한 지연 시간 후에 값을 내보냄. 초마다 하나의 값을 내보내는 퍼블리셔를 만든 다음 1.5초씩 지연시키고 두 타임라인을 동시에 표시하여 비교. import Combine import SwiftUI import PlaygroundSupport var subscriptions = Set(..
· iOS/Swift
https://developer.apple.com/documentation/swift/collection/count-4l4qk Collection의 Element를 세어주는 count의 복잡도는 기본적으로 O(n) 연산. RandomAccessCollection을 준수하는 경우 O(1) 연산. Collection이 비어있는지 여부를 체크할 때는 Collection.count == 0 으로 체크하는 것보다, Collection.isEmpty 로 체크하는 것이 더 좋음. if someArray.count == 0 { // ❌ ... } if someArray.isEmpty { // ⭕️ ... }
· iOS/iOS Dev
이번에 Xcode15와 iOS17의 정식 버전이 배포가 되었는데요. 바로 Xcode를 최신버전으로 올려서 사용하면 좋지만 현업에서는 그렇게하지 못하는 케이스도 많이 있습니다. 그래서 이런 경우 이전 Xcode버전에 최신버전 iOS의 Device Support파일을 넣어서 개발을 해왔습니다. 이번 Xcode15에서는 이럴때 필요한 iOS17의 Device Support파일을 제공하고 있지 않고 있고, Github에도 올라와 있지 않습니다. 대신 Xcode15에서 iOS17 디버깅을 할 수 있도록 내부 다운로드를 진행한 후 아래 명령어를 터미널에서 실행하면 defaults write com.apple.dt.Xcode DVTEnableCoreDevice enabled 아래처럼 Xcode14에서 CoreDevi..
· iOS/Swift
Generic 모델링에서 시작합니다. 아래와 같은 Animal 프로토콜이 있을 때, 이를 사용하는 Farm struct의 메서드에서 Animal의 Concrete 타입으로 대체될 타입파라미터적합성을 따르도록 적용할 수 있습니다. protocol Animal { associatedtype Feed: AnimalFeed func eat(_ food: Feed) } struct Farm { func feed(_ animal: A) { // ... } } 혹은 아래처럼 후행 where절에서 프로토콜 적합성을 지정할 수 있습니다. where절은 디테일하게 requirement와 타입 관계를 작성할 수 있게 해줍니다. struct Farm { func feed(_ animal: A) where A: Animal {..
· iOS/Swift
프로토콜 extension 프로토콜 자체를 확장하여 프로토콜 member의 기본 구현을 제공할 수 있습니다. extension Localizable { static var supportedLanguages: [Language] { return [.english] } } 여기서는 supportedLanguages의 기본 구현으로 Localizable을 확장합니다. Localizable을 준수하는 각 타입은 이제 해당 구현에 액세스할 수 있으므로 자체 정의할 필요가 없습니다. struct Image: Localizable { // no need to add `supportedLanguages` here } 위까지는 코드의 모든 유형이 구현할 수 있는 프로토콜로 작업했습니다. 특정 class에 의해서만 준수되..
· iOS/iOS Dev
Public-Key Cryptography 이전 글에서 정리했던 HMAC, Sealed Box암호화는 Sender와 Receiver모두 키를 알고 있는 대칭키를 사용합니다. 대칭키는 대역 외(Out of band)로 전송되어야 하고, 이 작업을 안전하게 수행할 수 없는 경우 공개키 암호화(public-key cryptography)를 사용합니다. 실제로 인터넷에서 일상적으로 사용하는 대부분의 암호화는 공개키 암호화를 사용하고, Xcode가 앱에 서명을 할 때에도 동일합니다. 공개키 암호화는 수학적으로 연결된 두개의 키를 생성합니다. 개인키는 비밀로 유지하고 해당 공개키 Data를 게시합니다. 개인키로 Data 혹은 Data Digest에 서명한 다음 전송합니다. Receiver는 공개키 Data에서 공개..
· iOS/iOS Dev
Hasher와 Cryptographic Hashing Hashable 프로토콜 타입의 객체를 Hasher로 hashing하면 무작위로 생성된 시드를 사용해서 해시값을 생성하여 실행될 때마다 다른 해시값을 생성시켜줍니다. func hashItem(item: String) -> Int { var hasher = Hasher() item.hash(into: &hasher) return hasher.finalize() } // Hashing data let hashValue = hashItem(item: "Hasher로 hash한 Data") // 실행시 마다 다른 해시값 Cryptographic Hashing은 Hasher와 같이 거의 유일한 해시값을 생성하고, 입력값을 조금만 변경해도 해시값이 크게 변합니다..
· iOS/iOS Dev
SSL Pinning(이하 Pinning, 피닝)은? 호스트를 인증서 또는 공개키와 연결하는 프로세스입니다. 호스트의 인증서 또는 공개키를 알고 있으면 해당 호스트에 고정(Pinning)합니다. 즉, 미리 정의된 인증서 또는 공개키 중 하나 또는 몇 개를 제외한 모든 인증서를 거부하도록 앱을 구성합니다. 앱이 서버에 연결할 때마다 서버 인증서를 고정된 인증서 또는 공개키와 비교합니다. 둘이 일치하는 경우에만 앱이 서버를 신뢰하고 연결을 설정합니다. 일반적으로 개발 시 서비스의 인증서 또는 공개키를 추가합니다. 즉, 모바일 앱은 앱 번들 내에 디지털 인증서 또는 공개키를 포함해야 합니다. 공격자가 핀을 오염시킬 수 없기 때문에 이 방법이 선호됩니다. SSL 인증서 Pinning이 필요한 이유? 일반적으로 ..
· Dev Terms
TLS(Transport Layer Security) TLS의 주요 목표는 두 당사자 간에 교환되는 메시지에 개인 정보 보호 및 무결성을 추가하는 것. TLS를 사용하면 해당 데이터를 신뢰할 수 없는 제3자에게 노출시키지 않고 네트워크를 통해 데이터를 전송할 수 있습니다. TLS 연결의 3단계 클라이언트에서 서버로 연결 시도 클라이언트가 암호화에 사용할 수 있는 Cipher Suite와 함께 지원할 수 있는 TLS버전이 나열된 메세지를 서버로 전달 Cipher Suite: TLS를 통해 네트워크 연결을 보호하는 데 필요한 알고리즘 집합(참고: https://en.wikipedia.org/wiki/Cipher_suite) 서버에서는 선택한 Cipher Suite로 응답하고, 하나 이상의 Digital Ce..
· iOS/iOS Dev
Xcode 11.4부터 시뮬레이터로 Push Notification을 보낼 수 있습니다. 준비물: apns 파일 아래와 같이 payload 내용이 담긴 apns파일을 준비합니다. 파일이름은 payload.apns 정도로 만들면 됩니다. { "aps" : { "alert" : { "title" : "시뮬레이터로 Push Notification 보내기", "body" : "apns 파일로 간단하게" }, "badge" : 5 } } 커맨드라인 입력 그리고 터미널을 열고, 커맨드라인을 입력하는데 3가지 정보가 필요합니다. 시뮬레이터 타겟 타겟 시뮬레이터에 설치된 앱 BundleID apns 파일 경로 xcrun simctl push (시뮬레이터 타겟) (시뮬레이터에 설치된 앱 BundleID) (apns 파일..
· iOS/Swift
https://developer.apple.com/videos/play/wwdc2022/110352/ Generic 모델링에 some/any를 적용하는 방법을 설명한 WWDC22 영상입니다. Farm을 시뮬레이션 하기 위한 예시. 추상화 도구들을 사용하기 전의 Concrete 타입의 예시부터 작성. Concrete 타입으로 먼저 모델링 Cow 구조체는 Hay(건초) 타입의 매개변수를 받는 eat()이라는 메서드가 존재하고, Hay 구조체는 Alfalfa 종류의 작물을 재배하기 위한 grow()라는 static 메서드가 존재. Alfalfa 구조체는 Alfalfa인스턴스에서 Hay를 수확할 수 있는 harvest() 메서드가 존재. Farm 구조체는 Cow에게 먹이를 줄 수 있는 feed() 메서드가 있음..
SwiftyCody
 iOS.dev