아두이노와 함께 하기 위한 간단한 Swift 지식들


이 글은 전문적으로 Swift를 학습하기 위한 것이 아니라 아두이노 개발과 관련하여 아이폰쪽 소스를
조금 더 잘 이해하고자 하는 목적입니다.


관련 소스 : https://github.com/mazdah/BluetoothController


1. 변수와 상수


let : 상수를 만들 때 사용하며 최초 한번 값을 할당하면 이후 값을 변경할 수 없음
var : 변수를 만들 때 사용


타입 지정은 필수가 아님
할당된 값은 암시적인 타입변환을 할 수 없음. 초기 값과 다른 타입으로 사용하기를 원한다면 
반드시 명시적으로 형 변환을 해주어야 함


문자열 안에 변수를(변수의 값을) 표현하고자 하면 다음과 같이 표현한다.
“문자열 안에 값을 쓰려면 \(변수명) 이렇게 쓴다”


배열과 딕셔너리는 []를 이용하여 만든다.


var sampleArray = [“a”, “b”, “c”, “d”, “e”]
var sampleDictionary = [
    “first”:”a”, 
    “second”:”b”, 
    “third”:”c”, 
    “fourth”:”d”, 
    “fifth”:”e”
]


빈 배열과 딕셔너리는 initializer를 사용한다.


let blankArray = String[]()
let blankDictionary = Dictionary<String, Float>()


타입을 명시적으로 사용할 수 없을 경우 다음과 같이 표기할 수 있다.


let blankArray =[]
let blankDictionary = [:]


2. 조건문


if의 조건문은 ()로 감싸지 않아도 된다. 하지만 코드를 감싸는 중괄호({})는 필수다.


if value == 1 {
    print("value = 1")
}


3. Optional


어떠한 변수나 상수에 값이 존재하는지 여부를 표현함
표현 방식은 다음과 같다.


var optionalInt: Int? = 100
var optionalString: String? = “this is optional String”
// 값을 초기화 하지 않으면 자동적으로 nil로 초기화 됨
var nilIn: Int?
var nilString: String?


어떤 optional이 값을 가지고 있으면 true, 값을 가지고 있지 않으면 false이다.


var optionalInt: Int? = 100

// 아래의 경우는 true가 출력된다.
if optionalInt {
	print("true")
} else {
	print("false")
}

var nilInt: Int?

 // 아래의 경우는 false가 출력된다.
 if nilInt {
	print("true")
 } else {
	print("false")
 }

nil은 optional이 아닌 상수나 변수와 사용할 수 없다.

Objective-c에서의 nil은 존재하지 않는 Object에 대한 포인터였다면 Swift에서의 nil은 포인터가 아닌 명확하게 값이 없다는 것에 대한 표현일 뿐이다. 때문에 어떤 타입에 대해서도 nil을 지정할 수 있다.


Optional binding


if문에서 다음과 같이 optional binding을 사용할 수 있다.


var optionalString = "123"

