http://www.cocos2d-iphone.org/forum/topic/8424
애드몹을 사용 하시기 위해서는 위의 사이트에서 등록 하여 고유 넘버 키를 받으셔야 사용이가능 합니다.
참고 사이트 입니다.


=============================================================================
AdViewController.h
#import <UIKit/UIKit.h>
#import <iAd/iAd.h>
#import "AdMobDelegateProtocol.h"

@protocol AdViewControllerDelegate;

@interface AdViewController : UIViewController <ADBannerViewDelegate, AdMobDelegate>
{
 id <AdViewControllerDelegate> delegate;
 id adBannerView;

 AdMobView* adMobAd;
}

@property (nonatomic, assign) id <AdViewControllerDelegate> delegate;

- (id)initWithMasterView:(UIView*)masterView;
- (void)rotateBannerView:(UIDeviceOrientation)toDeviceOrientation;

@end

@protocol AdViewControllerDelegate

- (void)adController:(AdViewController*)controller didLoadiAd:(id)iadBanner;
- (void)adController:(AdViewController*)controller didFailedToRecieveiAd:(id)iadBanner;

- (void)adController:(AdViewController*)controller didLoadAdMobAd:(AdMobView*)adMobBanner;
- (void)adController:(AdViewController*)controller didFailedToRecieveAdMobAd:(AdMobView*)adMobBanner;

@end

AdViewController.m

#import "AdViewController.h"
#import "cocos2d.h"

#import "AdMobView.h"

@implementation AdViewController

@synthesize delegate;

- (UIDeviceOrientation)currentOrientation
{
 return [[CCDirector sharedDirector] deviceOrientation];
}

- (id) initWithMasterView:(UIView*) masterView
{
 if( nil != (self = [super init]) )
 {
  [self setView:masterView];

  //Initialize the class manually to make it compatible with iOS < 4.0
  Class classAdBannerView = NSClassFromString(@"ADBannerView");
  if (classAdBannerView != nil)
  {
   adBannerView = [[classAdBannerView alloc] initWithFrame:CGRectZero];
   [adBannerView setDelegate:self];
   [adBannerView setRequiredContentSizeIdentifiers: [NSSet setWithObjects:
                 ADBannerContentSizeIdentifier320x50,
                 ADBannerContentSizeIdentifier480x32, nil]];

   [self.view addSubview:adBannerView];

   [self rotateBannerView:[self currentOrientation]];

   [adBannerView setHidden:YES];

  }
  else
  {
   //Request an AdMob Ad
   adMobAd = [AdMobView requestAdOfSize:ADMOB_SIZE_320x48 withDelegate:self];
   [adMobAd retain];
  }
 }

 return self;
}

- (void)rotateBannerView:(UIDeviceOrientation)toDeviceOrientation
{
 if (adBannerView)
 {
  if (UIDeviceOrientationIsLandscape(toDeviceOrientation))
   [adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier480x32];
  else
   [adBannerView setCurrentContentSizeIdentifier:ADBannerContentSizeIdentifier320x50];

  [(UIView*)adBannerView setTransform:CGAffineTransformIdentity];

  //Set the transformation for each orientation
  switch (toDeviceOrientation)
  {
   case UIDeviceOrientationPortrait:
   {
    [(UIView*)adBannerView setCenter:CGPointMake(160, 455)];
   }
    break;
   case UIDeviceOrientationPortraitUpsideDown:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(180))];
    [adBannerView setCenter:CGPointMake(160, 25)];
   }
    break;
   case UIDeviceOrientationLandscapeLeft:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(90))];
    [adBannerView setCenter:CGPointMake(16, 240)];
   }
    break;
   case UIDeviceOrientationLandscapeRight:
   {
    [(UIView*)adBannerView setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(-90))];
    [adBannerView setCenter:CGPointMake(304, 240)];
   }
    break;
   default:
    break;
  }
 }

 if (adMobAd)
 {
  [adMobAd setTransform:CGAffineTransformIdentity];

  //Set the transformation for each orientation
  switch (toDeviceOrientation)
  {
   case UIDeviceOrientationPortrait:
   {
    [adMobAd setCenter:CGPointMake(160, 456)];
   }
    break;
   case UIDeviceOrientationPortraitUpsideDown:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(180))];
    [adMobAd setCenter:CGPointMake(160, 24)];
   }
    break;
   case UIDeviceOrientationLandscapeLeft:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(90))];
    [adMobAd setCenter:CGPointMake(24, 240)];
   }
    break;
   case UIDeviceOrientationLandscapeRight:
   {
    [adMobAd setTransform:CGAffineTransformMakeRotation(CC_DEGREES_TO_RADIANS(-90))];
    [adMobAd setCenter:CGPointMake(296, 240)];
   }
    break;
   default:
    break;
  }
 }
}

#pragma mark -
#pragma mark ADBannerViewDelegate

- (BOOL)allowActionToRun
{
 return YES;
}

- (void) stopActionsForAd
{
 //Pause background music here

 [adBannerView setHidden:YES];

 [[CCDirector sharedDirector] stopAnimation];
 [[CCDirector sharedDirector] pause];
}

- (void) startActionsForAd
{
 //Resume background music here

 [self rotateBannerView:[self currentOrientation]];
 [[UIApplication sharedApplication] setStatusBarOrientation:(UIInterfaceOrientation)[self currentOrientation]];
 [adBannerView setHidden:NO];

 [[CCDirector sharedDirector] stopAnimation];
 [[CCDirector sharedDirector] resume];
 [[CCDirector sharedDirector] startAnimation];
}

- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
 BOOL shouldExecuteAction = [self allowActionToRun];
    if (!willLeave && shouldExecuteAction)
    {
  [self stopActionsForAd];
    }
    return shouldExecuteAction;
}

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
 [adBannerView setHidden:NO];
 [delegate adController:self didLoadiAd:banner];
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
 [adBannerView setHidden:YES];
 [delegate adController:self didFailedToRecieveiAd:banner];
}

- (void)bannerViewActionDidFinish:(ADBannerView *)banner
{
 [self startActionsForAd];
}

#pragma mark -
#pragma mark AdMobDelegate methods

- (NSString *)publisherIdForAd:(AdMobView *)adView
{
 return @"your_admob_publisher_id";    //replace it with you publisher id
}

- (UIViewController *)currentViewControllerForAd:(AdMobView *)adView {
 return self;
}

- (UIColor *)adBackgroundColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (UIColor *)primaryTextColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (UIColor *)secondaryTextColorForAd:(AdMobView *)adView
{
 return [UIColor colorWithRed:1 green:1 blue:1 alpha:1]; // this should be prefilled; if not, provide a UIColor
}

- (NSArray *)testDevices
{
 return [NSArray arrayWithObjects: ADMOB_SIMULATOR_ID, nil];
}

- (void)didReceiveAd:(AdMobView *)adView
{
 CCLOG(@"AdMob: Did receive ad");

 [self rotateBannerView:[self currentOrientation]];
 [self.view addSubview:adMobAd];

 [delegate adController:self didLoadAdMobAd:adView];
}

// Sent when an ad request failed to load an ad
- (void)didFailToReceiveAd:(AdMobView *)adView
{
 CCLOG(@"AdMob: Did fail to receive ad");
 [adMobAd removeFromSuperview];
 [adMobAd release];
 adMobAd = nil;

 [delegate adController:self didFailedToRecieveAdMobAd:adView];
}

#pragma mark -
#pragma mark Memory Management

- (void) dealloc
{
 if (adMobAd)
 {
  [adMobAd setDelegate:nil];
  [adMobAd removeFromSuperview];
  [adMobAd release];
  adMobAd = nil;
 }

 if (adBannerView)
 {
  [adBannerView setDelegate:nil];
  [adBannerView removeFromSuperview];
  [adBannerView release];
  adBannerView = nil;
 }

    [super dealloc];
}

@end

The usage is very simple, #importAdViewController.h in you Layer's .h and add the delegate protocol AdViewControllerDelegate

#import "AdViewController.h"

