2020년 4월 16일 목요일

Objective C로 만들어진 프로젝트에서 swift 사용하기

기존에 Objective C로 구현되어 있는 App 에 신규 기능을 추가 해야 하는데 swift로 하고 싶으면?


1. Xcode Project -> Target -> Build Settings -> Defines Modules 'Yes'
   Xcode Project -> Target -> Build Settings -> Swift Language Version 5







2. Swift Code 추가

3. Objective C 에서 swift 함수를 사용할 경우 @objc func , 프로퍼티를 참조 할 경우 @objc var

4. Swift에서 기존 Objective C 모듈에 연동이 필요한 경우
   프로젝트이름-Bridging-Header.h 에 #import 추가

이 과정을 거치고 나면 objective c / swift를 함께 이용할 수 있다.
ojbective c 에서 swift 로 만든 ViewController를 이용하고 swift로 만든 ViewController에서 기존 objective c 모듈에 기능을 이용 할 수 있다.




2019년 10월 3일 목요일

Xcode 11 storyboard 앱에서 swiftUI 함께 쓰기

iOS 개발에 많은 변화 들이 있었다.

xib에서 storyboard
Objective C에서 swift
그리고 swift 버젼업들

storyboard에 auto resize 에서 auto layout

그리고 또 swift 버젼업

계속해서 바뀌고 바뀌고 나름대로 즐겁게 따라 갔다.

그런데 swiftUI 이번에 한번더 완전 새로와 지는듯 하다.

Xcode 11이 릴리즈 되어 맛볼수 있으나
macOS를 카탈리나로 업그레이 하지 않아 미리보기 창이 되지 않는다.

Xcode 11로 새프로젝트를 만들면 디폴트가 swiftUI다

언젠가는 늘 그렇듯이 대세가 될것이다.

하지만 지금은 마음의 준비가 되지 않았고 익숙한 스토리보드를 좀더 쓸듯 하다.

그래서 스토리보드 기반 프로젝트에 간단한 UI만 swiftUI를 쓰고 싶은 생각이 들어
이래저래 리서치를 하고 아래와 같은 방법으로 간단하게 이용할 수 있음을 알게 되었다.



1. 프로젝트 시작은 storyboard

2. 디폴트로 생성된 ViewController에 ContainerView를 추가

3. ContainerView와 연결된 ViewController를 삭제

4. 스토리보드에 HostingViewController를 추가

5. ContainerView와 HostingViewController를 Embed Segue로 연결






6. New 메뉴로 swiftUI 를 하나 추가
기본적으로 hello world 코드가 되어 있는 SwiftUI 파일 그대로 이용한다.

7. 스토리보드에 EmbedSegue를 ViewController 코드로 연결 한다.


@IBSegueAction func addSwiftUIView(_ coder: NSCoder) -> UIViewController? {
        return UIHostingController(coder: coder, rootView: SwiftUIView())

    }

자이제 run을 해보면 시작 ViewController에 ContainerView가 SwiftUI로 동작 한다.

요방법으로 당분간 짬뽕해서 쓰다가
swiftUI가 되세가 되면 익숙해 지겠지...

실행화면과 프로젝트 구성된 파일들은 다음과 같다.

2019년 5월 4일 토요일

Xcode Server 를 이용한 CI (Continuous Integration)

Xcode Sever 를 이용한 CI (Continuous Integration)


Xcode로 개발 하면서 bitbucket에 있는 repository에 프로젝트를 자동으로 내려 받아 빌드 하고 테스트 하는 CI를 설정 하고 사용 하는 방법을 기록으로 남겨 본다.

Xcode 서버 활성


Xcode 서버를 활성 시키려면
Xcode -> Preference -> Server & Bots















스위치를 켜기만 하면 끝이다.

이제 Account로 가서 Xcode Server를 추가 한다.




Bot 설정


이제 비트 버킷으로 관리 되는 프로젝트를 클론 하여 Xcode로  열어 본다.

cocoapod 을 이용하여 xcworkspace로 열려진 프로젝트의 경우
.xcworkspace는 git으로 관리 하지 않는 상황에서 Xcode Server가 스스로 pod install 및 .xcworkspace를 로드 하여 프로젝트를 빌드 하고 테스트 하는 방법을 기술 한다.

bitbucket으로 클론 하면 xcworkspace가 존재 하지 않는다.
.xcworkspace는 git으로 add 하지 않고 관리 하지 않기 때문이다.

# pod install을 수행한다.
# open projectname.xcworkspace 로 워크스페이스를 연다.