if let constantValue = optionalString.toInt() {
    println("\(optionalString) has an integer value of \(constantValue)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
} 


이 if문의 의미는 optionalString.toInt()가 리턴한 옵셔널 int가 값을 가지고 있을 경우 그 값을
constantValue에 할당하고 이후 constantValue는 ! 기호를 붙이지 않고 사용 가능하다.
optional binding은 변수와 상수에 모두 사용 가능하다.


Implicitly Unwrapped Optionals


만일 프로그램상에서 구조적으로 값이 있다는 것이 명확한 optional의 경우 ?가 아닌 !를 붙여
Implicitly Unwrapped Optional을 만들 수 있다.


//Optional
let possibleString: String? = "An optional string." 
// Implicitly Unwrapped Optional
let assumedString: String! = "An implicitly unwrapped optional string."


Implicitly Unwrapped Optional은 사용 시에도 Optional이 아닌 것처럼 사용할 수 있다.


//Optional의 사용
println(possibleString!)
// Implicitly Unwrapped Optional의 사용
println(assumedString)


Implicitly Unwrapped Optional도 Optional과 동일하게 if문을 통해 값을 가졌는지 체크하거나
optional binding 사용이 가능하다.


if assumedString {
    println(assumedString)
}

if let tempString = assumedString {
    print(tempString)
}


Optional 요약

  • 값이 없는 경우를 만들기 위해서는(nil을 할당하기 위해서는) Optional로 선언해야 한다.
  • Optional로 선언하게 되면 값이 Wrapping된다.
  • Optional 값을 사용하기 위해서는 Unwrapping 해야하는데 그 방법은 Optional 뒤에 !를 붙이는 것이다.
  • if문을 통해 optional binding을 이용하면 !를 붙이지 않고 다른 변수/상수에 값을 할당하여 그 변수/상수를 이용할 수 있다.
  • 최초 할당 이후 nil 값이 아닌 것이 확실한 경우 선언할 때부터 !를 붙이는 Implicitly Unwrapped Optional를 사용하며 이후 Optional이 아닌 것처럼 사용 가능하다.


블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

기존에 개인 업무용 iMac에 jenkins와 SVN 서버를 구축하고 사용을 하고 있었다.

그런데 개발용으로 사용하는 iMac에 서버를 구축해놓으니 리소스가 너무 후달려 아무래도

제대로 사용하기가 어려웠다.


마침 이번에 철수하는 인력이 사용하던 iMac을 그대로 사용할 수 있게 되어 서버로 사용하기로 했다.

그래서 개발용 iMac에 있던 각종 서버들을 서버용 iMac으로 옮기기로 했다.

(사실 iOS만 개발할 것 같으면 OSX Server를 사용했을텐데 안드로이드도 함께 개발하다보니

 역시 jenkins가 가장 나은 선택인 것같다.)


안드로이드 설정이야 별 어려움 없이 진행했다. 추가로 N’SIQ Collector 플러그인까지 설치하고,

(추후 PMD까지 설치 예정)


문제는 iOS였다...

개발 PC에 구축만 해놓고 한동안 사용을 안했는데 그 사이에 관리해야 할 앱이 하나 추가된 것이다.

문제가 되는 상황은 기존 앱은 하이브리드 앱으로 외부 라이브러리 문제로 Xcode 5.1.1에 SDK를

6.0밖에 사용 못한다는 것이다. 그리고 후에 추가된 앱은 네이티브로 개발된 앱으로 최신 버전의

SDK를 사용 가능하다.


결국 각각 빌드 시 해당 프로젝트에 맞는 SDK를 이용해서 빌드해야 하는데 이 방법을 몰랐던 것이다.


우선 Xcode를 2개 이상 설치한 상황에서 디폴트 Xcode를 선택하는 명령어가 다음과 같다는 것은 알았다.


sudo xcode-select -s /Applications/Xcode.app

sudo xcode-select -s /Users/khiin/Applications/Xcode5.1.1.app 


jenkins 위키 페이지에도 이 내용은 언급되어있다.


https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin


이 곳에 보면 Xcode를 멀티로 설치하는 방법과 디폴트로 사용할 Xcode를 선택하는 방법

그리고 런타임 시 Xcode 버전을 선택하는 방법이라는 내용이 있다.


처음에는 런타임 시 Xcode 버전을 선택하는 방법만 사용하면 될 줄 알았다.

천만의 말씀 만만의 콩떡이었다...ㅠ.ㅠ


결과적으로는 위의 2가지 내용을 조합하는 것이 방법이었다.


잡설이 길어졌으니 이만 줄이고 본론으로 가자


jenkins에서 2개 이상의 Xcode 버전을 런타임시 선택적으로 사용하여 빌드하는 방법


*** 기본적으로 jenkins에서 Xcode 빌드 설정은 완료된 것으로 생각하고 설명한다. 기본적인 jenkins에서의 Xcode 플러그인 설정

방법이 필요하신 분은 아래 주소로...


http://mazdah.tistory.com/519


1. 당연히 2개 이상의 서로 다른 버전의 Xcode가 설치된 것을 전제로 한다.


2. jenkins에서 빌드 전에 환경을 설정해주기 위해 Environment Injector Plugin라는 플러그인을 설치해준다. 



3. 각각의 iOS 프로젝트로 이동하여 구성(설정 또는 config) 화면으로 이동한다.


4. 이름과 설명 밑에 나오는 가장 위에있는 선택 옵션을 보면  Prepare an environment for the run이라는 옵션이 추가되어있다. 체크하자


5. 디폴트 상태에서 Script Content에 다음과 같이 입력한다. (파일에 등록한 후 Script File Path를 지정해도 될 것으로 믿어 의심치 않는다...-.-)



6. 일단 jenkins 설정은 끝이다. 그런데 여기서 또하나의 문제가 발생한다. 바로 sudo 명령어...현재 나는 jenkins를 standalone 형태로

    사용 중인데 이렇게 해놓고 빌드하면 위의 스크립트 실행 후 jenkins 콘솔에 패스워드 입력 프롬프트가 떡하니 나타나서 멈춘 상태로

    있다.


7. 그래서 sudo를 패스워드 입력 없이 수행할 방법을 구글링...역시 없는 게 없는 구글...매우 위험한 방법이지만 내부에서만 사용하는 

   서버이니 한 번 사용해보기로 했다. 바로 sudores 파일 편집


    /etc/sudoers 파일을 편집한다. 강력하게 접근 권한 및 소유권이 지정되어있어 잘 편집이 안된다.

   우선 Finder로 파일을 찾아가서 사용 가능한 계정으로 읽기 쓰기 권한을 준 후 편집하였다. 물론 편집 후 권한은 원위치


   대략 다음과 같은 내용이 나오는 위치로 이동하여


   # Same thing without a password

 # %wheel        ALL=(ALL) NOPASSWD: ALL


  다음과 같은 내용을 추가해주었다.


  jenkins         ALL=(ALL) NOPASSWD: ALL


  의미는 jenkins 계정으로 모든 콘솔에서 모든 명령에 대해 sudo를 이용하여 처리할 때 패스워드를 입력받지 않아도 되는

  권한을 주는 것이다. 매우 위험해보인다...-.-


8. 여기까지 하면 5번 단계의 설정에 따라 런타임 시 각기 다른 Xcode 버전과 SDK 버전을 사용하여 빌드할 수 있게 된다.


요고하느라 하루 그냥 보냈다...ㅠ.ㅠ

'IT 이야기' 카테고리의 다른 글

[jenkins] jenkins에서 멀티 Xcode 사용 설정하기  (0) 2016.01.06
블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

오늘 SM 업무 수행 중인 모 기업에서 추가로 개발 중인 앱 개발자한테 연락이 왔다.

전달받은 인증서와 프로비저닝으로 빌드하고 In House 배포는 되었는데 


그쪽 개발자가 확인한 바로는 Swift 배포 이전에 생성된 인증서로는 Swift 관련 라이브러리 처리 시

오류가 발생한다는 것이다.


관련 내용


https://developer.apple.com/library/ios/qa/qa1886/_index.html


https://www.airsignapp.com/ios-apps-using-swift-crash-when-signed-with-inhouse-certificate/


아직 정확하게 확인은 못하였지만 기업 환경에서 Swift 개발 시 주의해야 할 것 같다.

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

같은 계정으로 등록된 앱이어야 공유가 가능하며

앱 아이디의 prefix가 같아야 한다...


업무상 iOS용 앱 2개 중 하나가 다른 하나의 버전을 체크해야 할 상황이 되었는데

이게 아무리 해도 안된다.


원인은 메인 앱은 현재 근무하고 있는 곳 계정이고 다른 앱은 타 개발사 계정으로 만들어진 앱이기 때문이었다.

결국 계획 무산...-.-

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2013/07/11 09:15 


다수의 SDK가 설치되어있는 경우

현재 적용된 SDK 버전 확인 방법


Mazdah-ui-Mac-mini:android mazdah$ /usr/bin/xcodebuild -showsdks

OS X SDKs:

Mac OS X 10.7                  -sdk macosx10.7

OS X 10.8                      -sdk macosx10.8


iOS SDKs:

iOS 6.1                        -sdk iphoneos6.1


iOS Simulator SDKs:

Simulator - iOS 6.1            -sdk iphonesimulator6.1


사용 중인 SDK 버전을 변경하는 방법


Xcode의 환경설정 -> Locations 탭에서 가장 하단에 있는 Command Line Tools를 사용중인

Xcode 버전으로 변경





블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

Tag ios, SDK, XCode

최초 작성일 : 2013/02/06 16:30 


기존 방식의 OAuth와 Twitter API를 이용하여 트위터 서비스를 제공하다가

이번에 iOS 5.0부터 iOS에 통합된 Twitter 프레임워크를 이용해보기로 하였다.

대체로 수정에 어려움은 없었고 전체적인 코드도 매우 깔끔해져서 좋았다.
하지만 한가지 문제가 발생을 했는데...

바로 DM(Direct Message) 목록을 보여주는 화면에서 권한이 없다는 응답과 함께
DM 목록이 보여지지 않는 것이었다.

구글링을 통해 확인한 결과 Twitter 개발자 페이지에서 다음 내용을 찾을 수 있었다.

What about Direct Messages?

The Twitter framework cannot read or delete Direct Messages but it can send them. If your application requires the ability to read or delete Direct Messages, you must follow the traditional OAuth web flow to obtain the user’s permission. You should then use the returned access token and secret for future calls that require DM read permission.

문서 링크 : https://dev.twitter.com/docs/ios

즉, Twitter 프에임워크에서는 DM 목록을 불러오거나 DM을 삭제할 수 없으며 이 기능을
사용하고자 하면 기존 OAuth방식을 따라야 한다는 것이다.

조금 골치아파진 것이 DM 리스트 기능 하나 때문에 Twitter 프레임워크를 못쓰거나 아니면
Twitter 프레임워크과 기존 Twitter API를 함께 사용해야 한다는 것이다.

애초 목적은 앱 내에서 트위터 로그인을 하도록 된 부분을 없애고자 한 것이었는데...
이 상태라면 DM 목록 보기 기능을 빼지 않는 한 목적을 이룰 방법이 없어진다...ㅠ.ㅠ
애플, 트위터...누가 나쁜거냐...-.-

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2012/06/13 14:31 



Jenkins를 이용한 Android 및 iOS 앱 자동 빌드 시스탬 구축


예전부터 개발의 생산성과 품질을 높이기 위한 모든 방법에 관심이 많았다.

다만 기회가 많지 않아 사용해 본 것이라고는 CVS + CruiseControl의 CI나

Trac + SVN의 이슈 트래커 정도가 다였다.


그러다가 스마트폰의 중흥기에 발맞춰보고자 아이폰 앱 개발을 시작하게 되었고

어찌어찌하다보니 운영 업무로 안드로이드와 아이폰을 모두 관리해야 하는 입장에

처하게 되었다.


더구나 하이브리드 형태다보니 모바일 웹 개발자들이 개발을 하고나서

테스트를 하려면 내가 항상 새로 앱을 빌드해주어야 하는 상황이 되어버렸다.

(원래 하이브리드 형태로 웹 리소스들을 웹서버쪽에 두었더랬는데 성능상의 이슈로

웹 리소스를 아예 단말의 앱쪽에 밀어넣는 우스운 형태가 되어버렸다.)


결국 이러한 상황을 타개하고자 jenkins를 이용한 CI 환경을 구축하게 되었다.

아래 내용은 그 과정에 대한 정리이다.


*** 이 작업에 영감을 주신 맥부기의 '뱅리'님께 감사드립니다 ***


1. 환경


서버 : 맥미니 서버

OS : MAC OSX Lion Server (10.7.3)

소프트웨어 : Jenkins(iOS 앱 빌드를 위해서 Xcode plugin 사용), android_sdk, Xcode(4.2.1)


2. 프로세스 설명


현재 자동으로 빌드하고자 하는 앱은 하이브리드 형태로 대다수의 기능적인 부분은 js, css, html로 구성되어있다.

다만 네트워크의 부하와 성능적인 문제로 인해 불가피하게 리소스들을 웹서버에 두지 못하고 앱 내에

포함을 하게 되었다. 따라서 다음 프로세스에 따라 최종 앱을 빌드하게 된다.


1) SVN 서버로부터 웹 리소스(js, css, html 등)을 checkout(update)하여 jenkins의 workspace에 저장

   * 이 부분은 jenkins를 설치한 후 job을 생성하고 빌드를 수행하면 기본적으로 이루어지는 프로세스이다.