@interface Menu : CCLayer <AdViewControllerDelegate>
{
 AdViewController *adController;
}

And in your layer's .m add this

- (void)onEnter
{
 [super onEnter];

 adController = [[AdViewController alloc] initWithMasterView:[[CCDirector sharedDirector] openGLView]];
 [adController setDelegate:self];

}

- (void)onExit
{
 //Completely remove the controller
 [adController setDelegate:nil];
 [adController release];
 adController = nil;

 [super onExit];
}

- (void)adController:(AdViewController*)controller didLoadiAd:(id)iadBanner;
{
 //Do something when the ad loads, like moving objects.
}

- (void)adController:(AdViewController*)controller didFailedToRecieveiAd:(id)iadBanner;
{
 //Do something when the ad fails to load, like moving objects.;
}

- (void)adController:(AdViewController*)controller didLoadAdMobAd:(AdMobView*)adMobBanner;
{
 //Do something when the ad loads, like moving objects.
}

- (void)adController:(AdViewController*)controller didFailedToRecieveAdMobAd:(AdMobView*)adMobBanner;
{
 //Do something when the ad fails to load, like moving objects.
}
<script src="http://gods2000.tistory.com/plugin/CallBack_bootstrapper?&src=https://s1.daumcdn.net/cfs.tistory/v/0/blog/plugins/CallBack/callback&id=29&callbackId=gods2000tistorycom292340&destDocId=callbacknestgods2000tistorycom292340&host=http://gods2000.tistory.com&float=left&random=631"></script> 출처 :http://gods2000.tistory.com/29
Posted by 오늘마감
iOS에서 가장많이 사용하는 UI는 바로 테이블 뷰이다. 테이블 뷰는 리스트형태의 데이터를 보여주기위해 사용하기도 하지만, 설정화면을 TableView로 구성하기도 한다.
[TableView로 설정화면을 구성한 예]
이렇게 설정을 TableView로 만들었을때 해당 Cell들은 고정적이며 동적으로 처리해야 할일이 없다. 그런데도 이전버전의 방식으로 구현을 하려면 Custom Cell을 xib로 만들고 이것들을 배열로 만드는 불편한 작업을 할 뿐만 아니라, 테이블을 구현하기 위한 각종 delegate method까지 구현을 해줘야 한다.이렇게 불편한 점을 개선하고자 xCode4.2(iOS5)에서는 "static cell"이라는 일종의 TableView 타입을 제공해 줌으로서, Cell의 갯수가 변하지 않는 상황에서 쉽게 셀을 구성하도록 해주는 기능입니다. 해당기능은 xCode 4.2에서 제공하는 story board에서 사용할 수 있습니다.작성 방법1. 프로젝트 생성을 다음과 같이 진행합니다.
두번째 화면에서 Use Storyboard 에 체크를 한후 프로젝트를 생성합니다.
그럼 다음과 같은 구조의 프로젝트가 생성이 됩니다.
2. 첫번째로 ViewController.h가 상속받고 있는 Class를 UIViewController 에서 UITableViewController로 변경합니다.
3. MainStoryboard.storyboard파일을 선택합니다. 그후 오른쪽 아래쪽의 library창에서 TableViewController를 끌어다가 빈 화면으로 올려놓습니다.(기존에 있던 view위에 올리는 것이 아닙니다.)
빈공간으로 끌어올려 아래 그림처럼 두개를 나란히 배치시킵니다.
4. 맨 좌측의 화살표를 드래그 하여 TableView Controller에 붙입니다.
이렇게 화살표를 붙이면 TableViewController가 시작점이 되면서 앱을 실행 시키면 가장 먼저 이 Controller가 보여지게 됩니다.
5. 이제 이전의 View Controller(좌측에 있던)는 사용할 일이 없음으로 삭제 합니다.6. 이제 좌측 상단의 object 영역에서 TableView를 선택하고 속성창에서 content를 "static cells"로 변경합니다.
7. Storyboard에 있는 TableViewController의 File's Owner가 ViewController라고 지정해 줍니다.좌측의 "Table view Controller Scene"에서 Table View Controller를 선택하고 오른쪽 상단의 Identity Inspector창에서 Custom Class를 ViewController로 지정합니다.
이상으로 static cell을 사용하기 위한 기본설정은 모두 끝났습니다. 이제 TableView의 속성의 설정을 통해 static cell을 만들어 보겠습니다.왼쪽상단의 TableView를 선택하면 우측 inspector창에 다양한 TableView들의 속성이 나오게 되는데, 이것들을 통해 다양한 모양의 TableView를 구성할 수 있습니다.저는 섹션의 갯수와 table style만 변경하여 다음과 같은 모양을 만들었습니다.
[설정된 화면 모습]
이후 각셀 위로 library창에서 UI들을 끌어다가 셀에다 놓으면 바로 Custom cell을 만들어 낼 수 있습니다.그리고 각 셀을 선택을 하면 각셀의 세부설정(accessory타입 같은)을 할 수 있으니 필요한 데로 만들면 됩니다.
[실행결과 화면]
물론 IBOutlet 과 IBAction으로 연결하여 각 셀의 view들을 제어할 수 있습니다.
Posted by 오늘마감

출처 :  http://mystria.egloos.com/4387235

 

 

kabook 추가 : 압축 및 작업은 Mac에서 해야함

 

간략하게 정리..

1. 구현한 프로젝트를 "Simulator|Debug"가 아니라 "Device|Release"로 변경. Build를 수행함.

2. Project폴더의 "build > Release-iphoneos"에 들어가면 "프로젝트명.app"파일이 있는데 확장자는 표시되지 않음. 실제 Device와 연결이 되지 않아서인지 수행 불가 표시가 붙어있음.

3. 임의의 폴더를 생성하고, 그 안에 Payload라는 폴더를 생성. "프로젝트명.app"파일을 Payload폴더에 넣는다. "iTunesArtwork"는 "512*512"크기의 일반 png파일인데 아이튠즈를 실행시켰을때 표시되는 아이콘 모양인것 같다. iPhone에 올렸을 때 보여지는 아이콘은 따로 프로젝트에서 설정되는듯 하며, 따라서 "프로젝트명.app"파일 안에 포함되게 된다. "iTunesMetadata.plist"는 아이튠즈에 올렸을 때 표시되는 카테고리라든지 제작자같은 정보이다. 없어도 무방하다.
이 3개 중에 Payload폴더와 app파일만 있으면 된다.

4. 위 3가지 파일을 압축하게 되면 "Archive.zip"이 생성되는데, 이를 "아무이름.ipa"로 바꾸면 ipa파일 생성완료이다.

5. 이것을 iPhone에 올리는 것은 탈옥한 폰이어야 가능하며, 아이튠즈에 드래그하여 추가 후 동기화 시키는 방법과, "iPhone > var > mobile > Library > Downloads"에 복사 후 "Installous"를 이용해 설치하는 방법등을 통해 설치가 가능하다.

6. 완성

 

 



출처 : http://blog.naver.com/PostView.nhn?blogId=kabook&logNo=80122590217
Posted by 오늘마감
개발한 어플에서 sqlite3 를 사용하기 위해서는 /usr/lib 에 위치한 libsqlite3.dylib라는 동적 라이브러리 파일을 링크 시켜야 한다.

1. Xcode 에서 Groups & Files 를 눌러 Frameworks 를 선택하고 Project 메뉴의 add to project 클릭

2. /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKS/iPhoneSimulatorX.Y.sdk/usr/lib 폴더의 libsqlite3.dylib 파일을 추가한다. 이 파일은 SQLite3 라이브러리의 가장 최신 버전 파일을 가리키는 링크 파일이다.

 

물론 디바이스로 테스트 할 경우에는 iPhoneSimulator.platform 대신 iPhoneOS.platform을 선택하면 된다.

메시지 창이 뜨면 Copy items into destination group's folder (if needed) 항목을 체크하고,Reference Type 을 Relative to Current SDK 로 변경하고 추가 버튼을 누른다.