워크스페이스로 열고 Xcode bot을 설정 하는 이유는 단지 bitbucket 의 url을 자동으로 열기 위함이었다.

상관 없다.

Product->Create Bot 으로 봇을 생성 한다.













워크스페이스를 연 이유는 자동으로 bitbucket  설정 을 위해서 였다.







CI 스케줄을 정한다. 매시간 이 디폴트이다.




테스트를 하는 시뮬레이터 및 디바이스를 선택 하는 단계 모든 디바이스와 모든 시뮬레이터를 설정 할 경우 Xcode Server가 빌드하고 테스트 하는동안 수많은 시뮬레이터 와 CPU 점유을 맥머신에 이륙 소리를 만날 것이다. 특정된 모델만 선택 하는 것을 강추 한다.







인증 서 단계등을 완료 하고 나면 봇이 생성 된다.

봇이 완료되면 바로 integration을 수행하는데 100% 실패 한다.

이유는 cocoa pod 프로젝트 그리고 .xcworkspace를 bitbucket에 pull 하지 않았기 때문에 빌드 과정에서 에러가 발생 한다.  projectname.xcworkspace 파일이 없기 때문에 실패 하는 것이다.




상단에 Edit bot을 클릭 한다.
맨 오른쪽 Trigger를 선택 한다.
하단 + 버튼을 클릭 하여

pre-integration script를 생성 한다.

#!/bin/sh
cd "${XCS_PRIMARY_REPO_DIR}/projectname"
pwd
/usr/local/bin/pod install

위와 같은 스크립트를 생성한다.

Xcode Server bot 이 프로젝트를 클론 해온다음
스크립트가 pod install을 수행하여 모든 pod 라이브러리를 내려 받아 놓고
생성된 .xcworkspace를 로드하여 빌드 및 테스트를 진행 한다.

unit test, ui test를 프로젝트에 등록 해두었으면 자동으로 빌드 및 테스트 까지 수행 하여 Xcode bot이 리포팅 해준다.

2019년 2월 9일 토요일

macOS 에서 eclipse jee 와 CDT 동시에 설치 및 아이콘 변경 하기

요즘 회사에서 web 이나 서버 API 를 간간히 배우면 개발을 해야하기 때문에 spring을 이용하기 위해 vscode 부터 eclipse 까지 이것 저것 만저 보았다.

스프링 개발을 위해 eclipse jee를 설치 하고 잘 사용 하고 있는 상황 그런데 raspberry pi에 C 로 개발해야 할 일이 생겨서 eclipse CDT도 설치 해봐야 하는 상황이 발생 했다.


기존 설치되어 있는 eclipse jee에  CDT 플러그인을 install software 메뉴로 추가로 설치를 하면 하나의 이클립스가 java / c++ 모두 되는 IDE가 되는 것으로 보인다.

하지만 자바 프로젝트 워크 스페이스가 열리면서 무언가 화면은 C++ IDE 였다가, java IDE 였다가 하는 것이 맘에 안든다.

해서 eclipse jee 가 설치된 mac 머신에 새로 eclipse cdt를 설치 하기로 했다.

eclipse/cpp-2018-12 ,  jee-2018-12 로 나뉘어 설치 되게 된다.

하지만 아이콘이 같은 모양이라서 어떤게 java IDE인지 어떤게 c++ IDE인지 구분이 가지 않는다.



https://github.com/eclipse-cdt/cdt/blob/master/debug/org.eclipse.cdt.debug.application/icons/cc.icns
여기에서 C++ eclipse icns를 다운 받는다.

cc.icns 를 Eclipse.icns로 이름을 변경 하고

eclipse CDT 설치 경로에서 패키지 보기로 하여  Resource 디렉토리에 있는
Eclipse.icns에 복사하여 아이콘을 바꾼다.

어떤이유에서인지는 모르지만 실행전에는 dock에 아이콘이 변경 되지 않지만 실행중에는
변경되어 어떤것이 java인지 C++인지 구분이 된다.

이정도면 만족 한다.







2019년 1월 15일 화요일

visual studio code 로 spring maven project를 할때 너무 package does not exist로 밑줄이 많을떄

https://github.com/redhat-developer/vscode-java/issues/161

java linter 플러그인을 제거 해야 한다.

springframework.beans.factory.anotation 등등
멀쩡한 코드들이 빨간줄이 가는 문제가 있었다.

https://github.com/redhat-developer/vscode-java/issues/161의 답변중에 하나인
java linter 플러그인이 문제 인 듯 하다.

2019년 1월 12일 토요일

visual studio code로 java spring maven project 하기