2) 역시 SVN으로부터 단말쪽 앱 소스를 checkout(update)하여 jenkins의 workspace에 저장


3) 1)에서 받은 웹 리소스를 2)쪽에 있는 단말 소스의 적당한 위치에 복사


4) 앱 빌드


5) 빌드된 패키지를 웹페이지에서 다운로드 받을 수 있도록 SVN의 다른 위치에서 commit


이후 단계는 배포서버에 설치된 Hudson (jenkins의 이전 버전)에서 자동으로 빌드된 앱 패키지 파일을 불러와

웹페이의 다운로드 링크 위치에 저장을 한다.


이러한 프로세스를 위해 1), 3)의 프로세스를 수행하기 위한 job(Project)을 하나 만들고

다음으로 안드로이드 앱 빌드를 위한 job과 아이폰 앱 빌드를 위한 job 이렇게 총 3개의 job을 생성하게된다.


잡을 생성한 후에는 웹 리소스를 받아와 앱 소스쪽으로 복사해주는 job을 상위에 놓고

단말 앱을 빌드하는 2개의 job을 서브 프로젝트로 놓아 상위 프로젝트의 빌드를 수행하면 자동으로

하위 프로젝트까지 수행되도록하면 한번의 빌드로 전 과정이 수행되게 된다.