% Reference Type은 상대 경로로 하는 것이 링크가 깨질 확률이 낮고 좋다.

위와 같이 설정하고 나서 실제 sqlite3를 사용할 코드에서 다음을 import 하면 된다.

//#import "/usr/include/sqlite3.h" //기존에는 이렇게 했으나, ios4에서는 아래와 같이 해야하는 듯함.
#import  < sqlite3.h >

 


출처 : http://blog.naver.com/PostView.nhn?blogId=yesusok&logNo=50100610955
Posted by 오늘마감

 

작성 후 테스트 할 때는 꼭 볼륨을 키워놓고 테스트 하세요... ^^;


Create a View Based iPhone Application

First, create a view based iPhone application in XCode and add a button to your view that will play the sound. If you need a refresher on how to use Interface Builder to hook up controls check out my article on adding a slider control.

Add the Audio Toolbox framework

Drag in the Audio Toolbox framework into your frameworks group in XCode. Here is a video on how to quickly add frameworks in XCode if you need it: Quick Tip: Adding Frameworks Painlessly in XCode. Remember that the framework will be all one word with the .framework extension, AudioToolbox.framework.

Add a short wav file to your project

I used the website Joe’s Original Wave Files for this demo and found a nice laser sound to use. You can also buy the rights to use sounds in apps that you want to sell from websites like iStockPhoto.

Use Audio Services to play the sound

To keep things simple I put all the code that you need to play the sound in an IBAction called “shoot”.

-(IBAction) shoot{
 //Get the filename of the sound file:
 NSString *path = [NSString stringWithFormat:@"%@%@",
       [[NSBundle mainBundle] resourcePath],
       @"/jad0007a.wav"];

 //declare a system sound id
 SystemSoundID soundID;

 //Get a URL for the sound file
 NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];

 //Use audio sevices to create the sound
 AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);

 //Use audio services to play the sound
 AudioServicesPlaySystemSound(soundID);
}

That is it – pretty simple way to add some cool effects to your app.



출처 : http://blog.naver.com/PostView.nhn?blogId=yell301&logNo=130097056899
Posted by 오늘마감

다음 네 개의 장에서는 iPhone의 UIKit과 Cocoa Touch를 이해하는 데 필수적인 내용에 대해 다루지만, 아마 당장이라도 프로그램을 만들 준비가 되었을 것이라 여겨지기 때문에 먼저 간단한 iPhone 애플리케이션을 작성해 보겠다. 이 예제를 통해 IBOutlet과 IBAction의 사용법 그리고 Xcode 및 인터페이스 빌더와 친숙해질 것이다.

 

[Note]
이 책에서 소개하는 거의 모든 따라하기 예제는 이 책의 공식 블로그(
http://blog.naver.com/ipgipg)에서 동영상 서비스되고 있으며, 정보문화사 홈페이지(http://www.infopub.co.kr)의 자료실에서 다운로드 받을 수 있다. 첫 번째 동영상-지금 보여줄 따라하기 예제 애플리케이션-은 단계별로 음성 설명을 포함하고 있으나, 나머지 동영상은 음성 없이 화면만 나온다. 그러나 이번 예제 동영상에서 설명하는 과정을 잘 익혀놓으면 나머지 동영상도 어려움 없이 따라올 수 있을 것이다.


1. Xcode를 실행한 다음, 메뉴에서 [File]-[New Project]를 선택하면 New Project 창이 나타난다([그림 1-5]).
 

 

[그림 1-5] New Project 창

 

2. View-based Application을 선택하여 클릭한다. Save As 창이 나타나면 애플리케이션 이름으로 QuickStart라고 입력한다([그림 1-6]).

 

[그림 1-6] Save As 창

 

3. Xcode가 새 프로젝트를 생성하면 [그림 1-7]과 같이 왼쪽의 Groups & Files 목록에서 Classes와 Resources 폴더를 각각 아래로 펼친다.
 

[그림 1-7] Xcode에서 Classes와 Resources 폴더를 펼친 상태의 화면

 

4. Resources 폴더에 있는 QuickStartViewController.xib를 더블 클릭하여 인터페이스 빌더를 불러온다.

 

5. [그림 1-8]과 같은 캔버스(canvas)가 나타나지 않는다면 [그림 1-9]와 같이 도큐먼트 창에서 View를 더블 클릭한다.
 

[그림 1-8] 인터페이스 빌더 상의 뷰 캔버스

 

 

[그림 1-9] 도큐먼트 창

 

6. 인터페이스 빌더의 메인 메뉴에서 [Tool]-[Library]를 선택하면 라이브러리 창을 나타낼 수 있다. 라이브러리 창의 상단에서 모든 Cocoa Touch 클래스를 보여준다. Library를 아래로 펼친 후 Cocoa Touch를 클릭한다([그림 1-10]).
 

[그림 1-10] 라이브러리 창

 

7. 라이브러리 창 중앙 부분의 내용을 아래로 스크롤하면 Round Rect Button이 나오는데 Round Rect Button을 그대로 뷰 캔버스로 드래그 앤 드롭한다([그림 1-11]).
 

[그림 1-11] 버튼 추가

 

8. 뷰 캔버스 상의 버튼을 더블 클릭하여 Click Me라고 입력한다.

 

9. 7과 마찬가지로 Label을 만든다([그림 1-12]).

[그림 1-12] 레이블 추가

 

10. 저장한 다음 인터페이스 빌더를 종료한다.

 

11. 다시 원래 프로젝트 창으로 돌아와 Groups & Files 목록의 Classes 폴더 안에 있는 QuickStart ViewController.m을 선택하면 오른쪽의 편집 창에 소스 코드가 나타난다([그림 1-13]).

 

[그림 1-13] QuickStartViewController.m 화면

 

12. QuickStartViewController.m 소스 내용을 [소스 코드 1-1]과 같이 수정한다.

 

[소스 코드 1-1] QuickStartViewController.m
#import "QuickStartViewController.h"
@implementation QuickStartViewController
@synthesize myLabel;
- (IBAction) sayHello: (id) sender {
 NSLog(@"Hello....");
 self.myLabel.text = @"Hello";
}
- (void) dealloc {
 [super dealloc];
 [myLabel release];
}
@end

 

13. 마찬가지로 QuickStartViewController.h 파일을 열어 [소스 코드 1-2]와 같이 수정한다.

 

[소스 코드 1-2] QuickStartViewController.h
#import <UIKit/UIKit.h>
@interface QuickStartViewController : UIViewController {
 IBOutlet UILabel * myLabel;
}
@property (nonatomic, retain) IBOutlet UILabel * myLabel;
- (IBAction) sayHello: (id) sender;
@end

 

14. Xcode 메인 메뉴에서 [Build]-[Build]를 클릭하여 방금 작성한 프로젝트를 빌드한다.

 

15. QuickStartViewController.xib를 더블 클릭하여 인터페이스 빌더로 불러온다.

 

16. 뷰 캔버스에서 버튼을 선택한 후 인터페이스 빌더 메인 메뉴에서 [Tool]-[Inspector]를 선택하여 인스펙터 창을 띄운다([그림 1-14]). 인스펙터 창이 뜨면 두 번째 탭을 클릭하여 버튼 인스펙터를 띄운다([그림 1-15]).

 

[그림 1-14] 인스펙터 창

 

 

[그림 1-15] 버튼 인스펙터 창

 

17. 이벤트 목록에서 Touch Up Inside로 마우스 포인터를 옮긴 후 오른쪽의 동그라미를 도큐먼트 창의 File’s Owner로 드래그 앤 드롭한다. 이때 나타나는 팝업 창에서 sayHello:를 선택한다([그림 1-16]).
 
 

[그림 1-16] 버튼과 IBAction 연결하기

 

18. 뷰 캔버스의 레이블을 클릭하면 인스펙터 창의 내용이 레이블에 맞게 변경된다. 마찬가지 방식으로 New Referencing Outlet을 도큐먼트 창의 File’s Owner로 드래그 앤 드롭한 후 팝업 창에서 myLabel을 선택한다. 팝업 창에서 view를 선택하지 않도록 주의한다.

 

19. 저장하고 인터페이스 빌더를 종료한다.

 

20. Xcode 상에서는 현재 사용 중인 SDK로 iPhone Simulator 3.0과 Debug가 선택되어 있을 것이다([그림 1-17]).

 
[그림 1-17] 사용 중인 SDK로 iPhone Simulator 3.0과 Debug가 선택된 화면

 

21. Xcode 메인 메뉴에서 [Build]-[Build And Run]을 선택하면 방금 작성한 예제 애플리케이션이 iPhone 시뮬레이터에 설치된 후 동작한다([그림 1-18]).
 


[그림 1-18] iPhone 시뮬레이터에서 동작하는 예제 애플리케이션

 

22. Xcode 메인 메뉴에서 [Run]-[Console]을 선택하여 디버거 콘솔창을 띄운다.

 

23. 버튼을 클릭하면 레이블의 내용이 Hello로 바뀌며 디버거 콘솔창에 로그가 기록되는 것을 확인할 수 있다([그림 1-19]).
 


[그림 1-19] 버튼을 클릭한 후의 예제 애플리케이션 모습

 

 

 

예제로 배우는 핵심 패턴 아이폰 프로그래밍

제임스 브래넌 | 정기훈 옮김

정보문화사 2010.04.28



출처 : http://blog.naver.com/PostView.nhn?blogId=infopub&logNo=100108505592
Posted by 오늘마감

원본 : http://cocoaswirl.com/2009/05/20/iphone-opengl-speed-tip-turn-off-thumb-instructions/

 

Want to boost your iPhone OpenGL app’s framerate with one checkbox?  It’s easy; turn off Thumb instructions.

What are Thumb instructions?

The iPhone uses the ARM 1176JZ processor, and Thumb instructions are 16-bit versions of common 32-bit ARM instructions.  By default, your Xcode project will compile with Thumb instructions.

Why use Thumb instructions?

On embedded systems like the iPhone (or any system, really, but here especially), you have to think about the space your app uses.  Smaller instructions mean smaller code in memory and on disk.  That’s a good thing!  However, there’s a trade-off: performance.

According to Apple, the cost comes from floating-point operations.   Ripping out the GLfloats from your app isn’t the way to go, so let’s learn a better way.

How do I turn off Thumb instructions?

Here’s what to do in Xcode:

  1. Open your project
  2. Choose Project -> Edit Project Settings
  3. In the Project Info window, choose the Build tab
  4. In the search box, type “thumb
  5. You should see a “Compile for Thumb” setting.  Uncheck it. (Click image to enlarge.)
  6. Clean and rebuild your project.

That’s it!  If you don’t have the setting, make sure the Active SDK is set to Device.  The setting isn’t applicable to the Simulator.

What kind of frame rate boost will I see?

I had improvements of around 20, 30, and 50%.  Hopefully you will see even bigger ones!



출처 : http://blog.naver.com/PostView.nhn?blogId=eclove33&logNo=50092622625
Posted by 오늘마감
[출처] - http://www.cocoadev.co.kr/200




iPhone 어플리케이션은 Xcode란 개발툴에서 코코아터치 프레임워크와 Objective-C 언어를 사용하여 개발합니다. 코코아 터치는 맥 OS X의 핵심 프레임워크인 코코아를 기본으로 아이폰/터치라는 모바일 기기의 특성에 맞추어진 iPhone 개발의 기본 API입니다.

그렇기 때문에 아이폰 어플리케이션 개발을 위해 기본적으로 알아야할 사항은 통합개발 환경인 Xcode와 인터페이스 빌더라는 툴의 사용법, Cocoa Touch 프레임워크, Objective-C 크게 세가지입니다. 이번에는 간단히 iPhone OS의 계층구조를 중심으로 iPhone 어플리케이션 제작을 위해 접근하는 방법에 대해서 알아 보겠습니다.

1. iPhone OS 계층 구조
아래의 그림은 애플에서 설명하는 아이폰 OS의 기술 계층입니다. 이에 대한 자세한 내용은 아이폰 개발자 센터iPhone OS Technology Overview란 문서에 잘 정리되어 있습니다.


가장 로우레벨의 Core OS부터 가장 상위단계인 코코아 터치까지의 계층구조입니다. 주로 하단은 API가 C로 제공되며 상위로 올라 오면서 Objective-C로 제공됩니다. 많이 사용되는 로우레벨의 API들은 상위단계에서 쉽고 편하게 사용할 수 있는 프레임워크로 제공됩니다. 간 계층의 간단한 설명은 아래와 같습니다.

1) Core OS
메모리/프로세서 관리, 파일 시스템, 네트워크, 각종 하드웨어 드라이버등, 운영체제 하단의 커널 레벨에서 제공하는 커널 API 입니다. 흔히 이야기하는 시스템 프로그래밍에 관련된 C를 기반으로 한 라이브러리를 제공합니다.

