⭐️ 개발/iOS & Swift

⭐️ 개발/iOS & Swift

    [iOS] 20221012 TIL

    [iOS] 20221012 TIL

    오늘 TIL의 핵심은 결국 iOS에서는 APNs가 주체적으로 푸시를 담당하고 있다는 것. 우리가 파이어베이스를 쓰는 이유는 자체 서버를 사용해도 되는데 서버가 각 기기 별(애플/안드 등) 분기처리가 복잡함 파베가 알아서 분기처리를 해주기 때문에 보통 파베랑 같이 처리해주는 곳이 많음 출프에서는 어떤 유저가 어떤 토큰을 쓰는지 현재 모르는 상황이라 전체 메시지를 보낼 수만 있는 상황이다. 그럼에도 불구하고, 전체 유저에게 보내기에는 아쉬운데 약간의 구분을 하고 싶을 수 있을 때, 예를 들어, 투두를 100% 달성하는 유저한테 "할 일 왜 다 안하셨어요?"라고 보내면 안되잖아? 의미없는 푸시가 되버리는!! 그렇기 때문에 파베에서 약간의 대응을 할 수 있게끔 주제 단위로 보낼 수 있는 기능을 제공한다. 토픽 ..

    [iOS] Method Swizzling이 뭔가? (feat. 인스턴스/타입 메소드)

    [iOS] Method Swizzling이 뭔가? (feat. 인스턴스/타입 메소드)

    Method Swizzling(메소드 재구성)이 뭘까? 기존 메소드의 기능을 런타임 때 원하는 메소드로 바꾸는 것 파베에서도 Method Swizzling으로 앱이 실행될 때 애플의 메소드를 살짝 탈취해서 APNs의 토큰과 파베의 토큰으로 매칭시켜서 구현하는 바이브로 처리한다고 한다. 또는 컨퍼런스에 들은 바로는 회사에서 사용되는 뷰컨과 스보가 너무 많아 지금 보고 있는 화면의 뷰컨의 이름을 알고 싶을 때 이 Method Swizzling을 통해서 뷰딛로드와 커스텀 메소드의 기능을 바꿔서 뷰컨의 이름을 찍는 방식으로 해결해줬다고 들었다. 구글링해보니까 메모리 누수를 체크하려고 뷰컨이 deinit 될 때 로그가 찍히도록 Method Swizzling을 사용해서 구현한 분도 계시네.. 만약 이 기법을 안사용..

    [iOS] Remote Notification

    [iOS] Remote Notification

    Remote Notification 1. APNs(애플 서버)한테 사용자(해당 기기)에게 identifier 같은 식별자를 제공해달라고 요청함 2. APNs 서버에 해당 기기를 등록해달라고 함 3. APNs 서버에서 푸쉬 받을 수 있게 식별자를 줌 (해당 식별자를 토큰이라고 함 - 쉽게 말해 기기 별로 민증번호를 발급함) 4. 발급 받은 민증번호(토큰)를 토대로 카톡 서버에 전달함 5. 그러면 Jack이 카톡 서버에 사용하는 id가 있겟지? 카톡 서버에서도 Jack이라는 유저에 해당하는 id와 매칭되는 민증번호가 있을 것임 만약 Jack이 Hue라는 유저에게 톡을 보내서 푸쉬를 보내고자 하면 6. 카톡 서버가 Hue라는 민증번호를 가진 사람한테 푸쉬를 보내라고 애플 서버한테 요청을 할 것임 좀 더 쉽게 ..

    [iOS] 다국어 지원 i18n, l10n

    [iOS] 다국어 지원 i18n, l10n

    i18n 국제화 / l10n 현지화 국제화는 문화에 가깝고(시간대, 화폐 단위, right to left 등의 차이), 현지화/지역화는 언어에 가까움 방법 : plist, string file, 스토리보드 등으로 대응이 가능한데, 보통 string으로 대응하는 방식이 자주 쓰임 1. 스보기반 프로젝트 - info - localization Base : 보통 영어로 대응 스토리보드에 있는 정적인 라벨 등의 내용도 바꾼다. 어떤 언어를 기본으로 보여줄 건지 결정할 수 있다. 예를 들어, 이탈리아에서 영어를 기본으로 등.. 추가하면 스보에 여러개의 파일이 생긴다. ObjectId를 기반으로 대응해줄 수 있다. 단점은, 스보에서 버튼을 하나 더 추가하면 ObjectId가 생성이 되지만, 기존 등록된 객체들만 다..

    [iOS] 안간단한 MVVM 안간단하게 톺아보기

    [iOS] 안간단한 MVVM 안간단하게 톺아보기

    어려운 MVVM MVC MVC단점 MVVM 코드에 적용하기 MVC 패턴 🔆 model : data schema, server data model, 일반 데이터 모델 - 화면과 상관없는 데이터를 다루는 영역 🔆 view : label, button 등 🔆 controller: model이 가지고 있는 정보를 controller에서 다룸, 인스턴스 변수를 만들어서 데이터 활용 1. controller는 model한테 데이터를 달라고 말할 수 있음 = controller는 model에 항상 접근할 수 있다. - controller에서 인스턴스를 통해서 model에 접근하는 과정을 볼 수 있움 2. view는 자기가 어떤 컨트롤러에 속해있는지 모른다. - 어디에 속해있는지 알려주기 위해 outlet과 인스턴스를..

    [iOS] URLSession(1)

    [iOS] URLSession(1)

    URLSession 요청을 하는 하나하나가 Task라고 해서 URLSessionTask CompletionHandler를 통해서 클로저 구문에서 네트워크 통신이 일어나게 됨 [1] URLSession 일반적으로는 shared를 가장 많이 쓰는데 default 값이라 응답은 클로저로 받고, 커스텀이 불가능해서 백그라운드 다운로드가 불가하다. 만약 커스텀을 하고 싶다면, 초기화 구문의 configuration을 통해서 가능하다. 1). 기본값은 default인데 URLSession.shared과 설정이 유사하지만 - 커스텀이 가능하고(셀룰러 연결 여부를 캐치해서 사용자한테 "너 LTE 쓸 건데 괜찮아?"라고 물어볼 수 있음, - timeout 간격(ex. 서버에게 요청하고 5초가 지났는데 응답이 오지 않으면..

    [Swift] Codable

    [Swift] Codable

    SWIFT4가 나오면서 Codable 프로토콜이 새로 나옴 swiftyJSON은 가볍게 사용하기는 좋지만 많은 데이터를 처리하기에는 시간이 오래 걸린다. JSONSerialization이 가장 빠르게 처리되기는 하지만 코드가 복잡해서 JSONDecoder를 많이 선택한다. 우리가 오픈소스로 데이터를 처리했다면 이제는 JSONDecoder 라는 스위프트에서 제공해주는 클래스로 처리를 해보자! 🔆 Typealias를 통해서 Encoding, Decoding을 합친 것이 Codable Encoding : [struct -> JSON] struct/class를 서버에게 보내기 위해 외부 데이터로 변경 Decoding : [JSON -> struct] 서버에서 받은 외부 데이터를 우리가 사용할 수 있게 struc..

    [Swift] Error Handling

    [Swift] Error Handling

    스위프트 에러, 핸들링, 안일어나면 좋겠지만, 난 에러를 오늘도 만났골랑, 잣같다. https://jusung.gitbook.io/the-swift-language-guide/language-guide/17-error-handling 에러 처리(Error Handling) - The Swift Language Guide (한국어) 프로그램 실행시 에러가 발생하면 그 상황에 대해 적절한 처리가 필요합니다. 이 과정을 에러 처리라고 부릅니다. Swift에서는 런타임에 에러가 발생한 경우 그것의 처리를 위해 에러의 발생(throw jusung.gitbook.io Swift에서는 Error 프로토콜을 채택하는 방식으로 표현을 한다. 정확한 타입은 따로 존재하지 않는다. 근데 이 Error 프로토콜 내에는 아무 ..

    [Swift] WMO - Swift 성능 최적화

    [Swift] WMO - Swift 성능 최적화

    https://github.com/apple/swift/blob/main/docs/OptimizationTips.rst#protocols GitHub - apple/swift: The Swift Programming Language The Swift Programming Language. Contribute to apple/swift development by creating an account on GitHub. github.com 고성능 Swift 코드는 Swift 프로그램의 품질을 개선하고 코드를 오류가 덜 발생하고 읽기 쉽게 만드는 데 도움을 준다고 한다. 한마디로 컴파일 시에 성능을 향상시키기 위해 코드 작성 시에 개발자가 해줄 수 있는 부분에 대해 애플이 문서로 작성해 알려주고 있는 거다. S..

    [Swift] Realm 진짜.그냥.간단.정리

    Realm 진짜.그냥.간단.정리 realm 파일에 접근하기 let localRealm = try! Realm() 데이터 저장하기 let task = UserDiary(~) try! = localRealm.write { localReam.add(task) } 데이터 가져오기 realm에서 읽어온 데이터를 담을 배열을 선언하는데 그 이유는 realm의 데이터 중 원하는 내용을 가져와서 보관할 공간으로 사용할 것이기 때문이다, 동시에 realm의 테이블을 직접 수정하지 않고, 데이터만 가져와서 화면에 사용하기 위함이다. var tasks: Results! 데이터 정렬하기 이렇게 가져온 데이터의 순서는 마구잡이라, 특정 컬럼을 기준으로 정렬을 해주면 좋을 것이다. tasks = localRealm.objects..

    [iOS] Realm 기본 설계 + Realm에 저장하고 가져오기

    [iOS] Realm 기본 설계 + Realm에 저장하고 가져오기

    Database https://www.mongodb.com/docs/realm/sdk/swift/quick-start/ 데이터베이스 : 데이터를 저장한 파일들의 집합체 - DBMS : DataBase Management System : 데이터베이스를 관리하기 위한 소프트웨어, 엑셀도 마찬가지임 - RDBMS : 관계형 데이터 베이스 : relational Database management system 데이터를 표 안에 정리하는 것, 테이블 구조 RDBMS 테이블과 테이블 간 외래키를 통해 정보 구현 중복 데이터 저장 방지 데이터베이스 내의 테이블을 Schema 각각의 데이터 모델을 스키마 name, title, date를 이름지어서 정리하는데 이걸 Column = Attribute 저장되어 있는 하나의..

    [iOS] loadView()

    [iOS] loadView()

    loadView() 뷰디드로드 보다 전에 호출이 되는 친구 기본값이 nil이다. 따라서, loadView를 사용 시에 super 메서드를 사용하면 기본값이 nil이기 때문에 사용하면 안된다. - 스보 상에서는 내부적으로 자동으로 loadView를 호출하고 스보의 루트뷰를 가져와서 넣는 것으로 동작한다. - 코드로 작성 시에는 뷰컨에서 loadView()를 호출해서 rootView를 등록해줌으로써 채워준다. (새로운 rootView를 껴넣고 싶을 시에!!!) 근데 새로운 rootView를 채워주고 싶을 수도 있다. viewDidLoad는 rootView까지 메모리에 올라가고 난 후의 상황이다. (이미 rootView가 만들어진 상태) 근데 우리가 만든 BaseView는 아래 사진처럼 이 정도까지 만들어둔 ..

    [Swift] Generic

    [Swift] Generic

    Generic - 타입에 유연하게 대응하기 위한 요소이다. - Type Parameter: 플레이스 홀더 같은 역할, 어떤 타입인지 타입의 종류는 알려주지 않음, 특정한 타입 하나라는 건 알 수 있음 - 한 가지 종류가 들어가는데 어떤 타입이 들어갈 지는 모른다. - 제네릭으로 이루어진 함수 사용 시 T에 들어갈 타입은 모두 같아야 한다. - UpperCased ex. - Type Constraints : 클래스/프로토콜 제약을 걸어줘야 한다. struct DummyData { var name: T } let data = DummyData(name: "abc") let intData = DummyData(name: 3) let boolData = DummyData(name: true) 관련 오류 Gene..

    [iOS] UIView의 초기화 구문 다시 알자!

    [iOS] UIView의 초기화 구문 다시 알자!

    매번 UIView를 상속해서 커스텀 뷰를 만들면 해당 에러코드가 떴던 기억이 있을 것이다. 난 저 초기화 구문을 사용하지 않는 것인데도, 매번 떠서 빡친 기억... 잇을 것임. 분명... 이것이 왜 떳는지! 코드를 통해서 알아보자면, example이라는 프로토콜 내에 초기화구문이 있고, Mobile 클래스가 해당 프로토콜을 채택하고 있다. 그 경우에 에러 메시지가 말하길! required를 작성해주라고 말하고 있다. 즉, required라는 키워드는 프로토콜에 있는 초기화 구문이기 때문에 붙는 것이다. 그래서 아까 그 매번 뜨던 에러메시지는.... 프로토콜 초기화 구문이기에 호출되는 것이다. 왜냐하면 프로토콜 내 프로퍼티나 메소드는 optional이 아니면 항상 불리기 때문이다. 아 ~ 초기화 구문이 프..

    [iOS] CodeBase로 가보자고

    [iOS] CodeBase로 가보자고

    Frame Base Layout : 예전에는 아이폰 사이즈가 다채롭지 않았거든... frame은 버전에 따라서 자동으로 생각하지 않고 잡아준 것임. 그래서 절대적인 수치의 경우는 safearea는 무시하고 잡아주는 것이고, 한계를 느끼게 된다. 그리고 한쪽으로 쏠리기 때문에 어떤 디바이스에서는 정중앙이지 않을 수 있다. Frame + AutoResizing -> AutoLayout - NSLayoutConstraints -> NSLayoutAnchor 까지 쭉 발전되어 진행되었다. 그리고 아이폰X가 등장하면서 top, bottom의 영역이 디바이스마다 다르게 되면서 safeAreaLayoutGuide가 나오게 되었다. 노치영역을 위해 분기처리를 해줄 수는 없잖아.. 번거로우니까! 수치가 또 달라질 수 있..