IOS

    [iOS] 소켓통신 (2). echo server와의 소켓통신.

    echo server echo server는 클라이언트가 전송해주는 데이터를 그대로 되돌려 전송해 주는 서버를 말합니다. 소켓통신을 공부해보려 하는데 연결할 서버가 없어서 echo server를 이용해보기로 했습니다. 간단한 echo_server입니다. # echo_server.py import socket def start_echo_server(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('ip주소', 8085)) server_socket.listen(5) print("Echo server is listening...") while True: client_socket, addr = serv..

    [iOS] 스토리보드와 코드베이스 UI구현

    iOS 개발에서 UI를 구현하는 방식에는 크게 스토리보드를 사용하는 방식과, 코드로 구현하는 방식이 있습니다. 각 방식의 장점과 단점을 정리해봅니다. 스토리보드로 UI 구현시 장점 시각적 편의성: 스토리보드에서 UI컴포넌트를 드래그 앤 드롭으로 배치할 수 있으므로 레이아웃을 쉽게 구성할 수 있습니다. 코드량 감소: UI컴포넌트의 배치와 속성을 직접 코드로 작성하지 않아도 되므로 초기 코드량이 줄어듭니다. 화면 플로우 파악: 여러 뷰 컨트롤러와 세그웨이(segue)를 한눈에 볼 수 있어 앱의 전체적인 플로우와 네비게이션을 쉽게 파악할 수 있습니다. 인터페이스 빌더: 여러 편리한 기능들을 지원해 UI구성에 도움을 줍니다.(레이아웃 제약조건 설정, 미리보기 등) 단점 복잡성: 프로젝트가 커지면 스토리보드가 복..

    [iOS] DeepLink로 앱을 띄워보자

    DeepLink 딥링크에 대해 정리하고 간단한 예제로 이해해봅니다. 딥링크는 "하이퍼링크의 모바일판"이라고 할 수 있습니다. 예를 들어볼까요? 쿠팡 상품의 광고를 클릭하면 "쿠팡앱실행 -> 해당상품" 이동 카톡 메세지를 클릭하면 메세지 화면으로 바로이동 "카카오톡실행 -> 해당 메세지 화면" 카톡에서 카카오맵의 특정 위치를 클릭하면 "카카오맵실행 -> 해당위치화면" 이렇게 링크를 클릭해 앱을 실행하고 원하는 화면으로 이동할 수 있게 할 수 있습니다. iOS에서 딥링크를 구현하는 방법은 두 가지가 있습니다. URLScheme Universal Link 여기서 Universal Link는 특징만 보고 넘어가고. URLScheme을 집중적으로 보겠습니다. URLScheme 어플리케이션간의 통신이나 특정 앱을 ..

    [iOS] App Thinning과 Bitcode에 대하여

    App Thinning 앱이 디바이스에 설치될 때 앱스토어와 운영체제가 디바이스의 특성에 맞게 설치되도록 설치 최적화 기술입니다. iOS 9에서 도입된 기능으로 앱의 크기를 최적화 하고 사용자 기기에 저장되는 앱의 전체 크기를 줄이는데 사용됩니다. 이에 따른 전반적인 이점으론 아래와 같은데, 빠른 다운로드와 설치 앱의 크기가 작아지면 사용자는 앱을 더 빨리 다운로드 할 수 있습니다. 디바이스 공간 최적화 App THinning을 사용하면 특정 디바이스, 버전에 필요한 리소스만 다운로드 하므로, 불필요한 데이터를 저장하는 것을 방지합니다. 예를 들어, 아이폰 X 와 3rd Generation IPad는 다른 해상도를 사용하기 떄문에 각 디바이스에 적합한 리소스만을 다운로드 할 수 있게 됩니다. 앱에서 3x..

    [iOS] UITraitEnvironment

    iOS interface environment에는 다음과 같은 trait이 포함됩니다. horizontal / vertical size class (수평, 수직 사이즈 클래스) display scale (디스플레이 픽셀에 관합니다.) user Interface idiom ( Enum으로 phone, pad, tv, carplay, mac...) user Interface style( 라이트모드, 다크모드인지.. lightMode, darkMode, unspecifiedMode) 여기서 horizontal / vertical의 size class만 살짝 보고 가겠습니다. size class size class는 portrait, landscape에 따라 현재 화면의 size class가 Compact / ..

    [Tuist] Manifest not found 에러

    Resolved cache profile 'Development' from Tuist's defaults Manifest not found at path /Users/ganghyeonjun Consider creating an issue using the following link: https://github.com/tuist/tuist/issues/new/choose 해결한 방법 sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

    [Tuist] PinLayout과 FlexLayout사용시 발생하는 문제

    xcconfig파일에서 아래 설정을 추가해줍니다. OTHER_SWIFT_FLAGS[config=DEV][sdk=*] = $(inherited) -DDEV GCC_PREPROCESSOR_DEFINITIONS = DEV=1 PROD=0 GCC_PREPROCESSOR_DEFINITIONS="FLEXLAYOUT_SWIFT_PAKAGE=1" 바로 generate해서 프로젝트를 사용한다면 Target > Build Setting > PreprocessorMacro의 타겟에 FLEXLAYOUT_SWIFT_PAKAGE=1 를 추가해줘도 됩니다. FlexLayout에서 사용되는 Yogakit이나 기반이 되는 yoga는 사실상 c++로 구현이 되어있다고 합니다. Swift에서 C++를 직접 호출할 수 없기 떄문에 Yoga..

    [iOS] SetNeedLayout과 SetNeedDisplay는 무엇인가

    우선 main run loop를 알아야 합니다. main run loop 기기에서 앱을 실행하면 @main을 찾아 UIApplecation객체와 AppDelegate객체를 생성합니다. 그리고 앱을 계속 실행하고 응답하도록 하는 loop(main run loop)를 실행합니다 발생한 모든 이벤트는 eventqueue에 추가되며, 이 loop는 발생하는 다양한 이벤트들을 처리하게 됩니다. (터치이벤트, 디바이스 회전등) 발생한 이벤트는 각 이벤트의 알맞는 핸들러를 찾아 그들에게 이벤트에 대한 처리권한을 위임하게됩니다. 이런 이벤트를 모두 처리하고 권한이 다시 main run loop로 돌아오는 시점을 "update cycle"이라고 한다. Update Cycle main run loop에서 이벤트가 처리되는..

    [iOS] 실제 디바이스가 없을 경우 개발 환경에서 할 수 있는 것과 없는 것

    잘못된 정보가 많아서 정리해본다. 사용할 수 없는 하드웨어 가속도, 자이로스코프 센서 근접센서 기압센서 조도센서 카메라 사용할 수 없는 API UIBackgroundModes key(백그라운드모드) 핸드오프 기능(맥에서 하던 작업을 아이패드에서 계속하던가하는) 줌인/줌아웃이 불가능 하다고 하는 정보가 많은데 Option키를 누르면 x, y가 반전된 포인터가 추가되어 투포인터로 제어가 가능하다. 푸시알림도 지원하지 않는다는 경우가 많은데 푸시알림또한 지원한다.

    [iOS] Notification

    Notification 서로 다른 객체간 데이터 전달이 가능하게 해줍니다. Notification Center라는 싱글턴 객체를 통해 Event발생을 옵저버를 등록한 객체들에게 Notification을 post하는 방식으로 사용됩니다. 예시를 봅시다. 이 VC는 화면 전달을 받을 ViewControler 입니다. // 데이터 전달을 받을 ViewController class RootViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // view가 로드되자 마자 ViewController를 생성해 화면 전환을 한다. guard let viewController = storyboard?.instantiate..