2) Core Services
Core Foundation, CFNetwork, SQLite, POSIX threads와 같은 파일입출력, 저수준 데이터 타입, 소켓등에 관련된 서비스입니다. Core OS 레벨에 비교적 쉽게 접근할 수 있는 API를 제공합며 대부분 C로된 프레임워크를 제공됩니다. 여기서 제공하는 많은 기능들은 상단 코코아터치의 Foundation Framework에서 Objective-C 프레임워크로 제공됩니다.

  • Core Foundation - 배열, 스트링, 날짜, URL, 로우레벨 데이터등 아이폰 어플리케이션을 위한 기본적인 C API를 제공합니다.
  • CFNetwork - BSD 소켓 및 HTTP, FTP 프로토콜등 네트워크에 쉽게 접근할 수 있는 API를 제공하는 프레임워크입니다.
  • Core Location - GPS, 주변검색등에 사용할 수 있는 사용자의 현재 위치(위도, 경도) 정보와 관련된 API를 제공하는 프레임워크입니다.
  • SQLite - 아이폰 어플리케이션에서 쉽게 사용할 수 있는 파일기반의 경량 데이터베이스 입니다. SQLite에 관련된 보다 자세한 내용은 이전 포스팅을 참조해 주세요.
  • XML - XML 파싱을 위한 libXML2 라이브러리를 제공합니다.

이외에 보안, 주소록등에 관련된 서비스를 제공합니다.

3) Media
비디오, 오디오, 2D/3D 그래픽, 에니메이션을 구현할 수 있는 API를 제공합니다. Objective-C 또는 C로된 API를 제공합니다.

  • Quartz - OS X의 벡터를 기반으로 한 그래픽 엔진입니다. 선과 도형을 그리고 이미지, 비트맵, PDF를 출력하고 색상, 위치에 관련된 C로된 API를 Core Graphic 프레임워크를 통해 제공합니다.
  • Core Animation - 각종 에니메이션과 시각효과를 제공하는 Objective-C로된 프레임워크입니다.
  • OpenGL ES - 게임등과 같은 고성능의 2D/3D 그래픽 출력을 위한 OpenGL ES 1.1에 기반한 C 프레임워크입니다. OpenGL ES를 사용한 게임은 이를 지원하는 다양한 모바일 플랫폼에서의 포팅을 쉽게 할 수 있습니다. 자세한 내용은 공식 홈페이지를 참조하시기 바랍니다.
  • Core Audio - 마이크를 통해 녹음하고 음악파일을 출력하고 각종 음향효과를 제공하는 C로된 오디오 관련 프레임워크입니다.
  • OpenAL - OpenGL ES와 유사한 개념의 크로스 플랫폼을 지원하는 게임등을 위한 고성능 3D 오디오 라이브러리입니다. 자세한 내용은 공식 홈페이지를 참조 하시기 바랍니다.
  • 동영상 - mov, mp4, 3gp와 같은 각종 동영상 파일을 출력을 지원합니다. 이는 Objective-C를 기반으로 한 Media Player framework를 이용하여 손쉽게 접근할 수 있습니다.

