이번 강좌에서는 iOS와 짝을 이뤄 *.ane를 구성할


Flash 라이브러리를 만들어보겠습니다.




1. 라이브러리 생성


File > Flex Library Project 로 새로운 프로젝트를 생성해줍니다.



Command + N으로 새로운 클래스를 추가해줍니다.



클래스의 패키지나 이름은 크게 상관없습니다.


가능하면 패키지로 자세히 구분해주는게 좋습니다.


먼저 Extension의 아이디를 지정해줘야합니다.


여기서는 wooyaggo.extension.Alert이라고 하였습니다.


package
{
	import flash.external.ExtensionContext;

	public class AlertExtension
	{
		static public const EXTENSION_ID: String = "wooyaggo.extension.Alert";
		
		public function AlertExtension()
		{

		}
	}
}

이제 Extension 객체를 생성해줘야합니다.


ExtensionContext.createExtensionsContext( "[[Extension ID]]", "[[Extension Type]]" )


으로 생성해줍니다.


Extension Type은 null로 주셔도 무방합니다.


이 Extension을 통해서 메소드를 호출하려면


ExtensionContext.call( "메소드명", [파라미터1, 파라미터2...] );


과 같이 합니다.


코드 나갑니다.


package
{
	import flash.external.ExtensionContext;

	public class AlertExtension
	{
		static public const EXTENSION_ID: String = "wooyaggo.extension.Alert";
		
		private var _extension: ExtensionContext;
		
		public function AlertExtension()
		{
			_extension = ExtensionContext.createExtensionContext( EXTENSION_ID, null );
		}
		
		public function alert( $title: String, $message: String ): void
		{
			_extension.call( "alert", $title, $message );
		}
	}
}


우리가 미리 iOS에서 지정해준 것 처럼


FRENamedFunction* function = (FRENamedFunction*) malloc( sizeof(functionNumber) );
function[ 0 ].name = (const uint8_t *) "alert";
function[ 0 ].functionData = NULL;
function[ 0 ].function = &alert;


"alert"으로 지정해줬다면 호출할 때도 "alert"로 해야됩니다.




끝이에요.


-_-a


라이브러리는 별로 할게 없어요 ㅋㅋㅋ


이제 bin 폴더에 보면 다음과 같이 swc가 보일겁니다.



이 swc 파일과 iOS의 libAlertExtension.a 이 두 파일과 몇가지 설정을 담은 설정파일을 통해서


ane 파일을 만들 수 있게 되는 것이죠.


여기까지는...


...


쉽죠 


난관은 이제부터입니다.





2. ADT 연습


*.ane 파일은 빌더에서도 지원해주는 툴이 없습니다.


오로지 직접 컴파일을 커맨드상으로 돌려줘야합니다.


커맨드 상에서 직접 해줄 수도 있지만


컴파일러를 직접 다뤄본적 없는 경우에는 매우매우 까다롭습니다.


그래서 Flash Builder에 기본적으로 깔려있는 ANT빌드로 하나하나 테스트해가면서 만들어 볼 겁니다.


자 먼저 build.xml 파일을 만들어봅시다.



New 에서 File을 선택하여 "build.xml" 파일을 만듭니다.



아무 내용도 적지 않았는데


위 그림과 같이 에러가 나타난다면


ant가 제대로 동작하고 있다는 뜻입니다.


build.xml은 ANT 빌드의 기본 파일명이기 때문입니다.


프로젝트 안에 "build.xml" 파일이 있으면 그냥 xml 파일이 아니라


ant 컴파일 파일로 인식하기 때문에


정해진 형식이 아니라고 에러가 나는 것입니다.


다음과 같이 테스트 코드를 적어봅시다.



	
	
		TEST
	
	


위와 같이 코드를 적고 저장한 후에 


Command + F11을 누르면 다음과 같이 어떻게 실행할 것인지 물어봅니다.


(환경에 따라서 안물어볼 수도 있어요)



ant 로 선택하고 OK 버튼을 누르면 