java spring 은 eclipse로 작업하는게 일반적이다.

spring을 시작하는 입장에서 eclipse의 불편함이 개발에 어려움에 한 몫 하고 있다.

현업에서 가장 많이 사용 하는게 eclipse이니 사실 장점이 더 많을 수 있지만
eclipse는 느리고 macOS에서 다크 테마도 부자연 스럽고 맘에 들지 않는다.

하여 code 편집기로 자주 사용하는 vscode를 spring 개발에 이용하려 함이다.

이미 eclipse로 만들어진 spring maven 프로젝트 폴더를 vscode로 열어서 빌드및 tomcat debug가 가능 하도록 하는것이 목표이다.

MacOS 기준에서 테스트 하였다.


1. tomcat 설치 mac os
eclipse 개발 환경으로도 tomcat 설치는 필요하다.


http://igeniusdo.tistory.com/12
톰캣 버젼을 다운로드 받아서 /usr/local 폴더에  복사한다.
/Library/Tomcat 으로 심볼릭 링크를 걸어준다.

2. maven 설치
아파치 maven을 다운 받아서 /usr/local 에 복사한다.
https://maven.apache.org/install.html

cat .bash_profile 
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home

export PATH=/usr/local/apache-maven-3.6.0/bin:$PATH

위와 같이 JAVA홈과 maven PATH를 설정 한다.


3.vscode에 java 관련 플러그인 설치
https://code.visualstudio.com/docs/languages/java

여기에 언급한 플러그인을 몽땅 설치 한다.

이상태에서 eclipse spring maven project 폴더를 폴더 열기를 하면 다음과 비슷한 화면으로 로딩 된다

.


4.톰캣 서버 추가

TOMCAT SEVERS에서 +를 누른다음 /Library/Tomcat 폴더를 선택하여 tomcat 을 추가한다.
tomcat의 마우스 오른쪽 버튼을 눌러 Open Server Configuration을 선택 하여 server.xml을 편집 할 수 있다.  port 설정등을 할 수 있다.

5. 프로젝트 maven 빌드
MAVEN PROJECTS 에서 마우스 오른쪽 버튼으로 package를 선택 한다.

정상적으로 빌드가 끝나면 target 디렉토리에 .war 파일이 생성 된다.

6. tomcat 디버깅


디버깅도 잘 된다.




2018년 12월 14일 금요일

XCTest 에서 비동기 통신 class를 테스트를 하려면?

https://developer.apple.com/documentation/xctest/asynchronous_tests_and_expectations/testing_asynchronous_operations_with_expectations


위 링크를 보면 좋은 예제가 있다.


만일 네트워크 RESTFul API를 요청 하는 함수들 과
응답에 결과를 delegate로 호출 해주는 방법으로 만든 클래스가 있다면

이 class의 unit 테스트를 만들려면 testcase 함수 에서는 응답이 오기전에 XCAssertEqual()등의 메서드를 호출 할 수 없다. 네트워크 응답을 delegate로 받고 테스트가 진행 되어야 한다.


XCTest case 함수에서
XCTestExpectation 변수를 전역 변수로 만들고

테스트 케이스 함수에서 네트워크 요청 후
wait(for: [expectation], timeout: 10.0)
위와 같은 코드로 대기를 하게 한다.

XCAssertEqual() 메서드든 wait 코드 아래에 위치 하게 한다.

네트워크 클래스의 delegate 응답 결과를 처리 하는 protocol 메서드에서
expectation.fulfill() 을 호출 하여 대기를 풀어 준다.

그럼 wait이 풀리고 XCAssertEqual에서 테스트 판단이 이루어진다.

말로 설명한 TestCase 코드는 다음과 같다.

let expectation = XCTestExpectation(description: "Network API TEST")
    func testLogin() {
        // 1. given

        // 2. when
        network.login = Network.Login(aId: "choijh", aPassword: "1234567a")
        network.request(API: Network.API.Login, delegate: self)

        wait(for: [expectation], timeout: 10.0)

        // 3. then
        XCTAssertEqual( self.success, true, "Login success")
    }
    
    func testLoginFail() {
        // 1. given
        
        // 2. when
        network.login = Network.Login(aId: "choijh", aPassword: "a")
        network.request(API: Network.API.Login, delegate: self)
        
        wait(for: [expectation], timeout: 10.0)
        
        // 3. then
        XCTAssertEqual( self.success, false, "Login fail wrong password")

    }
    
    func onReceiveSuccessFail(_ success: Bool, api: Network.API) {
        self.success = success
        expectation.fulfill()

    }