4) Cocoa Touch
iPhone개발의 기본이 되는 계층으로 Objective-C를 기반으로 한 핵심적인 두개의 프레임워크를 가지고 있습니다. 사용자 인터페이스, 이벤트 처리등과 함께 위에서 언급한 로우레벨의 기술들을 보다 쉽게 사용할 수 있는 프레임워크를 제공합니다.

  • Foundation Framework - 배열, 스트링, 날짜 로우레벨 데이터등에 관련된 클래스를 제공하는 기본적인 프레임워크입니다. 위의 Core Foundation에서 제공하는 기본 API들의 Objective-C 레퍼 클래스를 제공합니다.
  • UIKit Framework -각종 컨트롤, 윈도우등의 UI, 이벤트 처리등 iPhone 어플리케이션의 사용자 인터페이스와 관련된 API를 제공하는 프레임워크입니다.


2. Mac or iPhone
Mac의 Cocoa와 iPhone의 Cocoa touch는 이름에서 부터 알 수 있듯이 매우 비슷합니다. 가장 큰 차이점은 역시 인터페이스에 관련된 부분으로 이와 관련하여 Mac에서는 AppKit이란 프레임워크를 iPhone에서는 UIKit이란 프레임워크를 제공합니다.

Foundation Framework는 거의 유사하지만 아이폰의 특성상 제거 또는 변경된 부분이 있습니다. 아이폰은 코코아 바인딩, Objective-C 2.0의 가비지 컬렉션, 애플스크립트, NSUndoManage등은 지원하지 않습니다.

개인적으론 시간이 충분하다면 맥에서 코코아 프로그래밍으로 시작한 후에 코코아 터치로 넘어가도 큰 어려움은 없을 것 같습니다.


3. C or Objective-C
대표적인 코코아 프로그래밍 서적인 Cocoa Programming for MAC OS X (번역본:코코아 프로그래밍)의 저자 아론 힐리가스는 그의 저서에서 아래와 같이 이야기 했습니다.

"C와 Java/C++같은 객체지향 언어를 알고 있다면 두시간이면 Objective-C를 마스터할 수 있다"

OOP와 프로그래밍 언어에 대한 개념만 있다면 Objective-C를 익히는 것은 쉽다라는 의미인 것 같습니다.

사실 어느 언어나 기본지식만 있으면 언어 자체를 익히는데는 그다지 어려움이 없습니다. 하지만 해당 플랫폼에 대한 지식과 핵심 라이브러리나 프레임워크를 배우는데 더욱 많은 시간을 소비해야 합니다. 아이폰도 Xcode, 인터페이스빌더의 사용법, OS X에서의 프로그래밍에대한 이해와 코코아 API를 배우는데 Objective-C 언어 자체를 배우는 것보다 더 많은 시간이 필요합니다.

1) C의 선행학습이 필요한가?
개발경험이 있으신 분들은 그동안의 경험을 바탕으로 어떻게 공부해야 할지 나름대로 방법이 있을 것입니다. 하지만 처음 시작하시는 분들은 Objective-C가 C를 기반으로 하고 있기 때문에, 반드시 C를 공부한 후에 Objective-C를 공부해야하는 지에 대해 질문을 하시는 분들이 있습니다.

이 부분은 아마 많은 분들이 차이가 있을 것 같습니다. 제 생각은 "반드시 필요하지는 않다" 입니다. Objective-C는 C에서 확장된 슈퍼셋이라고 하지만 Objective-C를 공부하기 위해 반드시 C를 먼저 공부해야 할 필요는 없을 것 같습니다.

C를 이해한 후에 Objective-C를 시작하는 것이 이론상으로도 맞고, 정상적인 방법일 것입니다. 하지만 대부분의 Objective-C 서적이나 메뉴얼에는 기본적인 문법에 대한 설명이 있고, 전문 C 서적보다는 범위가 작습니다. Objective-C를 사용할 수 있을 만큼 최소한의 문법만 알고 시작하는 것이 더 접근이 쉬울 것 같습니다.

아래는 iPhone 어플케이션의 샘플 소스중에 한부분입니다. 기존에 C/C++ 개발자들도 이런 Objective-C의 문법을 처음 보게되면, 이것이 C와 관련이 있고 C에서 확장되었다는 사실이 잘 이해가 가지 않을 것입니다.
 

처음 시작하시는 분이라면 차라리 이런 혼란을 피하고 코코아 어플리케이션을 바로 제작할 수 있는 Objective-C로 시작하는 것도 한 방법이라고 생각됩니다.

2) 접근방법
사실 가장 좋은 것은 아래와 같이 가장 로우레벨단계 부터 이해하고 올라 가는 것이 기초도 탄탄하고 가장 좋은 방법일 것입니다.

  1. 메모리/CPU등 컴퓨터 하드웨어에 대한 이해
  2. OS에 대한 이해
  3. 컴파일러에 대한 이해
  4. C언어
  5. 시스템 프로그래밍
  6. 자료구조/알고리즘
  7. Objective-C
  8. OOP, 디자인 패턴
  9. Cocoa API

위의 단계대로 차례로 지식과 실력을 쌓아서 접근하면 좋겠지만, 당장 아이폰 어플리케이션을 만들고 싶은데 지루하고 많은 시간을 필요로 합니다. 흥미를 잃지 않고 접근하는 방법은 위의 순서와 반대로 접근하는 것입니다.

Objective-C에 대한 메뉴얼을 대충(?) 한번 읽어 보고 바로 책, 웹사이트, 동영상등의 간단한 튜토리얼등을 따라해 보면서 실제 실행되는 모습을 보면 계속 흥미를 유지할 수 있습니다.

그후에 어느정도 감이 생기면 직접 만들고 싶은 어플리케이션을 목표로 잡습니다. 첫 목표는 과한 욕심은 버리고 간단하고 쉬운 어플리케이션 부터 시작합니다. 아무리 간단해도 따라해 보며 만들었던 것과는 달리 원하는 기능을 직접 구현하는 것은 매우 어렵습니다. 자료도 많이 찾아 보아야되고, 다른 샘플 소스에서 복사해 와야 하는 경우도 있고, 관련 커뮤니티를 통해 도움을 받을 수도 있습니다. 관련자료들은 이전의 iPhone 어플리케이션 개발을 위한 준비 - 3. 관련 자료 포스팅을 참고하시기 바랍니다.

우여곡절끝에 만들어 내면 부족한면이나 필요한 부분이 무엇인지 조금씩 보이게 될 것 입니다. 필요에 의해 공부를 하다보면 아마 위의 순서를 거슬러 올라 접근하게 되는 경우가 많을 것 같습니다. 그러면 차차 복잡하고 어려운 어플리케이션을 만들 수 있을 것입니다.

막상 처음 시작하게 되면 알아야 할 것은 많고 답답한 마음만 드실 것입니다. 하지만 안타깝게도 왕도는 없습니다. 흥미와 열정을 유지하면서 차근차근 해 나가다 보면 어느새 바라는 어플리케이션을 만들수 있는 날이 눈앞에 와있을 것 입니다.

간혹 주위에 개발경험이 전혀 없는 분들로 부터 "무엇부터 시작해야 아이폰 어플리케이션을 만들 수 있냐?"는 질문을 들으면서 이와 관련해서 간단히 포스팅을 해보아야 겠다고 생각했습니다.

정리는 해보았는데 역시 어렵네요. 제가 봐도 이상한 용어들만 난무하고 설명도 중구난방이고, 개발을 처음 하시는 분들이 보면 잘 이해가 안가실 것 같다는 생각이 듭니다.

* 관련링크
iPhone 어플리케이션 개발을 위한 준비 - 1. 하드웨어
iPhone 어플리케이션 개발을 위한 준비 - 2. 소프트웨어
iPhone 어플리케이션 개발을 위한 준비 - 3. 관련 자료
iPhone 어플리케이션 개발을 위한 준비 - 4. 시작하기

출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110085696098
Posted by 오늘마감

출처 - http://shapeace.tistory.com/27

 

 

iPhone Programming for Dummy

1. iPhone SDK 설치