다음과 같이 console 창에 <echo> 노드에서 적은 문자열이 출력됩니다.


ant 빌드에서 ActionScript의 trace 같은 역할입니다.


<echo file="memo.txt">TEST</echo>


라고 해주면 memo.txt 파일을 만들어서 그 파일 안에 적는 기능도 가능합니다.


ant 빌드에서 파일을 만들어서 XML 내용을 적거나 할 때 사용합니다.




이제 다음과 같이 컴파일에 필요한 변수들을 지정해줍니다.



	
	
		
		
	
	

이렇게 변수들을 지정해놓고 다음과 같이 사용할 수 있습니다.



	
	
		
		
		
		Extension Name is ${EXTENSION_NAME}
		Extension ID is ${EXTENSION_ID}
	
	


이렇게 하고 Command + F11을 하면



위와 같이 console 창에 찍히는 모습을 볼 수 있습니다.


다음 단계로 넘어가기 전에


이번 컴파일에서 사용될 변수들을 살펴보겠습니다.


많습니다 준비하세요~



	
	

		
		
		
		
		
		
		
		
		
		
		
		
		
		
	
	


iOS 파일관련된 부분은 이전강좌에서 다뤘던 내용입니다.


헷갈리지 않도록 잘 변수들을 설정해줍니다.


이제 환경 설정은 끝났고


본격적으로 ant 컴파일을 짜보도록 하겠습니다.




3. ADT 빌드


이제 만들어진 파일을 토대로


adt 빌드를 하기위해서는 다음과 같이 준비과정이 필요합니다.


 - swc 파일을 압축을 해제하여 library.swf 를 뽑아낸다.

 - libAlertExtension.a 파일을 복사하여 가져온다.

 - Extension 환경설정을 담은 extension.xml 파일을 생성한다.


먼저 swc 파일을 압축을 풀어보도록 하겠습니다.



	
	
		
		... 생략 ...		

		
		
	
	


위와 같이 unzip 커맨드를 추가한 후에 Command + F11로 돌려보겠습니다.


위 그림과 같이 swc 파일이 풀려서


catalog.xml과 library.swf 파일이 만들어진것을 볼 수 있습니다.


(풀린 파일이 보이지 않는다면 프로젝트나 폴더를 선택하고 F5를 눌러서 새로고침해주면 보입니다.)


이번에는 libAlertExtension.a 파일을 복사해와보겠습니다.



	
	

		... 생략 ...
		
		
		
		
		
	
	


위와 같이 <copy> 커맨드를 이용해서 bin 폴더로 libAlertExtension.a 파일을 복사해옵니다.


컴파일 해본 후 bin 폴더에 제대로 복사가 됐는지 확인합니다.



이번에는 extension.xml 파일을 생성해보도록 하겠습니다.


처음에 배웠던 <echo file=""> 커맨드를 이용해서 다음과 같이 작성합니다.



	
	

		... 생략 ...
		
		
		
		
		
		
	  ${EXTENSION_ID}
	  1
	  
	      
	        
	          ${iOS_EXTENSION_NAME}
	          ${EXTENSION_NAME}Initializer
	          ${EXTENSION_NAME}Finalizer
	        
	      
	  
]]>
		
	
	


주의할 점은 ${EXTENSION_NAME}Initializer 가 가리키는 것은


iOS 코드에서 우리가 AlertExtensionInitializer 메소드를 가르켜야합니다.


Command + F11로 컴파일하여 extension.xml 이 만들어지는지 확인하고


extension.xml 파일을 열어서 내용을 확인합니다.




extension.xml 내용이 제대로 다음과 같이 만들어졌는지 확인합니다.



	  wooyaggo.extension.Alert
	  1
	  
	      
	        
	          libAlertExtension.a
	          AlertExtensionInitializer
	          AlertExtensionFinalizer
	        
	      
	  


위와 같이 작성되었다면 이제는 마지막인 adt 컴파일러로 ane 파일을 만들차례입니다.


