Xcode8.3.3 버전과 iOS10.3이상에서 프레임워크(framework)를 만드는 과정에 대해 정리하는 포스팅이다.
어차피 문서화도 필요한 부분이라 인터넷 블로그를 통해 학습을 하고 실무 적용 과정을 나열한다.
사용하는 언어는 Objective-C로 한다.
1. framework를 개발하기 편하도록 하나의 작업 그룹을 만든다.
Xcode > File > New > Workspace 를 선택하고 프레임워크명과 같은 workspace를 만든다.
저장위치는 임의 폴더(UBPayFrameworkProject)를 선택하고 workspace명은 UBPayFramework.xcworkspace로 생성을 하였다.
2. framework를 위한 프로젝트를 생성한다.
Xcode > File > New > Project를 선택하고 Framework & Libraray 탭 하위에 Cocoa Touch Framework를 선택한 뒤 Next
기본 정보를 입력한 뒤 프로젝트가 생성된 다음 앞에서 만든 Workspace에 추가를 해주면 된다.
Add to : UBPayFramework
Group : UBPayFramework 에 대해 선택을 하고 Create 하면 추가된다.
Git은 따로 생성하지 않았는데 프레임워크 개발 프로젝트 구조를 잡고 Git서버에 올려서 다른 개발자분과 나눠 개발을 진행하려고 했기 때문이다. Git서버가 있는 사람은 바로 만들어서 사용해도 좋을 것 같다.
3. 만들어진 프레임워크 프로젝트 구조
UBPayFramework프로젝트 아래 UBPayFramework폴더가 있고 UBPayFramework.h 파일과 Info.plist파일이 있는것을 볼 수 있다.
아래 Products 폴더 안에 UBPayFramework.framework 는 아직 빌드 되기전 상태를 나타내고 있다.
4. 다음은 프레임워크 프로젝트에 클래스를 추가한다.
클래스를 추가하는 방법은 일반적인 코코아 터치 클래스를 추가하는 방법과 동일하다.
Xcode > File > New > File > Cocoa Touch Class 선택, 파일명 입력 후 확인
UBPayInterface.h 클래스를 추가한 모습이다.
다음 추가한 UBPayInterface는 프레임워크 외부에서 참조해야하는 헤더 파일이 되어야 하므로 다음과 같이 설정을 변경해주어야 한다.
추가한 UBPayInterface.h 파일은 선택하고 Xccode우측 Target Membership 우측에 Public, Private, Project의 세가지 옵션 중 'Public'으로 변경한다.
기본적으로 만들면 Project로 선택되어 있는데 Public로 변경하지 않으면 외부 참조가 안된다.
추가한 UBPayInterface.h파일을 UBPay프레임워크에서 참조하도록 UBPay.h파일에 <UBPayFramework/UBPayInterface.h>를 추가한다.
프레임워크 프로젝트 테스트를 위해 추가된 클래스에 코드를 추가한다.
<UBPayInterface.h>
+ (instancetype) sharedInstance;
// -------------------------------------------------------------------------------
// isInitalized / 초기화 여부
// -------------------------------------------------------------------------------
- (BOOL) isInitalized;
<UBPayInterface.m>
@interface UBPayInterface()
/**
* 초기화 여부
*/
@property(nonatomic) BOOL isInitailized;
@end
@implementation UBPayInterface
// -------------------------------------------------------------------------------
// init
// -------------------------------------------------------------------------------
- (instancetype) init {
if (self = [super init]) {
/**
* 초기화
*/
self.isInitailized = YES;
}
return self;
}
// -------------------------------------------------------------------------------
// singletone object
// -------------------------------------------------------------------------------
+ (id) sharedInstance {
static UBPayInterface *_sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
// -------------------------------------------------------------------------------
// isInitalized / 초기화 여부
// -------------------------------------------------------------------------------
- (BOOL) isInitalized {
return self.isInitailized ? YES : NO;
}
@end
이렇게 테스트 코드까지 추가가 완료된 프레임워크 프로젝트이다.
프레임워크 프로젝트의 Deployment Target은 최소 8.0버전으로 진행을 했다. 더 낮은 버전은 테스트가 불가능한 상태라 그 이하의 버전이 필요한 경우는 확실하게 장담은 못하겠다. 다만 iOS6.0때가지도 가능하다고 하는 분들이 있는 듯 하다.
내가 하는 프로젝트에서는 가장 낮은 버전이 iOS8.0버전이라 그렇게 셋팅했다.
여기까지 하고 빌드 메뉴를 통해 빌드를 했을 때 성공했다면 시뮬레이터용 framework파일이 생성되어 있을 것이다.
빨간색으로 표시된 UBPayFramework.framework에 마우스를 가져다 되고 우측 팝업 메뉴 > Show in Folder 를 통해 들어가면 product > Debug-iphoneos > UBPayFramework.framework 파일이 보이게 될 것이다.
5. 프레임워크 테스트용 프로젝트를 생성한다.
Xcode > File > New > Project > Application탭에서 Single View Application을 선택한 뒤 프로젝트 정보를 넣고 다음,
Add to, Group to 부분에 UBPayFramework를 선택한 다음 Create를 누른다.
사진과 프레임워크명이 좀 다른데 다시 만드는 과정에서 이름이 변경되었다.
일단 중요한건 workspace안에 개발 테스트용 프로젝트와 프레임워크 프로젝트가 같이 들어가 있다. 따로 따로 만들어도 상관은 없는데 같은 workspace안에서 작업을 할 때 빌드 후 바로 바로 테스트가 가능하니 편리하고 시간도 많이 절약이 된다.
UBPayFramework.framework파일을 샘플 프로젝트에 추가한다.
Sample Project에서 Build Phases > Link Binary With Libiraries를 선택한다.
사진에서 보듯이 Workspace아래 UBPayFramework.framework파일이 보인다. 선택해서 Add한다.
이렇게 추가된 프레임워크 프로젝트는 실행(Run)을 할 경우 두 프로젝트가 순차적으로 빌드가 되고 바이너리가 자동으로 참조를 하므로 각각 빌드 후 추가하는 번거로움을 없앨 수 있다. 빌드(Run)전에 Command + K를 실행해 Clear시킨뒤 하면 된다.
Add하고 나면 프로젝트 디렉토리에 framework폴더가 추가되고 추가한 UBPayFramework가 추가 되어 있을 것이다.
이제 Sample프로젝트에서 framework를 import하고 UBPayInterface header에 정의한 메소드를 호출 해보자.
UBPayFramework.h파일안에서 UBPayInterface.h를 임포트하고 있기 때문에 sampe프로젝트 ViewController.m파일에서는 import <UPPayFramework/UBPayFramework.h>파일만 임포트를 하면 바로UBPayInterface.h파일에 접근이 가능하다. UBPayInterface.h파일을 Public으로 변경했기 때문이다.
ViewController.m 파일의 viewDidLoad()에서 구현한 함수이다.
- (void)viewDidLoad {
[super viewDidLoad];
UBPayInterface *interface = [UBPayInterface sharedInstance];
BOOL isInitialized = [interface isInitalized];
NSLog(@"%@", isInitialized ? @"초기화 성공" : @"초기화 실패" );
}
UBPayFramework/UBPayInterface.m 파일 안 init()메서드안에서 isInitailized변수의 값을 YES or NO로 변경해가면서 프로젝트를 재 빌드 테스트를 해보면 프레임워크와 잘 연결이 되고 있다는 걸 확인 할 수 있을 것이다.
'프로그래밍 > Xcode-iOS' 카테고리의 다른 글
iOS MP3파일 재생 방법 (AVAudioPlayer) (0) | 2017.08.03 |
---|---|
iOS(아이폰) 진동 구현 , 간단하다. (0) | 2017.07.20 |
iOS 랜덤숫자와 객체 비교 예제 (arc4random(), indexOfObject) (0) | 2017.07.05 |
[Xcode] Archive upload completed with warrings (0) | 2017.04.30 |
[iOS] NSPredicate 24시간 범위 검색 조건 만들기(NSDate) (0) | 2017.04.29 |