3. 상세 설명


3-1 소프트웨어 설치


우선 이 내용은 아이폰 앱 빌드를 포함하고 있기 때문에 MAC을 기반으로 설명을 한다.

jenkins는 맥용으로 다운로드받아 설치할 수도 있다.(jenkins 홈페이지에 가면 각 OS별 네이티브 바이너리를

다운로드 받을 수 있다.)

하지만 여기서는 jenkins.war를 다운로드 받아 설치하였다.


다운로드 위치 : http://jenkins-ci.org/

jenkins 실행 : 가단하게 standalone으로 실행하였으며 실행 방법은 다음과 갘다.

java -jar jenkins.war --httpPort=[port번호]


이렇게 설치하게 되면 jenkins의 root 디렉토리는 /Users/[사용자 계정]/.jenkins가 되며

SVN으로 부터 checkout한 소스들은 /Users/[사용자 계정]/.jenkins/workspace 아래 jenkins에서 생성한

프로젝트명으로 디렉토리를 생성한 후 그 아래 저장된다.


3-2 웹 리소스를 SVN으로부터 checkout(update)하여 앱 소스쪽으로 복사하는 job 생성


- jenkins의 메인 화면에서 '새로운 job' 선택

- job 이름 입력 (이 곳에 입력된 이름으로 workspace아래 디렉토리가 생성되므로 가급적 영문으로 입력)