먼저 adt 파일이 제대로 동작하는지 다음과 같은 코드를 작성해봅시다.



	
	
		
		... 생략 ...
		
		
		
		
		
		
	  ${EXTENSION_ID}
	  1
	  
	      
	        
	          ${iOS_EXTENSION_NAME}
	          ${EXTENSION_NAME}Initializer
	          ${EXTENSION_NAME}Finalizer
	        
	      
	  
]]>
		
		
		
	
	


이 상태에서 ant 컴파일을 해보면


다음과 같이 콘솔에 찍힐겁니다.



정상입니다.


Result 가 출력됐단 얘기는


adt 는 정상적으로 실행되었지만 2 라는 exit code로 종료되었다는 뜻입니다.


뭔가 파라미터가 빠졌거나 컴파일 중에 오류가 발생했을 때 나타나는 메세지 입니다.


output 어트리뷰트에 적어준 파일에 관련된 에러 출력이 저장됩니다.


build.log 파일을 열어서 내용을 살펴봅니다.



어떤 파라미터도 오지 않아서 종료되었다고 나타납니다.


그 밑에는 adt 를 어떻게 활용해야되는지 도움말이 나타납니다.


ane 파일을 만들기 위한 사용방법은


adt -package SIGNING_OPTIONS? -target ane <output-package> <ext-desc> ANE_OPTIONS


입니다.


SIGNING_OPTIONS 는 이번 강좌에서는 생략이 가능합니다.


ANE_OPTIONS 는 도움말에 따르면


-swc <swc> ( -platform <name> (-platformoptions <file>)? <fileOrDir>* ( -C <dir> <fileOrDir>+ )* )*


라고 쓰여있습니다.


우리가 사용할 커맨드는 다음과 같습니다.


adt -package -target ane (ane 파일) (extension.xml 파일) -swc (swc 파일) -platform iPhone-ARM library.swf (libAlertExtension.a 파일)


파라미터를 ant 빌드에 추가해보겠습니다.



	
	
	
	
	
	
	
	
	
	
	


위와 같이 변수를 적용하여 작성이 완료되면 


컴파일을 돌려보겠습니다.




console 창에 정상적으로 오류 없이 완료되면


위 그림과 같이 ane 파일이 생성됩니다.


오류가 난다면


build.log 파일에 에러 로그가 찍히게 됩니다.


해당 에러로그를 잘 파악하여 어떤 부분이 잘못됐는지 잘 살펴봐야합니다.




이로써 ane 파일을 만들게 되었습니다.


바로 이 ane 파일을 가지고 Flash Builder 4.6 이상에서는 사용할 수 있게 됩니다.


하지만 다음 강좌에서는 ant 빌드로 확장해서


아이폰에 직접 설치까지 하는 강좌를 진행해보겠습니다.




라이브러리 다운로드 :


AlertExtensionLibrary.zip




1. Native Extension 구조의 이해


우선 개발에 앞서서 Native Extension에 대한 이해가 필요합니다.


Native Extension은 ActionScript Library와 iOS 또는 Android Library와 함께 컴파일되서 *.ane 파일이라는 결과물로 나옵니다.


우리가 개발할 앱에서는 이 *.ane 파일만 있으면 됩니다.


이 *.ane 파일에는 Flash 코드와 Native 코드가 모두 들어있어서 Flash Builder 4.6 이상부터는 자동완성도 가능하고 개발하는데 전혀 지장없습니다.


이 ane 파일에 대해서 간략하게 설명하자면


Flash와 JavaScript가 통신하는 것과 비슷합니다.


서로 약속된 메소드와 프로토콜을 기반으로 Flash 코드와 Native 코드를 하나의 *.ane파일로 만들어주는 것입니다.


즉 Flash쪽에서 


extension.call( "showMessage" );


라고 호출하기로 했다면


iOS에서는 showMessage라는 호출에 대응할 메소드를 제공해줘야합니다.


FREObject showMessage( FREContext context, void* data, uint32_t argc, FREObject param[] )
{
    // do something
} 