1.1. 시작하기

iPhone SDK 는 Apple 사에서 무료로 배포하고 있는 개발 도구로서, 누구든지 애플 개발 사이트에 등록하면 다운로드 받을 수 있다. 여기에는 Gcc 를 기반으로 한 Xcode 개발 환경과, Mac 에서 모든 것을 테스트 할 수 있는 에뮬레이터, 그리고 실제 장비에서 실행시키면서 수행 성능을 튜닝할 수 있는 성능 측정 프로그램 등 실제 개발 업무에 필요한 모든 것들이 포함되어 있다.

설치하기전, 먼저 다음과 같은 사항이 준비되었는지 확인하자.

  • Intel CPU 기반의 Mac Computer
기본적으로 iPhone SDK 는 Intel 기반의 Mac 에서만 사용할 수 있다. PPC 기반의 Mac 에서 SDK 를 설치한다면,
iPhone 과 관련된 사항은 설치되지 않는다. 그런데, PPC 기반의 Mac 에서도 전혀 불가능 한 것은 아니다.
이것에 대해서는 1.3. PPC 에서 설치하기 부분에서 다시 다루도록 하겠다.

  • 10.5.3 이상의 Mac OS X
이 버전 이하의 Mac OS 에서는 Xcode 가 설치되지 않게 되어 있다. 처음에는 그렇지 않았는데,
SDK Beta 6 부터에서 이런 제약이 생겼다.

  • C 프로그래밍 언어에 대한 기본 이해
정확하게는 Objective-C 언어에 대한 이해가 있어야 한다. Mac 에서 사용하는 Xcode 개발 환경은 기본적으로 Objective-C 언어에 기반하고 있으며, 그 역사는 NeXT Step 시스템으로 까지 거슬러 올라간다. 문제는 Objective-C 언어에 대해 아는 사람이 그리 많지 않다는 것이지만, 다행이도 Objective-C 언어는 C++ 만큼 어려운 언어는 아니다. 이 문서에서는 Objective-C 언어 자체에 대해 깊이 다루는 것은 피하도록 할 것이다. 단, C 언어 자체에 대한 이해조차 없다면 iPhone SDK 를 사용한 개발은 잠시 접어두고 C 언어 공부를 하고 오는 것을 권한다. 이 문서에서도 독자가 C 언어에 익숙하다는 것을 전제로 한다.


1.2. SDK 설치하기

Developer Connection 에 등록된 사람이라면 http://developer.apple.com/iphone/index.action 에서 SDK 를 다운로드 받을 수 있다.

약 1.2 GB 의 dmg 파일이 다운로드된다. 다 받았다면, 당연히 다운받은 dmg 파일을 마운트한다.
마운트하면 다음과 같은 내용이 보이는 디스크 이미지가 나타날 것이다.

두 번째 보이는 iPhone SDK 패키지 파일을 더블 클릭하여 설치를 시작하면 된다. Packages 폴더의 내용은 특별히 볼 필요 없다. 설치 과정에서 이 폴더에 있는 내용들이 로컬 디스크에 설치될 것이다. 단, PPC 환경에서 SDK 를 설치하는 사용자는 나중에 이 폴더를 열어볼 일이 생긴다.

설치 과정은 간단하다. 디스크 볼륨을 선택해주고, 별다른 설정 변경 없이 기본값으로 선택해서 진행하면 모든 것이 OK 이다.
설치 프로그램을 몇 단계 진행한 후 시스템 관리자 암호 창이 뜨고, 여기에 암호를 입력하면 다음 그림과 같은 화면이 나타나면서 설치가 진행된다. 십분 이상을 기다리면 설치가 완료된다.



설치 시간이 생각보다 길다고 불평하는 사람이 있을 지도 모르겠다. 하지만 이것은 단지 iPhone 응용 프로그램만을 만들기 위한 환경이 아니라, Java를 포함해서 Mac OS 용 프로그램을 만들 수 있는 모든 개발 환경이 포함되어 있는 것이다.

소프트웨어 설치가 끝나면, /Developer/Application 아래에 몇 가지 개발 프로그램들이 설치되어 있는 것을 확인할 수 있다.

Intel CPU 기반의 Mac 을 사용하는 사람이라면, 이제 기본적인 준비는 끝마친 셈이다.


1.3. PPC 에서 설치하기

이상의 과정을 모두 거치더라도 불쌍하게도 PowerPC 기반의 Mac을 사용하는 경우에는 iPhone 응용 프로그램 개발을 할 수 없다. 단지 Mac 데스크탑용 프로그램을 개발할 수 있는 Xcode 환경이 설치되어 있을 뿐이다. Apple 에서도 공식적으로는 PPC 기반의 Mac 에서 iPhone 응용 프로그램을 개발할 수 없다고 선언하고 있다.

그러나 방법은 있다. 다음의 과정을 통해서 G4, G5 Mac 에서도 iPhone 프로그램 개발을 해볼 수 있다. 단, 미리 말하지만 몇가지 사용할 수 없는 기능들이 있다고 하는데, 아직 정확하게 파악하지는 못했다. 그러나 기본적인 거의 모든 기능들을 문제없이 사용할 수 있다.

먼저, 설치하기 위해 마운트했던 디스크 이미지로 돌아가보자.
여기에는 앞서 말했듯이 packages 라는 이름의 폴더가 있다. 여기로 들어가 보면 각종 설치 패키지들이 보일 것이다.

SDK 설치 과정에서 자동으로 설치되었던 각종 패키지들이 여기에 있다. 그런데, 설치하면서 보았을 지도 모르겠지만, PPC 사용자들은 iPhone 관련 항목들이 설치되지 않았다. 선택 항목이 비활성화 되어서 임의로 선택할 수도 없었을 것이다.

이 제 할 일은, 여기서 iPhone 으로 시작하는 이름을 가진 5개 패키지를 하나씩 일일이 수동으로 설치하는 것이다. 설치 과정에서 설치할 폴더의 위치를 변경할 수 있는 단계도 나오는데, 일단 5개 모두 기본으로 설치하도록 클릭해서 넘어가도록 한다.

이런 식의 화면을 보면서 일일이 설치해야 한다...

모두 설치했다면, Finder 로 하드디스크의 루트(/) 위치를 살펴보자. 여기에 'Platforms' 라는 폴더가 생겼을 것이다.그리고 그 아래에는 두 개의 폴더가 있는데, 이 두 개의 폴더를 전부 /Developer/Platforms 아래로 이동한다.
겹 치는 폴더와 파일이 많기 때문에, 중복 확인 창이 뜨면 '대치' 하도록 해야 하는데, 여기서 기존 위치의 폴더 속성 문제로 한번에 파일 이동이 되지 않을 것이다. 문제가 되는 부분들을 하나씩 찾아서 하면 큰 문제 없이 모든 파일을 옮길 수 있을 것이다.

이제 힘든 대부분의 과정을 거쳤다.
마지막 단계가 하나 있는데, 일단 아래 경로를 찾아가서 파일들을 확인한다.

/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Specification

꽤나 길다. 최종 목적지에 다다르면 3개의 파일이 있을 것이다.
여기서 iPhone Simulator Architectures.xcspec 이라는 이름의 파일을 텍스트 편집기로 열자.
이 파일의 내용은 아래와 같다. 이것은 iPhone 시뮬레이터용으로 컴파일러가 코드를 생성할 때 어떤 타겟으로 만들 수 있는지에 대한 설정값이다.

 
/**
    iPhone Simulator Architectures.xcspec
   
    Copyright (c) 2008 Apple Inc.  All rights reserved.

    Architecture specifications in the iPhone Simulator platform.
*/
(
    // 32-Bit
    {   Type = Architecture;
        Identifier = Standard;
        Name = "Standard (iPhone Simulator: i386)";
        Description = "32-bit iPhone Simulator architectures";
        ListInEnum = YES;
        SortNumber = 1;
        RealArchitectures = ( i386 );
        ArchitectureSetting = "ARCHS_STANDARD_32_BIT";
    },

    // Old-style Debug
    {    Type = Architecture;
        Identifier = Native;
        Name = "Native Architecture of Build Machine";
        Description = "32-bit for build machine";
        ListInEnum = YES;
        SortNumber = 101;
        ArchitectureSetting = "NATIVE_ARCH";
    },

    // Intel
    {   Type = Architecture;
        Identifier = i386;
        Name = "Intel";
        Description = "32-bit Intel";
        PerArchBuildSettingName = "Intel";
        ByteOrder = little;
        ListInEnum = NO;
        SortNumber = 105;
    },
)