- 프로젝트 형태는 기존 job 복사를 제외하면 4가지가 있는데 무난하게 첫번째 free-style로 선택한 후 OK 버튼 클릭





- OK 버튼을 누르면 바로 새로 생성된 job의 설정 화면으로 이동한다. 이 job은 SVN에서 소스를 가져와 다른 위치로 복사하는 프로세스를 수행하므로

   관련된 설정만 정리한다.


소스 코드 관리 항목

* Subversion 선택

* Repositary URL에 SVN repositary 주소 입력

Local module directory (optional) 항목은 소스를 저장할 위치인데 디폴트인 .으로 놔두면 위에서 언급한대로jenkins 설치 위치의 workspace아래 job이름의

  디렉토리 아래로 소스들이 저장된다.


Build 항목

* Add build step 선택. 선택할 수 있는 항목은 아래와 같은데 웹 리소스를 카피하기 위한 build.xml 파일이 기존 소스에 포함되어 있었기 때문에

  여기서는 Invoke Ant를 선택하였다. 단순 카피만 수행한다면 Execute shell을 선택하여 shell script로 처리해도 될 것이다.





* Ant의 빌드 파일(build.xml)에서 수행할 Target의 이름을 적어준다. Target이 여러개일 경우 공백으로 구분하여 적어준다.


* Invoke Ant를 선택하면 jenkins는 기본적으로 현재 job 경로의 root에서 build.xml 파일을 찾는다. 즉 TEST라는 프로젝트라면

  /Users/[사용자 계정]/.jenkins/workspace/TEST/build.xml을 수행하게 되는 것이다. 만일 build.xml이 다른 경로에 있거나 빌드 파일이

  다른 이름이라면 '고급…'버튼을 클릭 후 Build File 항목에 빌드파일의 경로와 이름을 적어준다.





Post-build Action 항목

* 앞서 프로세스에서 설명한 바와 같이 소스 카피 후 바로 앱을 빌드하는 job을 수행해야 하므로 Add post-build action에서 'Build other project'를 선택한다.