void ContextInitializer( void* data, const uint8_t* type, FREContext context, uint32_t *functionNumber, const FRENamedFunction** functions )
{
    ....생략....

    function[ 0 ].name = (const uint8_t*) "showMessage";
    function[ 0 ].functionData = NULL;
    function[ 0 ].function = &showMessage;

    ....생략....
}


이처럼 서로 약속된 프로토콜 전제하에 개발되어야 정확하게 동작합니다.


이렇게 서로 약속된 프로토콜에 따라 만들어진 ActionScript Library에서 만들어진 swc파일과 iOS에서 만들어진 *.a 파일을 가지고 *.ane 파일을 만들게 됩니다.




제 강좌에서는 Flash쪽에서 메세지를 보내면 디바이스의 기본 팝업으로 띄우는 간단한 앱을 만들어 볼 겁니다.


기대되요? ㅋㅋ





2. Project 생성



먼저 Xcode > File > New > Project 에서 


Framework & Library의 Cocoa Touch Static Library로 프로젝트를 생성합니다.



Product Name과 Company Identifier가 합쳐져서 App ID가 되므로


잘 네이밍을 해줍니다.


(프로비져닝 파일을 "*"로 해줬다면 어떤걸로 지어줘도 무방합니다.)


Next를 누르면 저장할 위치를 선택해주고나면 다음과 같이 프로젝트가 생성됩니다.



아무것도 손대지 말고 (복잡하니까) 바로 다음단계로 넘어갑니다.


Adobe Flash Builder의 SDK가 설치된 폴더에 가면


include폴더 밑에 FlashRuntimeExtensions.h 파일이 보일겁니다.



제 경우에는 


/Applications/Adobe Flash Builder 4.6/sdks/AIR 3.4/include/


위치에 있네요.


SDK는 가능하면 최신을 권장합니다.


이 FlashRuntimeExtensions.h 파일을 파인더에서 Xcode의 소스 있는데로 드래그해줍니다.



그럼 이렇게 묻는게 나오는데 맨 위에 체크박스를 해석해보자면


Destination ㅁ Copy items into destination group's folder (if needed)


파일 위치 ㅁ 필요하다면 프로젝트 폴더로 파일을 복사하기


라는 뜻입니다.


뭔 말인고 하니 체크를 하면 실제 파일을 복사해서 Xcode 프로젝트의 소스 폴더로 복사해온다는 뜻이고


체크 안하면 그냥 원본 파일의 경로로 참조만 한다는 뜻입니다.


저는 그냥 불안해서 항상 체크해서 복사해서 가져다 씁니다.


(지울지도 모르자나요 ㅋ)



복사해서 오면 위 그림과 같이 놓여져있을 겁니다.


셋팅은 끝났고 이제 코딩에 들어갑시다.




3. Extension 개발


AlertExtensions.m 파일을 선택하고 


import 구문에 다음과 같이 FlashRuntimeExtensions.h 헤더 파일을 임포트해줍니다.


#import "FlashRuntimeExtensions.h"
#import "AlertExtension.h" 


그리고 아래와 같이 메소드를 추가해줍니다.



다음과 같이 5개의 메소드를 순서대로 만들어줍니다. 


(언어가 C++ 이기 때문에 메소드 선언 순서도 중요합니다. 제가 모르고 해매서 그런거 아니에요.)


// 이 메소드를 플래시에서 호출할 것이다.
FREObject alert( FREContext context, void* data, uint32_t argc, FREObject param[] )
{
    return NULL;
}

void ContextInitializer( void* data, const uint8_t* type, FREContext context, uint32_t *functionNumber, const FRENamedFunction** functions )
{
    
}

void ContextFinalizer( FREContext context )
{
    
}

// 초기화 생성자로 사용할 메소드
// ANE를 생성할 때 메소드명을 정확하게 지정해줘야 하므로 기록해두자.
void AlertExtensionInitializer( void** data, FREContextInitializer* initializer, FREContextFinalizer* finalizer )
{
    
}

