카테고리 : ios
-
Swift 3 접근 한정자
Swift 3 메서드에 대한 접근 한정자(엑세스 레벨)가 5가지(open, public, private, fileprivate, internal) 존재한다. 다른 언어들에 비해 많은 편이고 익숙하지 않은 개념으로 조금 복잡해 보일 수 있다. 다만, 프레임워크(모듈)를 만드는 경우가 아니라면 사용하지 않아도 되는 것들도 있다. 각각의 접근 한정자에 대해 간략히 알아보자(가장 개방된 것부터 가장 제한적인 순서로). open 가장 개방된 접근 한정자로써 소속 모듈 또는 소속 모듈을 import하는 모든 모듈에서 class와 class 멤
-
CocoaPods Subspecs를 이용한 선택적 의존성 설정
Xcode에서 CocoaPods를 이용해 sub module 만들기에서 모듈을 생성하는 것을 간단히 설명한 적이 있다. 모듈을 만들면서 여러 가지 기능을 하나의 모듈에 추가하다 보면 다른 프로젝트에서는 불필요한 코드들이 추가되는 상황이 발생한다. 이런 경우 Subspecs를 활용하면 선택적 의존성을 설정할 수 있다. 우선 Optional CocoaPod dependencies using Subspecs에 소개된 예시를 보자. # Kite-Print-SDK.podspec Pod::Spec.new do |spec| spec.name =
-
macOS Sierra 10.12.2 (Xcode8.2) CocoaPods 설치
예전에 CocoaPods 사용법이라는 글에서 CocoaPods을 설치하는 방법을 간단히 소개 했었다. 그런데 macOS가 버전업 되면서 이 방법으로는 설치가 되지 않는다 macOS Sierra에 CocoaPods을 설치하려는 경우 기본적으로 CocoaPods - Getting Started에 안내되어 있는 설치 방법으로는 다음과 같은 오류가 난다. $ sudo gem install cocoapods ERROR: While executing gem ... (Errno::EPERM) Operation not permitted - /us
-
Swift : Async - Background Threads - GCD(Grand Central Dispatch)
오늘은 swift에 비동기 처리에 사용하는 Async라는 라이브러리를 소개하고자 한다. Async는 "Syntactic sugar in Swift for asynchronous dispatches in Grand Central Dispatch"라고 소개되어 있다. Async를 소개하기 전에 swift에서의 기본적인 비동기 처리에 대해 먼저 설명한다. swift는 비동기(Asynchronous) 처리에 사용하는 GCD(Grand Central Dispatch)를 사용할 수 있다. GCD(Grand Central Dispatch)는 C
-
Cocoapods : Sub Module에서 GoogleMaps 의존성 사용시 Transitive dependency 문제 해결
아래에 설명한 방법을 사용시 런타임시에 문제가 될 수 있어 다른 방법을 찾고 있는 중이니 참고만 하길 바란다. 지난 글 Cocoapods : The 'Pods' target has transitive dependencies that include static binaries 오류에서 언급한 transitive dependencies 문제를 해결하는 방법을 설명하려고 한다. 미리 이야기 하지만 사실 아래의 내용은 아주 깔끔하게 해결하는 방법은 아니다. 정확한 해결이 되려면 CocoaPods에서 정식 지원을 해야 해결될 것으로 보인다.
-
Cocoapods : The 'Pods' target has transitive dependencies that include static binaries 오류
iOS용 앱 개발을 하면서 CocoaPods을 사용하고 있다. 그리고 CocoaPods을 이용해서 반복적인 기능의 구현을 Sub Module로 분리하여 프로젝트를 진행하고 있다. Sub Module 분리에 대해서는 Xcode에서 CocoaPods를 이용해 sub module 만들기에서 설명 했었다. 이렇게 만든 Sub Module에서 가지는 의존성은 dependency 속성을 이용해서 지정한다. 예를들면 아래와 같다. ModuleName.podspec Pod::Spec.new do |s| s.name = 'ModuleName' s.
-
XCode에서 storyboard 선택시 Crash가 발생할 경우
최근엔 XCode로 작업하는 일이 많아졌다. 안드로이드 개발과 웹 개발도 함께하지만 iOS 작업이 급하다 보니 주로 이 일을 하고 있다. XCode는 사용하면 할수록 잘 만들었다는 생각이 든다. 단, 코드 포멧팅 기능이 없다거나 소스 선택이 조금 부자연스럽다거나(이건 적응의 문제일 수 있다) 하는 것처럼 안드로이드 스튜디오에 비해 불편한 부분들이 있긴하다. 하지만 인터페이스 빌더 등의 도구들은 아주 잘 만들어져 있으며 결정적으로 빌드 속도가 무척 빨라서 좋다. 안드로이드 스튜디오도 지난 번에 적었던 Android Gradle 빌드
-
안드로이드 Crash Report 도구 : ACRA에서 Fabric(Crashlytics)으로의 전환
지난 글 ACRA : Please configure 'buildConfigClass' in your ACRA config 오류와 Android 6(API 23 : marshmallow) : Apache HTTP 클라이언트 제거에서 언급했던 것처럼 안드로이드 Crash Report 도구로 ACRA를 사용중이었다. ACRA 사용중에 만난 오류를 해결하기 위해 시간을 들여서 원인을 찾고 개발자에게 전달해서 개선을 요청할 정도로 나름 애용하려던 도구였는데 오늘 Fabric(Crashlytics)으로 바꿔버렸다. 사실 처음부터 대체할 목적이
-
Xcode 7.1의 StoryBoard에서 UIViewController(using Generics)를 Custom Class로 연결할 때 발생하는 오류
현재 xcode의 최신 버전은 7.1이다. 이 버전에서(이하 버전은 확인하지 못했다) 스토리보드와 Generics를 사용한 UIViewController를 연결하는 부분에서 버그가 있다. 버그는 인터페이스 빌더에서 찾지 못하는 문제와 강제 추가시 Unknown class <MyClass> in Interface Builder file 오류를 발생시키는 것이다. 자세한 내용은 아래에 설명하겠다. 일단 Generics가 어떤 것인지 정보를 더 얻고 싶다면 Swift - Generics 정리를 참고하자. 항상 이런 글을 쓰려고하면 상황을
-
Swift UIPageViewController에서 UIPageControl 오버랩하기
UIPageViewController 사용시에 하단에 현재 페이지의 위치를 알려주는 UIPageControl가 별도의 공간을 차지하고 표시된다. 이 부분의 공간을 제거하고 내용 페이지의 위에 오버랩하려면 아래와 같이 viewDidLayoutSubviews에 필요한 소스를 추가하면 된다. 기본적으로 UIPageControl는 투명이라 자연스럽게 덮힌다. class PageViewController: UIPageViewController { override func viewDidLayoutSubviews() { // UIPageCont
-
Xcode 7.1에서 Google Maps SDK 사용시 빌드가 되지 않는 결함
얼마전 iOS 앱 개발에 사용하던 xcode를 7.1로 업데이트 했다. 그런데 앱에서 사용중이던 Google Maps SDK가 빌드되지 못해 앱을 실행할 수가 없었다. 문제는 header 생성 부분인데 해결 방법을 찾지 못해 다시 7.0을 재설치해서 사용하고 있었다. 그렇게 지내던 중 오늘 갑자기 생각이 나서 다시 확인해 봤다. 다행히 그 사이에 Google에서 update를 내 놓았다. 이 문제가 수정된 버전은 1.10.5 버전이다. 그리고 관련된 issue는 Issue 8524: Bug: Running under Xcode 7
-
CocoaPods의 Swift compiler flags(DEBUG) 설정하기
Xcode에서 CocoaPods를 이용해 sub module 만들기라는 글에서 Sub Module을 만드는 방법을 설명했었다. 그런데 이렇게 연결된 Module을 사용하는 과정에서 불편한 부분이 생겼다. 다름아닌 #if DEBUG를 Sub Module에서 적용이 되지 않는 것이다. 이 부분은 생각해보면 당연하다 별개의 Module을 빌드에서 연결하는 것이니 DEBUG 상수를 사용하기 위한 설정을 별도로 해야 하는 것이다(DEBUG 상수 설정 방법은 Swift 프로젝트의 디버그(DEBUG) 플래그을 참고하면 된다). 그래서 Cocoa
-
Swift 2.0에서 상속 가능한 Singleton 생성하기
오늘은 swift에서 Singleton 객체를 생성하는 방법을 설명하고자 한다. 우선 Objective-C에서는 어떻게 생성하는지는 아래를 보면 알 수 있다. 우선 Singleton Class 정의. @implementation SingletonCls + (id)sharedManager { static SingletonCls *staticManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ staticManager = [[self alloc] in
-
Xcode에서 CocoaPods를 이용해 sub module 만들기
이번엔 Xcode로 앱 제작시 Sub Module을 만드는 방법을 설명하고자 한다. 그전에 우선 어떤 경우에 Sub Module을 사용하려고 하는지 부터 이야기를 해야 할 듯하다. 나의 경우는 여러 프로젝트에서 공통적으로 사용 할만한 유틸성 클래스들을 주로 묶어서 별도 모듈을 만들어 사용한다. 이렇게하면 비슷한 작업의 반복을 줄일 수 있고 기능도 통합적으로 관리할 수 있어 유지보수가 편하다. 이것은 예를들어 설명한 것일뿐 여러가지 용도로 사용될 수 있다. Android Studio의 경우 Module을 추가하고 gradle을 설정함
-
xcode 7 : Alcatraz 와 CocoaPods Xcode plugins
CocoaPods 사용법에서 CocoaPods를 설치하고 사용하는 법에 대해 간단하게 안내했었다. 오늘은 이 CocoaPods을 XCode에서 조금이나마 편하게 쓰기 위한 플러그인을 소개 하려고 한다. 덤으로 Alcatraz라고하는 Xcode용 패키지 메니저도 함께 소개한다. 우선 Alcatraz 부터 소개하려고 한다. CocoaPods Xcode plugins을 직접 설치하는 방법도 있으나 Alcatraz를 사용하면 더 쉽게 할 수 있기 때문이다. Alcatraz 공식 사이트에는 The package manager for Xcod
-
MFMailComposeViewController without 'No Mail Accounts' messages
iOS 개발시 앱 내에서 메일 발송폼을 보여주고자 할 때 사용하게 되는 것이 MFMailComposeViewController 이다. 이 클래스를 swift에서 사용할 경우 대부분 아래와 같이 사용하게 된다. let mc = MFMailComposeViewController() mc.mailComposeDelegate = self mc.setToRecipients([to]) if (subject != nil) { mc.setSubject(subject!) } if (body != nil) { mc.setMessageBody(body
-
Xcode 7 - You must rebuild it with bitcode enabled 오류 해결
Xcode 7에서 빌드시 아래와 같은 오류가 날 수 있다. ld: '/Volumes/Data/work/ios/bang9/Pods/GoogleMaps/Frameworks/GoogleMaps.framework/GoogleMaps(GMSCachedTile.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 bit
-
iOS 9 : The resource could not be loaded because the App Transport Security policy requires the use of a secure connection 오류
iOS 9을 대상으로 개발시 아래와 같은 오류를 만날 수 있다. ERRO AppDelegate[application(_:didFinishLaunchingWithOptions:):32]: Optional(Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSUnderlyingError=
-
Xcode 프로젝트 앱 이름 변경
앱 이름 변경 xxx-Info.plist 선택 Bundle display name 선택 새로운 이름으로 변경 끝
-
Swift 2.1에서의 오류 처리(do try catch)
애플이 2015.06.08.에 '세계개발자회의(WWDC) 2015'에서 스위프트 2.0을 공개 했지만 최근 다시 iOS 작업을 시작하면서 이제서야 swift 2.0을 사용하게 되었다. 그런데 이제 2.0 보려고 하는데 벌써 Xcode 7.1 beta 2가 나오면서 swift 2.1이 공개되었다. 오늘은 swift의 내용 중에서 오류 처리에 관련된 내용을 살펴보고자 한다. 아래의 내용은 Swift 2.0 の try, catch ファーストインプレッション와 공식 메뉴얼(Error Handling)의 내용을 참고하여 정리한 것이다. 공식
-
Swift 2 : 'lastPathComponent' is unavailable: Use lastPathComponent on NSURL instead. 오류 해결
Swift 2 : Binary operator '|' cannot be applied to two 'UIViewAutoresizing' operands 오류 해결에 이어 Swift 2로 넘어가면서 만난 또 다른 오류. 'lastPathComponent' is unavailable: Use lastPathComponent on NSURL instead. 관련해서 찾아보니 No more stringByAppendingPathComponent in Xcode 7 beta 5?라는 글이 있었다. 내용을 보니 해당 함수가 없어져서 다른 방법
-
Swift 2 : Binary operator '|' cannot be applied to two 'UIViewAutoresizing' operands 오류 해결
이번에 iOS 작업중 Swift 2로 변경을 하면서 아래와 같은 오류를 만났다. Binary operator '|' cannot be applied to two 'UIViewAutoresizing' operands 사실 이 부분말고도 여러가지 오류가 나왔지만 기본적으로 swift 버전업을 도와주는 헬프 기능 등을 통해 어느 정도는 쉽게 고칠 수 있었다. 어쨌든 이 오류는 아래의 코드를 보면 해결 방법을 바로 알 수 있다. let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height
-
CocoaPods 사용법
설치 [sudo] gem install cocoapods pod setup 사용법 패키지 검색 http://cocoapods.org/ Podfile 설정 cd 프로젝트 폴더 vi Podfile 아래의 내용처럼 필요한 pod을 설정. platform :ios, '7.0' pod 'HZWebViewController', '~> 0.0.2' Pod 설치 pod install Pod 업데이트 pod update 실행 프로젝트명.xcworkspace 프로젝트명.xcodeproj가 아닌 프로젝트명.xcworkspace로 프로젝트를 열어야 정상