* Project to build에 앞으로 추가할 앱을 빌드하는 job의 이름을 입력한다. 2개 이상의 job을 수행하려면 ,로 구분하여 적어준다.





마지막으로 저장 버튼 클릭 후 프로젝트 메인 화면으로 돌아오면 최초로 Build Now를 수행하여 SVN으로부터 소스를 Checkout한다.

물론 설정에서 등록한 모든 작업들이 진행된다.


3-3 안드로이드 앱 빌드 job 생성


job 생성에서부터 소스 코드 관리 항목까지의 작업은 3-2와 동일하다.


빌드 트리거 항목

* 3-2의 job 수행 후 바로 수행되도록 설정하기 위해 '다른 프로젝트가 빌드된 후 빌드함' 항목에 체크

* Project names에 선행할 프로젝트 이름을 입력한다. 2개이상의 프로젝트 이름은 ,로 구분하여 입력한다.





Build 항목


*** 사전 준비 ***

먼저 로컬에서 안드로이드 프로젝트의 빌드를 수행하는 Ant 빌드파일을 생성하고 이 빌드 파일을 함께 SVN에 커밋한다.

빌드 파일 생성은 [android sdk]/tools로 이동하여 다음 명령어를 수행하면 된다.


 ./android update project -p [안드로이드 프로젝트 경로] -n [프로젝트 이름]


이 명령을 수행하면 프로젝트 root 아래에 다음 2개의 파일이 생성된다.


build.xml

local.properties


이 중 build.xml은 수정할 것이 없고 local.properties에 android sdk 경로가 기록되는데 jenkins를 통해 자동 빌드를 해야 하므로

이 경로를 jenkins 서버의 환경에 맞춰 수정해주어야 한다.


이렇게 생성된 2개의 파일을 모두 SVN에 commit한다.


* 3-2와 마찬가지로 Invoke Ant를 선택하고 수행할 Target을 적어주는데 'clean debug' 이렇게 적어주면 된다(따옴표 없이 적음)

* 여기까지 하면 Build Now를 수행했을 때 .apk 파일이 생성되어 프로젝트 root 밑에 bin 디렉토리에 저장된다.

* 나는 여기서 배포용 서버까지 올리는 작업을 추가로 진행하였기 때문에  Add build step을 추가하고 (Execute shell) shell script를 통해

생성된 .apk 파일을 또 다른 SVN의 working copy(SVN 서버에서 checkout한 위치)로 복사를 한 후 그 위치로 이동하여 commit을 수행하는 내용을 추가하였다.

참고로 아래와 같은 코드이다.


# 기존 .apk 파일 삭제

rm [svn working copy]/[앱 패키지명].apk


# jenkins 프로젝트에 생성된 앱 패키지를 svn working copy로 복사

cp [jenkins 프로젝트 root]/bin/[앱 패키지명].apk [svn working copy]/[앱 패키지명].apk


# svn working copy로 이동

cd [svn working copy]


# 빌드번호 부여를 위해 날짜값을 구함

buildDate=`date +%Y%m%d%H%M%s`


# SVN 서버로 commit

svn commit -m "앱 이름 Android build$buildDate" [앱 패키지명].apk


마지막으로 '저장'버튼 클릭 후 3-2와 마찬가지로 Build Now를 클릭하여 최초 빌드를 수행해준다.



3-4 iOS 앱 빌드 job 생성


사전 준비로 jenkins에 Xcode plugin을 설치해야 한다.

다운로드 위치 : https://updates.jenkins-ci.org/download/plugins/xcode-plugin/ 1.3.1 버전 다운로드


jenkins 메인 화면의 'jenkins 관리'->'플러그인 관리'로 이동한다.

상단 탭 버튼 중 '고급'으로 이동하여 중간 부분에 있는 '플러그인 올리기'에서 다운로드 받은 xcode-plugin.hpi 파일을 선택하고

'올리기' 버튼을 클릭하면 설치된다.


아니면 '설치 가능' 탭에서 바로 플러그인을 선택하고 설치해도 된다.


빌드 트리거 항목까지는 3-3과 동일하게 진행한다.


Build 항목