// 소멸자로 사용할 메소드
// 이 역시도 ANE를 생성할 때 메소드명을 정확하게 지정해줘야 하므로 기록해두자.
void AlertExtensionFinalizer( void* data )
{

}    

각 메소드의 역할은 다음과 같습니다.


void ContextInitializer( void* data, const uint8_t* type, FREContext context, uint32_t *functionNumber, const FRENamedFunction** functions )


런타임에 의해서 호출되는 메소드입니다.


Flash 쪽에서 createExtensionContext()로 Native Extension 객체를 생성하면 자동으로 호출되는 메소드입니다.


void ContextFinalizer( FREContext context ) 


마찬가지로 Flash 쪽에서 객체가 메모리에서 제거될 때 호출되는 메소드입니다.


void AlertExtensionInitializer( void** data, FREContextInitializer* initializer, FREContextFinalizer* finalizer ) 
void AlertExtensionFinalizer( void* data )


위 두 개의 메소드 ContextInitializer, ContextFinalizer는 Native Extension에서 자동으로 호출되는 메소드인 반면에


이 두 메소드 AlertExtensionInitializer, AlertExtensionFinalizer는 우리가 원하는 초기화 과정을 실행할 수 있도록 사용되는 메소드입니다.


그렇기 때문에 이 두 메소드는 *.ane 파일을 만들때 어떤 메소드들을 초기화, 소멸화 메소드를 사용할 것인지 선언해줘야합니다.


FREObject alert( FREContext context, void* data, uint32_t argc, FREObject param[] ) 


이 메소드는 Flash와 약속된 메소드입니다. 


Flash와 약속된 메소드는 반드시 위와 같은 메소드로 이뤄져야합니다.


이 메소드 안에서 우리가 구현하고 싶은 코드를 구현하면 됩니다.


이렇게 5가지 메소드가 Native Extension의 기본 골격입니다.


이제 하나하나 메소드를 구현해보겠습니다.




먼저 Native Extension이 앱에서 실행될 때 맨 처음 실행되는 초기화 생성자인 AlertExtensionInitializer를 작성해보겠습니다.


void AlertExtensionInitializer( void** data, FREContextInitializer* initializer, FREContextFinalizer* finalizer )
{
    *data = NULL;
    *initializer = &ContextInitializer;
    *finalizer = &ContextFinalizer;
}


이 Native Extension에게 초기화 메소드와 소멸자 메소드를 알려주는 부분입니다.


다음으로 Native Extension의 자체 초기화 메소드인 ContextInitializer를 구현해보겠습니다.


void ContextInitializer( void* data, const uint8_t* type, FREContext context, uint32_t *functionNumber, const FRENamedFunction** functions )
{
    *functionNumber = 1;
    
    FRENamedFunction* function = (FRENamedFunction*) malloc( sizeof(functionNumber) );
    function[ 0 ].name = (const uint8_t *) "alert";
    function[ 0 ].functionData = NULL;
    function[ 0 ].function = &alert;
    
    *functions = function;
}

저도 외워서 쓰는거라 잘 몰라요.


근데 가만 보면 어디어디를 고쳐야될지 보이죠?


function[ 0 ].name 에 Flash쪽에서 호출할 메소드명을 적어주고


function[ 0 ].function 에 실제 호출될 메소드의 레퍼런스를 넘겨줍니다.


그리고 ContextFinalizer나 AlertExtensionFinalizer 두 소멸자는 지금은 별 의미 없어서 공백으로 비워둡니다 ㅋ




이 단계에서 Command + B 를 눌러서


빌드가 잘 되는지 확인해야합니다.


빌드가 잘 됐다면 이제 실제로 팝업 부분을 구현해볼 차례입니다. 


alert 메소드죠.




4. Native 구현


팝업을 구현하기 위해서는 UIKit 프레임웍이 필요합니다.


AlertExtension.m 파일의 상단에 


UIKit을 임포트합니다.


