Tag Archives: XCode

iOS9 ENABLE_BITCODE 설정을 찾을 수 없을 때 강제 추가하기

이번에 출시된 iOS9은 사용자의 보안을 위해 많은 기능이 추가되었고 편의성이 증대되었습니다. 하지만 iOS 개발자들에게는 조금 악몽이 될 수 있을것 같은 업데이트가 아닐까 생각합니다. 그중에 한가지 Bitcode설정에 대해서 적어보고자 합니다. 기존에 잘 관리하고 있던 프로젝트를 Xcode 7에서 빌드하려고 하면 다음과 같은 오류를 만나게 되는 경우가 있습니다.

ld: ‘XYPlatform.framework/XYPlatform(TTMacros.o)’ does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

이 문제의 해결책은 간단합니다. Bitcode가 포함되지 않은 빌드를 Xcode 7에서 Bitcode를 포함하여 빌드를 하여 사용하던지, 현재 프로젝트의 Bitcode설정을 끄면 됩니다. 끄는 방법을 좀 검색해 봤더니 Build Settings – Build Options – Enable Bitcode 값을 No로 바꾸면 된다고 나오네요.

enable_bitcode_option

심지어 위와 같이 친절하게 설정을 어디서 할 수 있는지 스크린샷까지 볼 수 있습니다. 하지만 저의 프로젝트에서는 아무리 찾아봐도 위의 설정을 찾을 수 없더군요. 그러던 중에 프로젝트 설정에 ENABLE_BITCODE를 강제로 추가하는 방법을 발견하였습니다.

먼저 프로젝트의 설정 파일(project.pbxproj)을 편하긴 텍스트 에디터로 열어봅니다. 일단 저는 vi로 열어보겠습니다.

$ vi MyProject.xcodeproj/project.pbxproj

그다음에 ASSETCATALOG_COMPILER_APPICON_NAME 로 검색을 해봅니다. 현재 프로젝트의 Build Configuration 숫자만큼 검색이 될것입니다. 기본적으로 Debug, Release 두개가 있으니 이 경우 두개가 검색이 되게 됩니다. 그부분의 항목에 ENABLE_BITCODE = NO; 를 각각 추가해 주면 됩니다.

95C220F71ABAF2BF00BC91DB /* Debug */ = {
    isa = XCBuildConfiguration;
    buildSettings = {
        ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
        ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
        ENABLE_BITCODE = NO;
        ...
    }
}

95C220F81ABAF2BF00BC91DB /* Release */ = {
    isa = XCBuildConfiguration;
    buildSettings = {
        ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
        ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;
        ENABLE_BITCODE = NO;
        ...
    }
}

이제 Xcode로 돌아와 보면 짠! 하고 설정이 추가되어있습니다. 이후에는 마우스 클릭으로 편하게 설정을 바꿀 수 있습니다.

참고 : http://stackoverflow.com/questions/31809140/i-would-like-to-know-how-to-get-option-enable-bitcode-in-xcode-7-beta-4

iOS CFBundleVersion와 CFBundleShortVersionString에 대한 이해

CFBundleVersion와 CFBundleShortVersionString의 차이점

ios_app_version_01

XCode에서 보면 위와 같이 버전 정보를 설정하는 부분을 볼 수 있습니다. 하나는 Version이고 다른 하나는 Build입니다. 이 버전 정보들을 Info.plist에서 확인해 보면 다음과 같은 형태로 저장이 되어있는것을 확인할 수 있습니다.

ios_app_version_02

보시면 Version → Bundle versions string, short이고 Build → Bundle version인것을 알 수 있습니다. 실제로 XCode가 사용하는 설정 키 값은 Version → CFBundleShortVersionString이며 Build → CFBundleVersion입니다. 이 두 버전값에 대해 알아보겠습니다.

CFBundleVersion

문자열(String) 값이며 iOS, OS X에서 릴리즈 된 혹은 아직 안된 앱 번들의 빌드 버전을 정의하는데 사용합니다. 이 빌드 버전은 3개의 양수로 된 정수값들의 조합으로 만들어집니다. 첫번째 정수값은 0보다 커야하며 각 문자열은 숫자(0-9)만을 포함할 수 있으며 사이마다 구분자로 점(.)이 들어갑니다. 각각의 정수값의 시작값이 0일 경우 그 값은 무시됩니다. 즉 1.02.31.2.3과 완벽하게 동일합니다. 이 값은 로컬라이징 될 수 없습니다.

CFBundleShortVersionString

이 값은 CFBundleVersion과 매우 흡사하지만 앱 번들의 릴리즈 버전만을 표시하는데 사용됩니다. 마찬가지로 릴리즈 버전역시 3개로 분리된 정수값으로 사용이 되며 첫번째 정수값은 앱의 메이저 리비전(Major Revision)을 표현하는데 사용됩니다. 이 리비전은 앱에 새로운 기능이 추가되거나 매우큰 변화가 구현되었을 때 증가합니다. 두번째 정수값은 덜 중요한 변화가 앱에 발생했을 경우에 증가합니다. 마지막으로 세번째 정수값은 버그 수정과 같이 운영에 필요한 업데이트가 발생할 경우 증가하게 됩니다.

이 CFBundleShortVersionString이 CFBundleVersion과 가장 다른점은 CFBundleVersion은 릴리즈 되었던 안되었던 비공식적인 버전을 포함한 모든 버전에 대한 버전값으로써 사용된다는 것이고 CFBundleShortVersionString은 출시버전을 나타냅니다. 또한 InfoPlist.strings를 통해 로컬라이징이 가능합니다.

CFBundleShortVersionString은 유저가 느끼게 되는 버전체계이고 iTunesConnect의 값과 동일해야 합니다.

CFBundleVersion와 CFBundleShortVersionString값 읽어오기

두 버전 정보를 읽어오기 위해서는 다음의 방법을 사용하면 됩니다.

NSString *appVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
NSString *buildVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
    
NSLog(@"CFBundleShortVersionString=%@, CFBundleVersion=%@", appVersion, buildVersion);

다음과 같이 값을 정상적으로 읽어오는것을 확인하실 수 있습니다.

2015-09-04 21:38:42.130 AppVersionExample[4185:422747] 
  CFBundleShortVersionString=1.0.1, CFBundleVersion=1.2.3

참고