* Add build step에서 Xcode를 선택합니다. 상당히 많은 입력항목이 나오는데 대부분 디폴트로 둔다.(비어있는 항목도 그대로)

  직접 설정해야 할 것은 'Clean before build?'와 Build IPA?', 'Keychain password'정도만 입력해주면 된다.


* 3-3과 마찬가지로 배포용 서버로 업로드 해야 하므로 Add build step에서 Execute shell을 선택하고 shell스크립트를 작성하는데

  내용은 경로와 앱 이름을 제외하고는 3-3과 동일하다.


'저장'버튼을 눌러 저장하고 최초로 Build Now를 눌러준다.

기존에 Xcode에서 정상적으로 빌드되는 프로젝트라면 jenkins의 설정만으로도 정상적으로 빌드가 된다.




블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2011/11/16 12:51 


지난 프로젝트의 마무리도 완벽하지 못해 계속 수정 요청이 들어오고,

새로 투입된 곳은 이번달로 개발이 끝나는 기업은행 본점의 모바일 시스템인데
그걸 인수인계 받아 운영을 해야 하기 때문에 개발팀과 함께 밤 10시 11시까지
강행군이다...ㅠ.ㅠ

문제는 지난 프로젝트 때 만든 앱이 자꾸 죽는다는 것이다.
1분 간격으로 100개의 웹사이트를 웹뷰에 로드시키는 작업을 반복하면서
로딩 시간을 체크하는 것인데. 최소 9시간은 돌아가야 한다.

메모리 처리를 위해 이코드 저코드 잔뜩 넣어봤지만 메모리 누수는 여전하였다.

결국 처음으로 돌아갔다.

전역으로 UIWebView 변수 하나 만들어서 viewDidLoad에서 초기화 후
addSubView로 현재 컨트롤러의 뷰에 붙여주고

dealloc에서 release, viewDidUnload에서 nil 처리해준 것이 전부...

결국 이 코드로 돌아가서 여유 메모리 31mb인 상황에서 테스트 시작하여 무려
15시간의 강행군을 무사히 마쳤다.

가장 평범하면서도 정석이라고도 할 수 있는 코드가 역시 답이었던 것...

사실 실무 프로젝트 다니다보니 메모리 해제 작업을 매크로로 만들어서
dealloc에서 release와 nil 처리를 모두 해주는 경우가 많기에 그 코드를 그냥
썼었는데. 이 코드가 일반적인 상황에서는 문제가 없는데 메모리 부족 상황에서는
좋지 않은 코드였던 모양이다. 나중에 한 번 정밀하게 테스트를 해보아야겠다.

아직 테스트를 한 번 밖에 못해서(테스트 한 번에 최소 6-7시간은 걸리니...ㅠ.ㅠ)
불안한 감이 없진 않지만 일단 문제 해결의 실마리가 잡힌 것 같아 너무나 다행스럽다.
뭐니뭐니해도 가장 기쁜일은 월급이 제대로 들어왔다는 것...^^

나랑 계약한 그 분에게 피해 안가도록 끝까지 최선을 다해보자~

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/04/17 08:08 



클래스 이름 : NSIndexPath

부모클래스 : NSObject

Framework : Foundation

관련 샘플들 : BonjourWeb, CoreDataBooks, iPhoneCoreDataRecipes,
   TableViewSuite, TaggedLocation

클래스 개요 :

NSIndexPath 클래스는 일련의 배열 모음으로 이루어진 트리에서 특정 노드의
위치를 표현한다. 이 경로를 index path라고 부른다.

각각의 index path내에 있는 각각의 인덱스는 처음 하나의 노드로부터
점점 더 깊어지는 자식 배열의 인덱스를 차례로 표현한다. 예를들면 1.4.3.2라는
index path는 아래의 Figure 1의 내용을 의미한다.



NSIndexPath 객체들은 각각이 유일하며 공유되어있다. 만일 한 index path가
특정한 인덱스 또는 이미 존재하는 인덱스들을 포함하고 있다면 이 객체는
새로운 인스턴스가 생성되는 것이 아니라 기존의 객체가 반환된다.


블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

최초 작성일 : 2010/04/03 06:24 


안받아서 어찌나 다행인지...-.-


링크 : http://www.idg.co.kr/newscenter/common/newCommonView.do?newsId=61332

추가금을 받더라도 좀 저렴하게...^^;;; 

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^