#import "FlashRuntimeExtensions.h"
#import "AlertExtension.h"
#import <UIKit/UIKit.h>


이렇게 하면 알럿 팝업을 띄울 수 있게 됩니다.


이제 alert 메소드를 구현합니다.


FREObject alert( FREContext context, void* data, uint32_t argc, FREObject param[] )
{
    NSLog( @"ALERT~~~" );
    
    NSString* title = nil;
    NSString* message = nil;
    
    uint32_t titleLen;
    const uint8_t* titleString;
    
    if( FRE_OK == FREGetObjectAsUTF8( param[ 0 ], &titleLen, &titleString ) )
        title = [NSString stringWithUTF8String:(char*) titleString];
    
    uint32_t messageLen;
    const uint8_t* messageString;
    
    if( FRE_OK == FREGetObjectAsUTF8( param[ 1 ], &messageLen, &messageString ) )
        message = [NSString stringWithUTF8String:(char*) messageString];
    
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:title message:message
                                                   delegate:[UIApplication sharedApplication] cancelButtonTitle:@"OK" otherButtonTitles:nil ];
    
    [alert show];
    
    return NULL;
}


파라미터를 가져오는 방법을 잘 익혀두시기 바랍니다.


    uint32_t titleLen;
    const uint8_t* titleString;
    NSString* title = nil;
    
    if( FRE_OK == FREGetObjectAsUTF8( param[ 0 ], &titleLen, &titleString ) )
        title = [NSString stringWithUTF8String:(char*) titleString];


이제 다 됐습니다.


기왕이면 테스트하는 것까지 하려고 했는데


그럴려면 또 일이 너무 커져버려서 코드가 그리 복잡하지 않기 때문에 그냥 넘어가겠습니다.




5. Binary 파일


여기까지 다 됐으면


왼쪽에 Products 폴더를 열어보면


libAlertExtension.a 라는 파일이 생성되어 있는 것을 볼 수 있습니다.



이 파일이 ane를 만들때 필요한 파일입니다.


이 파일을 선택하면 Xcode오른쪽에 이 파일에 대한 위치와 파인더에서 볼 수 있는 버튼이 나옵니다.



ane 파일을 만들기 위한 바이너리 파일이므로 잘 봐둬야합니다.


이제 다음 강좌에서는 ane의 나머지 한 부분인 Flash 라이브러리를 만들어 보겠습니다.




소스 코드 다운로드 : 


AlertExtension.zip




하도 오랜만에 블로그에 글을 쓰려니 버튼 찾느라 해맸네요 -_-a


어도비에서 Native Extension이라는 멋들어진 기능을 내놓은지도 한참됐는데


여전히 자료는 없고 돌아다니는 것은 이미 만들어진 ane뿐.


어떻게 만드는지는 도통 찾기가 어렵습니다.


그래서 여러편의 아티클로 "Native Extension for iOS and Android 만들기"를 올려보고자 합니다.


우선 Android는 상대적으로 자료가 많아서 많은 분들이 어려워하고 있을 것 같은


iOS를 먼저 연재해보려고 합니다.




Native Extension for iOS 만들기 Part.0 - 준비



1. 필수 준비물


iOS는 개발에 들어가기전에 반드시 필요한 준비물이 있습니다.


바로 "맥"과 "개발자 등록"입니다.


iOS 앱을 개발하려면 애플에서 개발자 등록을 해야하고


개발자 등록을 하고나서 개발툴을 받으면 맥에서만 돌아갑니다.


멋지죠...


준비물은 바로 맥과 개발자 등록입니다.


맥은 http://store.apple.com/us 에서 구입하시면 되욬ㅋㅋㅋㅋㅋㅋㅋㅋ


개발자 등록은 


https://developer.apple.com/devcenter/ios/index.action


회원가입 후 로그인을 하고 나면 구입하는 프로세스가 뜹니다. (약 결제 후에 2, 3일 걸릴거에요)



2. 준비물


맥과 개발자 등록을 마쳤다면 개발을 시작해야할텐데