원본 파일은 만약을 위해 각자 편한 방식으로 백업해 두길 권한다.
그리고 이 파일의 내용을 다음과 같이 수정한 후 저장하자.

 /**
    iPhone Simulator Architectures.xcspec
   
    Copyright (c) 2008 Apple Inc.  All rights reserved.

    Architecture specifications in the iPhone Simulator platform.
*/
(
    // 32-Bit
    {   Type = Architecture;
        Identifier = Standard;
        Name = "Standard (iPhone Simulator: ppc)";
        Description = "32-bit iPhone Simulator architectures";
        ListInEnum = YES;
        SortNumber = 1;
        RealArchitectures = ( ppc );
        ArchitectureSetting = "ARCHS_STANDARD_32_BIT";
    },

    // Old-style Debug
    {    Type = Architecture;
        Identifier = Native;
        Name = "Native Architecture of Build Machine";
        Description = "32-bit for build machine";
        ListInEnum = YES;
        SortNumber = 101;
        ArchitectureSetting = "NATIVE_ARCH";
    },

    // G5 32-bit
    {   Type = Architecture;
        Identifier = ppc;
        Name = "PowerPC G5 32-bit";
        Description = "32-bit PowerPC for G5 processor";
        ByteOrder = big;
        ListInEnum = NO;
        SortNumber = 203;
    }
)

이 작업을 하지 않으면 코드를 작성하더라도 에뮬레이터를 사용할 수 없다. 이렇게 힘든 과정을 모두 통과하였다면 PPC 사용자들도 이제 iPhone SDK 를 사용할 자격을 비로소 얻게 된다.


자, 이제 모두 출발선에 섰다. 계속 달려갈 결심을 하는 일 만 남은 셈이다.
Intel 이건 PPC 건, 이제 구분하지 말고 Xcode 의 얼굴을 구경해보자. Xcode 가 어디있냐고? 보나마나 /Developer 아래 어딘가에 있겠지만 알게 뭔가. 그냥 Spotlight 에서 Xcode 라고 타이핑 한 후 Enter 키를 눌러보면 되지. 그리고 나서 Xcode 는 그냥 Dock 에 등록해 버리자.



환 영합니다. Dummy 여러분.

 



출처 : http://blog.naver.com/PostView.nhn?blogId=seogi1004&logNo=110086946825
Posted by 오늘마감

오랜만에 블로그에 포스팅을 하게 된 것 같습니다.

 

며칠 전에 Summoners와 Summoners iPhone Edition을 업데이트 후

 

도움을 많이 받은 맥부기 회원님들께 어떻게 도움이 될 방법이 없을까 고민하다가 이렇게 포스팅을 하게 되었습니다.

 

개인적으로 구글링이나 자료를 찾아가면서 한 내용이라 좀 잘못된 부분이 있을 수도 있습니다.

 

수정이 필요한 부분이 있다면 알려주시면 감사하겠습니다.

 

1. Game Center 연동하기

 

Step 1. Game Center을 연동하기 위해서는 1차로 관련 Framework이 프로젝트에 add가 되어 있어야 합니다.

 

XCode에서 자신의 project를 오픈 하신 후

 

왼쪽 편의 Frameworks 폴더에서 add->Existing Framework을 선택하신 후

iOS 4.x SDK에서

GameKit.framework을 추가해 주세요.

 

Step 2. RootViewController에 GameCenter에 필요한 Delegate를 등록합니다.

기본적으로 GameCenter에서 사용되는 matchmaking 팝업이나 LeaderBoard등의 팝업은  저 같은 경우 RootViewController위에서 구동하도록 한 관계로

RootViewController의 클래스에서 필요한 Delegate 객체를 등록하여 사용을 하였습니다.

 

RootViewController.h

#import <GameKit/GameKit.h>

@interface RootViewController:UIViewController <GKMatchmakerViewControllerDelegate, GKLeaderboardViewControllerDelegate,

GKMatchDelegate, GKAchievementViewControllerDelegate>   // 이와 같이 필요에 따라 추가를 해줍니다.

 

GKMatchmakerViewControllerDelegate : Matchmaker View를 띄울때 사용됩니다.

GKLeaderboardViewControllerDelegate : Leaderboard View를 띄울때 사용됩니다.

GKAchievementViewControllerDelegate : Achievement View를 띄울때 사용됩니다.(게임 진행 중 목표를 설정할 때 사용하는거 아시죠? ㅎㅎ)

 

우선은 GameCenter MatchMaking을 위주로 설명을 드리도록 하겠습니다.

우선 GKMatch의 객체를 생성한 다음 필요한 함수들을 미리 정의해둡니다.(이건 Apple Document에 잘 정리되어있으니 참고하셔도 될 것 같습니다.)

 

RootViewController.h

 

#import <GameKit/GameKit.h>

@interface RootViewController:UIViewController <GKMatchmakerViewControllerDelegate, GKLeaderboardViewControllerDelegate,

GKMatchDelegate, GKAchievementViewControllerDelegate>

{

GKMatch *myMatch; 

 SEL m_receiveDataCallback;
 id  m_setCallbackClass;

}

@property (nonatomic, retain) GKMatch *myMatch;

-(void)startGameCenter;

-(BOOL)isGameCenterAvailable;

-(void)authenticateLocalPlayer;

-(void)showMatchMaker;

-(void)setReceiveDataCallback:(id)callClass selector:(SEL)selector;
-(void)sendData:(NSString*)sendData;

 

 

다음은 RootViewController.m 입니다. 위에 선언된 함수들은 아래에서 하나씩 설명하도록 할게요.

RootViewController.m

 

@synthesize myMatch;

-(void)startGameCenter

{

     m_setCallbackClass = nil;

    if([self isGameCenterAvailable])   // Game Center를 사용가능한지 여부를 체크하는 함수입니다.

[self authenticateLocalPlayer];  // 사용자 인증을 하는 부분입니다. 자세한 내용은 아래에...

}

 

- (BOOL) isGameCenterAvailable
{
    // Check for presence of GKLocalPlayer API.
    Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
 
    // The device must be running running iOS 4.1 or later.
    NSString *reqSysVer = @"4.1";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);
 
    return (gcClass && osVersionSupported);
}

- (void) authenticateLocalPlayer // GameCenter의 User 인증 시 필요한 부분입니다.
{
    [[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error) {
  if (error == nil) //인증 성공 시 ...
  {
   // Insert code here to handle a successful authentication.
   NSLog(@"1--alias--.%@",[GKLocalPlayer localPlayer].alias);
   NSLog(@"2--authenticated--.%d",[GKLocalPlayer localPlayer].authenticated);
   NSLog(@"3--isFriend--.%d",[GKLocalPlayer localPlayer].isFriend);
   NSLog(@"4--playerID--.%@",[GKLocalPlayer localPlayer].playerID);
   NSLog(@"5--underage--.%d",[GKLocalPlayer localPlayer].underage);
   
   NSLog(@"Game Center: Player Authenticated!");
   
   [GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite){
    if(acceptedInvite){
     m_receiveDataCallback = nil;     
     GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithInvite:acceptedInvite]autorelease];
     mmvc.matchmakerDelegate = self;
     [self presentModalViewController: mmvc animated:YES];
     
    }else if(playersToInvite){
     GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
     request.minPlayers = 2;
     request.maxPlayers = 2;
     request.playersToInvite = playersToInvite;
     GKMatchmakerViewController *mmvc = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
     mmvc.matchmakerDelegate = self;
    }
   };
  }
  else
  {
   NSLog(@"AuthenticateLocalPlayer Error");
   // Your application can process the error parameter to report the error to the player.
  }
 }];
}