그전에 미리미리 해놔야될 것들이 많습니다.


바로 인증서와 프로비져닝 파일인데요.


개발자 등록을 마쳤다면 다음처럼 Provisioning Portal 메뉴를 볼 수 있습니다.



이 iOS Provisioning Portal 에서 각종 인증서 관련 기능을 제공합니다.


 - 인증서


인증서는 개발용 인증서와 배포용 인증서로 나뉩니다.



Certificates > Development 메뉴가 개발용 인증서


Certificates > Distribution 메뉴가 배포용 인증서를 관리하는 곳입니다.


인증서를 발급 받는 방법은 아래 문씨님의 블로그를 참고하시기 바랍니다. 


http://beta.smoon.kr/20 "개발자 강좌 - 키체인 등록"




 - 기기 등록


iOS는 개발용으로 사용할 디바이스를 등록후에 사용해야합니다.


기기 등록에 대한 글 역시 문씨님의 블로그를 참고하시기 바랍니다.


http://lab.smoon.kr/54 "개발 준비 - 기기 등록"




 - 프로비져닝 파일


개발자 인증서가 개발자에 대한 인증이라면


프로비져닝 파일은 앱에 대한 인증서라고 보면 됩니다.


아래 두 게시물을 참고하셔서 프로비져닝 파일을 만드시면 됩니다.


http://lab.smoon.kr/55 "개발 준비 - 어플 아이디 등록"


http://lab.smoon.kr/56 "개발 준비 - 기기에 넣고 돌려보기"


앱 아이디를 "*" 와일드 카드로 문자로 하게 되면 어떤 앱이라도 테스트가 가능합니다.


다만, 앱을 마켓에 올릴 때는 앱 아이디가 정확해야하므로 순수 개발용으로만 "*" 프로비져닝 파일을 만들어두면 편리합니다.


개발자 인증서와 프로비져닝 파일을 한 곳에 잘 보관해둬야 두고두고 편리합니다.




 - 마무리 테스트


개발 환경이 잘 되었는지 확인하기 위해서 아무 프로젝트나 만들어서 폰에 한번 돌려보겠습니다.


xCode > File > New > Project 를 선택합니다.



아무 프로젝트나 생성해도 상관없습니다.


Product Name과 Company Identifier 를 합쳐서 App Id가 됩니다.


"*"로 만든 프로비져닝 파일이 디바이스에 깔려있다면 상관없지만 그렇지 않다면 앱 아이디는 디바이스에 설치된 프로비져닝 파일의 앱 아이디와 일치해야합니다.



아래와 같이 프로젝트가 생성되었다면 다짜고짜 Command + R을 눌러서 실행해봅니다.


디바이스가 연결되어 있다면 디바이스로, 연결이 되어 있지 않다면 시뮬레이터로 실행이 될 겁니다.


Run버튼 오른쪽에 test > Wooyaggo iPhone을 iPhone 5.1 Simulator로 설정해주면 시뮬레이터로 됩니다.



1월?? 뭐지 ㅋㅋㅋ


암튼 실행만 되면 됩니다.




인증서가 제대로 설치되지 않으니까 이렇게 오류가 나네요


만약 위와 같이 에러가 난다면


에러가 나는 문구를 잘 살펴보고 구글 검색이나 인증서나 디바이스에 프로비져닝 등을 하나씩 짚어보고 원인을 찾아야합니다.






여기까지가 준비입니다.


아직 뭘 만들지도 않았는데 준비만 하는데도 이만큼입니다.


이 과정을 한번에 성공하신 분은 가히 천재라고 부르고 싶습니다. ㅋㅋ


천천히 반복학습한다고 생각하시고 오류나면 싹 다 지우고 다시 인증서부터 만드는걸 하나씩 하다보면


점점 익숙해지실 겁니다.


이제 다음편부터 본격적으로 개발에 들어가보겠습니다.


다음편은 "Part.1 - iOS 개발" 입니다.



+ Recent posts