위 함수를 설명하기에 앞서 우선 전제가 있습니다.

http://itunesconnect.apple.com 에 어플이 등록이 되어 있어야 합니다.

물론 실제로 다 올릴 필요는 없고 Ready to Upload Binary 상태만 되어 있으면 됩니다.

 

그렇다는 전제 하에

위 사이트에서 Manage Your Applications를 선택 후 -> 자신의 어플을 선택합니다.

어플을 선택하시면 오른쪽 부분에 아래와 같은 메뉴가 보이실 겁니다.

오른쪽 메뉴 중에 Manage GameCenter를 선택하세요.

 

그러면 아래와 같은 메뉴가 뜰 것입니다.

지금은 MatchMaking만 테스트 할 예정이므로 다른것은 손대지 말고

Game Center Testing의 항목만 Enable로 바꿔줍시다.(저는 enable 상태이므로 현재 저렇게 Disable로 되어 있습니다.)

 

위 사이트에서 해야 할 일은 마무리 되었습니다.

 

이제 다시 프로젝트로 돌아와

Info.plist 파일을 열어 줍니다.

항목들 중 UIRequiredDeviceCapabilities 에 항목을 하나 더 add해서

gamekit을 추가 해준 다음 체크 해줍니다. (이부분 설명이 좀 빈약한가요...필요하시면 추후에 부연설명을..)

자 다시 소스로 돌아가 봅시다.

아까 설명하다 만 authenticateLocalPlayer 함수 부분을 다시 한번 보면

 

[GKMatchmaker sharedMatchmaker].inviteHandler = ^(GKInvite *acceptedInvite, NSArray *playersToInvite)

 

위와 같은 핸들러가 선언되어 있을 것입니다.

보통 두가지 경우가 발생을 하지요

acceptedInvite : 상대방의 초대를 받아서 수락할 경우

playersToInvite : 상대방을 초대할 경우

 

여전히 자세한 내용은 뒤로 미루고 우선 그렇다라는 것만 파악하고 진도를 나가도록 할게요.

 

authenticateLocalPlayer 이 부분까지의 구현이 마무리가 된 다음 startGameCenter를 원하는 부분에서 호출하여 실행하게되면

(아 authenticateLocalPlayer 함수에서 미구현으로 에러가 나는 부분이 있을텐데 그 부분은 우선 주석으로....

워낙 근본없는 블로거라 막 설명하네요 ㅎㅎ)

 

저 같은 경우는 startGameCenter를 XXX(프로젝트 명)AppDelegate.m 함수에서 바로 호출하였습니다.

- (void) applicationDidFinishLaunching:(UIApplication*)application
{

......

[viewController startGameCenter];

.....

}

 

저렇게 실행을 하게 되면 GameCenter에 ID가 없는 경우는 앱 실행 시에 기존 ID를 사용 할 것인지

아니면 새로운 계정을 만들 것인지 묻는 팝업이 뜨는데

그냥 새로운 계정 만들도록 합니다.(어짜피 Sandbox에 저장되는 것이니..)

 

이미 GameCenter에 로그인이 되어 있는 상태라면

아래와 같은 팝업이 보이게 됩니다.

 

이까지 나오면 GameCenter를 사용할 수 있는 상황까지 온 것이지요.

 

Step 3. MatchMaking 팝업을 띄워 봅시다.

그럼 이제 matchMaking 팝업을 띄워 보도록 합시다.

 

RootViewController.m의 아래의 함수 들을 추가하여 실행하도록 해보지요.

 

-(void)setReceiveDataCallback:(id)callClass selector:(SEL)selector
{
 m_receiveDataCallback = selector;
 m_setCallbackClass = callClass;
}

-(void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
 
 NSString *msg = [[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding] autorelease];
 NSLog(@"Receive MSG : %@\n", msg);
 if(msg == nil)
  return;
 if(m_setCallbackClass !=nil)
 {
  [m_setCallbackClass performSelector: m_receiveDataCallback withObject:msg];
 }
 else
 {

   // 이 부분은 상대와 matching이 된 다음 상대에게서 메세지를 받았을 경우의 처리루틴을 넣어주시면 됩니다.
 }
}

- (void) sendData:(NSString*) sendData
{
 [myMatch sendDataToAllPlayers:[sendData dataUsingEncoding:NSASCIIStringEncoding]
      withDataMode:GKSendDataReliable error:nil];
}

 

-(void)showMatchMaker

 GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
 request.minPlayers = 2;
 request.maxPlayers = 2;

 GKMatchmakerViewController *matchmakerController = [[[GKMatchmakerViewController alloc] initWithMatchRequest:request] autorelease];
 if(matchmakerController != nil)
 {
  matchmakerController.matchmakerDelegate = self;
  [self presentModalViewController: matchmakerController animated:YES];
 } 
}

 

1:1 대전이므로 player의 수는 위와 같이 최소 최대 2명으로 잡았습니다.

multi-Player를 지원하는 분들은 구미에 맞게 인원수를 조정해주시면 되겠습니다.

 

- (void)matchmakerViewControllerWasCancelled:(GKMatchmakerViewController *)viewController
{
 [self dismissModalViewControllerAnimated:YES];
 //[self.view removeFromSuperview];
 [self.view.superview removeFromSuperview];

}

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFailWithError:(NSError *)error
{
     [self dismissModalViewControllerAnimated:YES];
}

- (void)matchmakerViewController:(GKMatchmakerViewController *)viewController didFindMatch:(GKMatch *)match
{
 self.myMatch = match;
 if(match != nil)
  match.delegate = self;
 [self match:match player:[GKLocalPlayer localPlayer].playerID didChangeState:GKPlayerStateConnected];
 [self dismissModalViewControllerAnimated:YES];
}

- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state
{
    switch (state)
    {       
  case GKPlayerStateConnected:
            NSLog(@"GAME CENTER CONNECTED");

[self sendData:@"Hello~~~"]; // 연결이 완료되었을 경우 상대에게 메세지를 테스트로 보내는 양식입니다. 입맛에 맞는데로 바꾸시면 됩니다.

   break;
   
  case GKPlayerStateDisconnected:

NSLog(@"GAME CENTER DISCONNECTED");
            // a player just disconnected.

   [self cleanUp];
   break;
    }
}

-(void)cleanUp{
 [myMatch disconnect];
 [self setReceiveDataCallback:nil selector:nil];
 myMatch.delegate = nil;
}

원하시는 부분에 버튼을 하나 만들어 위에 만들어놓은 showMatchMaker 함수를 호출하도록 합니다.

 

그 후 프로젝트를 실행시켜 그 버튼을 클릭하게 되면

 

아래와 같은 팝업이 출력이 됩니다.

 

 

팝업에 보시면 상단에 Play now라는 버튼이 있는데 이 버튼을 누르시면 자동으로

상대와 연결을 시켜주게 됩니다.

 

그 이후에 동작에 대해서는 추가로 더 포스팅을 하도록 하겠습니다.

포스팅이 길어지니 저도 정신이 없네요. -_-;;

 

아 그리고 주의 사항이 있습니다.

만약 실제로 연결을 해보고 싶으신 분은 Device에서 테스트를 하셔야 합니다.

에뮬레이터의 경우는 위 팝업까지만 뜨고 실제 연결은 되지 않습니다.

 

테스트 해보시려면 두대의 단말을 실행시켜서 하셔야 합니다.

 

혹시나 에러가 나거나 문제가 있으시면 댓글을 달아주시면 제가 추가로 부연 설명을 하도록 하겠습니다.

 

두서없이 설명하다보니 정리가 많이 미흡합니다.

 

추후에 꼭 다시 정리를 해드리도록 할게요.

 

스크랩 시에는 흔적을 남겨주시기 바랍니다.



출처 : http://blog.naver.com/PostView.nhn?blogId=bluehjh&logNo=60124995193
Posted by 오늘마감