프로그래밍/Objective-C2010. 7. 28. 10:58
* 예외처리

  - Objective-C의 예외처리를 위한 예약어
@try: Exceptions이 던져질 수 있는 block을 정의한다
@throw: Exception object를 던진다
@catch(): @try bolck안에서 던져진 exception을 catch한
@finally: @try block에서 Exceptions가 던져지던 아니던 수행되어질 block code를 정의한다

  - 모두 NSException.h에 정의되어 있다


* NSAssert

  - 특정 조건을 만족하지 않는 경우 NSInternalInconsistencyException예외를 발생시켜 프로그램을 강제로 중단시키는 매크로함수
  - 사용방법 : NSAssert(만족해야 하는 조건, 출력할 문장);


* 에러 처리

  - 에러가 발생하면 메서드나 함수의 리턴 값 형태로 에러의 발생을 리턴한다. 파일 처리에는 이러한 에러 처리를 위한 객체를 대입하도록 되어 있다. 이 경우 에러 처리에 관련된 오브젝트를 대입하면 에러가 발생해도 프로그램이 중단되지 않고 적절한 메시지를 출력하도록 할 수 있다

  - NSError : NSError.h 파일에 정의되어 있는 클래스로 에러에 대한 정보를 저장할 수 있는 클래스
* 생성자
+(id)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictionary *)dic

* 멤버 프로퍼티
(NSString *)domain: 에러와 관련된 기술 요소 (Cocoa, Unix…)
(NSInteger)code: 에러에 관련된 정수 값
(NSDictionary *)userInfo: 에러에 관련된 정보를 저장할 사전

* 멤버 메서드
(NSString *)localizedDescription: 에러를 설명하는 문자열로 domain과 code 출력
(NSString *)localizedFailureReason: 에러의 발생 원인
(NSString *)localizedRecoverySuggestion: 에러의 대처 방법


* XCode 화면 설정

  - [X-Code] – [Preference] 메뉴를 이용
  - [All – In – One]:  빌드, 디버깅, 검색 등이 모두 하나의 창에서 실행
  - [Condensed]: 파일 창, 편집 창, 디버깅 창 등이 모두 분리되어서 실행
  - [Default]: 그룹 및 파일 창, 편집 창 등은 통합되어 있고 디버깅 창,  GDB 콘솔 등의 일부 창은 분리된 상태에서 실행


* Break Point

  - Break Point 설정 : 원하는 지점을 선택하고 마우스 오른쪽을 클릭해서 Add BreakPoint

  - Break Point 삭제 : Break Point를 선택하고 마우스 오른쪽을 클릭해서 remove BreakPoint

  - Break Point 까지 실행 후 옵션
Continue: 코드를 계속 실행
 Step Over: 코드 다음 행으로 이동
 Step Into - 코드가 다른 메서드를 호출하는 경우 메서드 안으로 진입
 Step out - 현재 메서드를 빠져 나가서 호출하는 메서드로 이동

  - Break Point에 소리 설정하기 : 마우스 오른쪽을 클릭한 후 [Built-In BreakPoints] – [Sound out and auto-continue]

  - Break Point에 동작 지정하기
Break Point에서 오른쪽의 + 버튼을 눌러서 동작 지정 가능
[Log]: 콘솔에 로그를 남기
[Sound]: 시스템에 내장된 소리를 재생
[Shell Command]: 셀 명령 실행
[Debugger Command]: GDB 명령을 남김


* Watch Point

  - 변수의 값이 변경되는 경우를 감시하고자 하는 경우에 사용하는 기능. 이 포인트를 설정해두면 변수의 값이 변경되면 실행이 자동적으로 멈추게 된다
 
  - 디버거 창의 Variable 항목에서 선택할 수 있으며, 변수를 선택하고 마우스 오른쪽 메뉴를 눌러서 Watch Variable를 선택


* Instruments

  - 실행 중인 프로그램의 동작 상태를 감시하고 분석하는 데 사용되는 프로그램

  - 작업의 종류
1. Leaks: 메모리 누수 감지
2. Object Allocations - 객체의 생성과 해제를 감시
3. CPU Sampler – CPU 사용량 확인
4. Activity Monitor:  시스템 자원을 사용하는 상황을 감시 - 모든 프로그램 검사
5. Core Animation/OpenGL ES: 그래픽 성능 검사
6. System Usage: 프로그램의 I/O 작업을 감시


* 지역화(Localization)

  - 각 나라별로 서로 다르게 보이는 애플리케이션을 구현하고자 하는 경우 사용하는 것. 일반적으로 문자열의 변환이나 이미지의 변환 및 아이콘의 변화 등을 의미한다

  - 지역화 가능 요소: Nib 파일, 문자열, 아이콘 및 그래픽 요소, 소리 파일, Info.pList의 내용

  - 지역화 파일을 생성하는 방법 : GetInfo 메뉴에서 General – Make File Localizable 


* 문자열 지역화
 
  - 문자열을 지역화하기 위해서는 Localizable.strings 파일을 생성해서 이 파일을 먼저 지역화해준다

  - 각각의 지역화되어 있는 파일에서 “키값” = “ 실제데이터”; 로 지역화를 해주면 된다

  - 매칭되는 키 값이 없다면 있는 그대로 출력될 것이며 이를 사용할 때는 NSLocalizedString(@”키값”, @”보충설명”)형태로 사용해야 한다

  - 지역화 예제
1. Resource 디렉토리에  strings 파일을 생성(Localizable.strings) =>Mac OS X 의 Resource에 있다
2. Localizable.strings 파일을 선택하고 Info 버튼을 누르고 Make File Localizable을 누르고  Add Localization을 선택하고 Korean을 입력
3. Localizable.strings 아래의 English 파일에 입력
"Language" = "English";
"Greeting" = "Hello"; 
4. Localizable.strings 아래의 English 파일에 입력
"Language" = "한국어";
"Greeting" = "안녕하세요";


* xib 파일의 지역화

  - View-Based Application 프로젝트 생성

  - Resource 디렉토리에 그림 파일을 2개 생성

  -  ViewController.xib 파일을 선택하고 Info 아이콘을 클릭해서 General 탭에서 AddLocalization을 클릭, Korean을 추가

  - xib 아래에 2개의 언어가 보일 것이고 언어별로 다르게 디자인하면 된다


* 리소스 지역화(다른 리소스 사용)

  - Localizable.strings에 아래 문장 추가
"Image" = "Acrobat.png";
"Image" = "아크로뱃.png";

  - ViewController.h 파일에 변수 선언 및 프로퍼티 선언
@interface StringLocalizeViewController : UIViewController 
{
UILabel *label1;
UILabel *label2;
UIImageView * imgView;

}
@property(nonatomic, retain)IBOutlet UILabel *label1;
@property(nonatomic, retain)IBOutlet UILabel *label2;
@property(nonatomic, retain)IBOutlet UIImageView * imgView;
@end


* 오디오

  - 소리를 재생하는 방법은 2가지로 하나는 System Sound API를 이용하는 방법이 있고 AVAudioPlayer를 이용하는 방법이 있다

  - System Sound API를 이용하는 방법은 AIFF, WAV, CAF 파일만 재생이 가능

  - System Sound API를 이용해서 소리를 재생하기 위해서는 먼저 사운드를 시스템 소리 객체(SystemSoundID)로 만들어야 한다

  - 소리 객체 만들기: OSStatus AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSytemSoundID) 함수룰 호출해서 생성

  - 소리 재생: AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)를 호출하면 된다. 이 때 매개 변수로 kSystemSoundID_Vibrate를 대입하면 진동이 생긴다

  - 소리 객체 파기:OSStatus AudioServicesDisposeSystemSoundID(SystemSoundID *inSytemSoundID)를 호출하면 된다.
AudioToolbox.framework의 AudioToolbox.h에 메소드들이 정의되어 있음

  - 파일경로를 URL 형태로만 받기 때문에 NSString을 사용해서 선언해야 함. 멀티미디어 기능은 거의 대부분이 URL 형태로 사용하므로 반드시 알아 두어야 함

  - 아주 단순한 효과음만을 재생하는 기능이므로 단점과 제약이 많음
반복 불가능
음량 조절 불가능
재생 중에 중지 불가능
동시에 여러개 재생 불가능
확장자 제약이 심함



* AVAudioPlayer

  - 긴 소리 재생에 주로 이용하는 방법으로 아래와 SystemSoundAPI 에 비해서 아래와 같은 장점을 가지고 있습니다.
반복기능 제공
음량 조절 가능
중간에 재생을 중지 할 수 있음
동시에 여러 개의 음악을 재생할 수 있음
음악 파일의 확장자 제한이 일반적으로 없음

  -AVFoundation.framework에 존재하며 AVAudionPlayer.h 파일에 정의

  - 메소드
initWithContentsOfURL:(NSURL *)url error:(NSError **)error: 초기화
(BOOL)play : 재생
(void)pause: 중지
(void)stop: 재생 종료
BOOL Playing: 재생여부를 리턴하는 프로퍼티
NSURL *url: 소리 파일의 URL(readonly)
float volume: 소리 크기(0.0 - 1.0)
NSInteger numberOfLoops: 반복 재생 횟수
NSTimeInterval currentTime: 초기 재생 시간


Posted by windship
프로그래밍/Objective-C2010. 7. 22. 09:45
* 파일 처리

  - 아이폰에서 참조하게 되는 폴더들 : Application – Documents, Library, tmp, Caches, Preferences, Application.app

  - 위의 폴더들이 존재하지만 그 중 Documents 폴더만 우리가 사용할 수 있다

  - app는 번들 디렉토리이다. 실행 중에는 이 폴더의 내용을 변경할 수 없다

  - Library 폴더 안에는 다시 Caches와 Preference 폴더가 존재하며 Preference 폴더 안에 NSUserDefaults가 생성하는 .plist 파일이 존재한다

  - Preference는 ITunes에 의해 백업된다

  - Caches는 애플리케이션에 의존적이어야 하는 파일을 저장

  - tmp는 지속적으로 저장되지 않아도 되는 파일을 저장


* 특별한 용도의 파일

  - Default.png 파일은 애플리케이션이 로드될 때 자동으로 호출되는 그림 파일이다

  - 최상위 폴더에 넣어두면 자동으로 호출되어 출력된다 (주로 로딩시에 로고를 보여주는 용도로 사용됨)

  - 이 파일은 320x480 사이즈를 권장한다

  - ~~~info.plist 파일 역시 번들 정보를 저장하고 있는 특별 용도의 파일이다

  - 이 2개의 파일은 위치와 이름이 반드시 정해진 대로 되어 있어야 하며 바꿀 수 없다


* 파일에 읽기/쓰기

  - Documents 폴더의 경로 얻기
NSArray * 배열명 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *경로명 = [배열명 objectAtIndex:0];

  - 현재 프로젝트의 번들 경로 얻기
[[NSBundle mainBundle]bundlePath];

  - NSString, NSDictionary, NSData, NSArray, NSDate의 파일로부터 읽기와 쓰기
파일로부터 읽기
-(id)initWithContentsOfFile:(NSString *)path;
URL로 부터 읽기
-(id)initWithContentsOfURL:(NSURL*)url;
파일에 쓰기
-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag;
URL에 쓰기
-(BOOL)writeToFile:(NSURL *)url atomically:(BOOL)flag;


* 아카이브

  - 프로그램에서 사용되는 Object를 속성 값이나 관계를 포함에서 파일에 바이트 배열로 저장해 두는 것을 archive라고 한다

  - Object를 바이트 배열로 저장하는 것을 archive라고 하고 반대되는 작업을 unarchive라고 한 다

  - 객체를 archive하기 위해서는 NSCoding이라는 프로토콜을 따라야 한다 . 이 규칙을 따르게 되면 archive가 가능하고 NSString이나 NSDictionary 등은 이 프로토콜을 이미 적용해 두고 있다

  - NSArray나 NSDictionary 또는 NSData 등의 자료구조들은 description 메서드를 호출하면 데이터들을 propertyList로 만들어서 출력해준다. 이 때 문자열은 “”로 묶어주며 영문자와 숫자로만 구성된 경우 “”를 생략해도 된다

  - 데이터는 < >로 16진수로 묶어서 표현하게 된다

  - 저장되는 구조는 description을 확인하면 되고 파일에 저장되어 있는 경우에 읽어 올 수도 있다. 이 때 이 파일들은 XML 구조로 저장되며 수정이 불가능한 객체로 리턴되므로 주의해야 한 다


* 일반 클래스 아카이브

  - 일반 오브젝트를 아카이브 할 때는 NSCoding 프로토콜에 정의되어 있는 encodeWithCoder:와 initWithCoder: 메서드를 정의하면 된다

  - 메서드의 원형
-(void)encodeWithCoder:(NSCoder *)encoder
이 메서드의 안에서 encoder가 아카이브 할 실제 멤버들을 직접 인코딩하면 된다
-(id) initWithCoder:(NSCoder *)decoder
이 메서드의 안에서 decoder가 언아카이브 할 실제 멤버들을 직접 디코딩하면 된다

  - 기본 데이터 타입에 대한 인코드와 디코드 메서드
encodeBool:forKey   decodeBool:forKey
encodeInt:forKey  decodeInt:forKey
encodeInt32:forKey decodeInt32:forKey
encodeInt64:forKey decodeInt64:forKey
encodeFloat:forKey decodeFloat:forKey
encodeDouble:forKey decodeDouble:forKey


Posted by windship
프로그래밍/Objective-C2010. 7. 21. 11:15
* CustomCell을 사용한 테이블뷰의 셀 꾸미기 예제

  - Navigation-Based Application 프로젝트 생성

  - UITableViewCell로 부터 상속받는 클래스 생성(CustomCell). Objective-C Class로 해야한다.

  - CustomCell 클래스의 헤더 파일에 변수 및 프로퍼티 선언
#import <UIKit/UIKit.h>

@interface CustomCell : UITableViewCell 
{
// 레이블 2개, 이미지 뷰 1개를 가지는 셀을 만듬.
UILabel *lblName;
UILabel *lblInfo;
UIImageView *imageView;
}

// .을 이용하기 위한 프로퍼티 선언(외부와 연결할 것이므로 IBOutlet도 지정)
@property(nonatomic,retain)IBOutlet UILabel *lblName;
@property(nonatomic,retain)IBOutlet UILabel *lblInfo;
@property(nonatomic,retain)IBOutlet UIImageView *imageView;

@end

  - CustomCell 클래스의 구현 파일(.m 파일)에 synthesize 지정
@synthesize lblName;
@synthesize lblInfo;
@synthesize imageView;

  - CustomCell의 xib 파일 추가. Resources 우클릭 > Add File > User Interface > UIView

  - 추가된 CustomCell.xib 파일을 편집(인터페이스빌더). 기본으로 붙어있는 view를 제거하고 TableViewCell을 추가

  - TableViewCell의 인스펙터 창에 있는 속성 중 ClassIdentify 부분을 위에서 만든 CustomCell 클래스로 바꿔줌
 
  - CustomCell의 화면을 디자인(이미지 뷰와 레이블 등등...). 변수연결 작업(IBOutlet)

  - RootViewController.h 파일에 데이터 변수 선언
#import <UIKit/UIKit.h>

@class CustomCellAppDelegate;

@interface RootViewController : UITableViewController 
{
NSMutableArray * ar; // 테이블 뷰에 출력될 데이터 배열
CustomCellAppDelegate * app;
}

@property(nonatomic, retain) NSMutableArray * ar;

@end

  - RootViewController.m 파일에 헤더 파일 import 시키고 synthesize 지정
#import "RootViewController.h"
#import "CustomCell.h"; // 만들어진 Custom 클래스를 사용하기 위해서 import함
#import "CustomCellAppDelegate.h";

@implementation RootViewController

@synthesize ar;

  - RootViewController.m 파일의 viewDidLoad 에서 데이터 생성
-(void)viewDidLoad
{
[super viewDidLoad];
app = (CustomCellAppDelegate *) [[UIApplication sharedApplication]delegate];

// 딕셔너리는 항상 데이터(object)와 키가 함께 저장된다. 
        //아래 Name, imageName, Description 부분이 키이다. 
// 딕셔너리 내부의 데이터에 바로 접근할 수는 없고, 항상 그 딕셔너리의 키를 통해서 접근해야만 한다.
// -(id)ObjectForKey : (id)Key -> Key에 해당하는 Object 리턴
// -(NSArray *)allKeys -> 모든 key값을 리턴

NSDictionary *dic1 = [[NSDictionary alloc] initWithObjectsAndKeys:
@"아크로뱃", @"Name", @"Acrobat.png", @"imageName", @"문서 작성", @"Description", nil];
NSDictionary *dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:
@"AIM", @"Name", @"AIM.png", @"imageName", @"기본", @"Description", nil];
NSDictionary *dic3 = [[NSDictionary alloc] initWithObjectsAndKeys:
@"앱스토어", @"Name", @"AppStore.png", @"imageName", @"앱스토어", @"Description", nil];
NSDictionary *dic4 = [[NSDictionary alloc] initWithObjectsAndKeys:
@"계산기", @"Name", @"Calculator.png", @"imageName", @"계산기", @"Description", nil];

app.ar = [[NSMutableArray alloc] initWithObjects:dic1, dic2, dic3, dic4, nil];

[dic1 release];
[dic2 release];
[dic3 release];
[dic4 release];
}

  - RootViewController.m 파일에 데이터 출력
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [app.ar count];
}

// 셀을 만들어주는 메소드. indexPath는 row와 section을 멤버로 가져서 그것으로 그룹과 행을 구분한다.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell"; // 셀을 구분하기 위한 문자열을 생성
    
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier: CellIdentifier];
if (cell == nil) {
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
 // CustomCell의 xib파일에 있는 내용을 객체로 만들어달라고 요청하는 부분
cell = (CustomCell *)[nib objectAtIndex:0]; // 배열의 첫번째 객체를 CustomCell * 으로 
                                                               // 변경해서 cell에 대입
}
NSDictionary *Dic = [app.ar objectAtIndex:indexPath.row]; // ar 배열로부터 행번호에 해당하는 
                                                                          // 딕셔너리를 Dic에 대입
cell.lblName.text = [Dic objectForKey:@"Name"];
cell.lblInfo.text = [Dic objectForKey:@"Description"];
cell.imageView.image = [UIImage imageNamed:[Dic objectForKey:@"imageName"]];
return cell;
}

// 행의 높이를 만들어주는 메소드
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 80;
}


* 인덱스 테이블 예제

1. Navigation Based Application 프로젝트 생성

2. UITableViewController로 부터 상속받는 SubViewController 추가

3. RootViewController.h  파일에 변수 선언 및 프로퍼티 선언
#import <UIKit/UIKit.h>

@class SubViewController;

@interface RootViewController : UITableViewController 
{
NSMutableArray * data; // 실제 데이터를 저장하고 있을 배열
SubViewController * subView; // 서브 데이터를 출력해 줄 서브 뷰 컨트롤러
}

@property(nonatomic, retain) NSMutableArray * data;
@property(nonatomic, retain)SubViewController * subView;

@end

4. RootViewController.m  파일에 synthesize이용과 loadview에서 데이터 생성
#import "RootViewController.h"
#import "SubViewController.h"

@implementation RootViewController

@synthesize data;
@synthesize subView;

- (void)loadView 
{
[super loadView];
NSArray *KIA;
NSArray *SK;
NSArray *HD;
NSArray *LG;
KIA = [NSArray arrayWithObjects:@"윤석민", @"이용규", @"이종범", @"김연아", @"이동국", @"박지성", @"차범근", @"허정무", nil];
SK = [NSArray arrayWithObjects:@"김광현", @"김재현", @"고효준", @"정근우", @"나주환", nil];
HD = [NSArray arrayWithObjects:@"김시진", nil];
LG = [NSArray arrayWithObjects:@"이택근", @"이병규", @"봉중근", nil];
NSDictionary *Dic1, *Dic2, *Dic3, *Dic4;
Dic1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"KIA", @"Team", KIA, @"data", nil];
Dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"SK", @"Team", SK, @"data", nil];
Dic3 = [[NSDictionary alloc] initWithObjectsAndKeys:@"HD", @"Team", HD, @"data", nil];
Dic4 = [[NSDictionary alloc] initWithObjectsAndKeys:@"LG", @"Team", LG, @"data", nil];

self.data = [[NSArray alloc] initWithObjects:Dic1, Dic2, Dic3, Dic4, nil];

[Dic1 release];
[Dic2 release];
[Dic3 release];
[Dic4 release];
self.title = @"프로야구";
}

5. RootViewController.m  파일에 데이터를 출력하고 처리하는 메소드 작성
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    return [self.data count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    NSDictionary *Dic = [data objectAtIndex:indexPath.row];
cell.textLabel.text = [Dic objectForKey:@"Team"];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (subView == nil) 
{
SubViewController *temp= [[SubViewController alloc] initWithStyle:UITableViewStylePlain];
self.subView = temp;
[temp release];
}
self.subView.subData = [self.data objectAtIndex:indexPath.row];
[[self navigationController] pushViewController:subView animated:YES];
}

6. SubViewController.h  파일에 변수 생성과 프로퍼티 설정
#import <UIKit/UIKit.h>

@interface SubViewController : UITableViewController 
{
//루트로부터 데이터를 받을 변수
NSDictionary *subData;
//각 섹션에 해당하는 데이터
NSMutableArray *sectionData;
//인덱스 항목을 가지고 있을 변수
NSArray *index;
}

@property(nonatomic, retain)NSDictionary *subData;
@property(nonatomic, retain)NSMutableArray *sectionData;
@property(nonatomic, retain)NSArray *index;

//이름을 넘겨주면 자음을 리턴해주는 메서드
-(NSString *)subtract:(NSString *)data;
@end

7. SubViewController. m  파일에 synthesize지정과 loadView메서드 정의 
#import "SubViewController.h"

@implementation SubViewController

@synthesize subData;
@synthesize sectionData;
@synthesize index;

- (void)loadView {
[super loadView];
self.sectionData = [[NSMutableArray alloc] init];
self.index = [[NSArray alloc] initWithObjects:@"ㄱ", @"ㄴ", @"ㄷ", @"ㄹ", @"ㅁ", @"ㅂ", @"ㅅ", @"ㅇ", @"ㅈ", @"ㅊ", @"ㅋ", @"ㅌ", @"ㅍ", @"ㅎ", nil];
}

8. SubViewController. m  파일에 subtract메서드  정의
- (NSString *)subtract:(NSString*)data 
{
NSComparisonResult result = [data compare:@"나"];
if(result == NSOrderedAscending) 
return @"ㄱ";
result = [data compare:@"다"];
if(result == NSOrderedAscending) 
return @"ㄴ";
result = [data compare:@"라"];
if(result == NSOrderedAscending) 
return @"ㄷ";
result = [data compare:@"마"];
if(result == NSOrderedAscending) 
return @"ㄹ";
result = [data compare:@"바"];
if(result == NSOrderedAscending) 
return @"ㅁ";
result = [data compare:@"사"];
if(result == NSOrderedAscending) 
return @"ㅂ";
result = [data compare:@"아"];
if(result == NSOrderedAscending) 
return @"ㅅ";
result = [data compare:@"자"];
if(result == NSOrderedAscending) 
return @"ㅇ";
result = [data compare:@"차"];
if(result == NSOrderedAscending) 
return @"ㅈ";
result = [data compare:@"카"];
if(result == NSOrderedAscending) 
return @"ㅊ";
result = [data compare:@"타"];
if(result == NSOrderedAscending) 
return @"ㅋ";
result = [data compare:@"파"];
if(result == NSOrderedAscending) 
return @"ㅌ";
result = [data compare:@"하"];
if(result == NSOrderedAscending) 
return @"ㅍ";
return @"ㅎ";
}

9. SubViewController. m  파일에 viewWillAppear 메서드 재정의
- (void)viewWillAppear:(BOOL)animated 
{
[self.sectionData removeAllObjects];
NSMutableArray *temp[[self.index count]];
for(int i = 0; i < [self.index count]; i++)
{
temp[i] = [NSMutableArray arrayWithCapacity:100];
}
NSArray *name = [subData objectForKey:@"data"];
for(int i = 0; i < [self.index count]; i++)
{
NSString *pre = [self.index objectAtIndex:i];
for(int j = 0; j < [name count]; j++)
{
NSString *str = [name objectAtIndex:j];
if([pre isEqualToString:[self subtract:str]])
{
[temp[i] addObject:str];
}
}
}
for(int i = 0; i < [self.index count]; i++)
{
if([temp[i] count] != 0){
NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:[self.index objectAtIndex:i], @"section_name", temp[i], @"data", nil];
[self.sectionData addObject:data];
}
}
[self.tableView reloadData];
    self.title = [self.subData objectForKey:@"Team"];
[super viewWillAppear:animated];
}

10. SubViewController. m  파일에  섹션을 만드는 메서드 재정의
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
return [self.sectionData count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSDictionary *Dic = [self.sectionData objectAtIndex:section];
NSString *sectionName = [Dic objectForKey:@"section_name"];
return sectionName;
}

11. SubViewController. m  파일에  셀을 만드는 메서드 재정의
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    NSDictionary *Dic = [self.sectionData objectAtIndex:section];
NSMutableArray *ar = [Dic objectForKey:@"data"];
return [ar count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    static NSString *CellIdentifier = @"Cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    
    NSDictionary *Dic = [self.sectionData objectAtIndex:indexPath.section];
NSMutableArray *ar = [Dic objectForKey:@"data"];
cell.textLabel.text = [ar objectAtIndex:indexPath.row];
   
    return cell;
}

12. SubViewController. m  파일에  인덱스를 만드는 메서드 재정의
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return self.index;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
for(int i = 0; i < [self.sectionData count]; i++)
{
NSDictionary *Dic = [self.sectionData objectAtIndex:i];
NSString *sectionName = [Dic objectForKey:@"section_name"];
if([sectionName isEqualToString:title])
{
return i;
}
}
return -1;
}






Posted by windship
프로그래밍/Objective-C2010. 7. 20. 10:56

KT앱 대회 준비하면서 모은 자료들을 정리해서 올립니다.
거의 맥부기 카페 자료들이 대부분인데 한곳에 모아서 찾아보기 쉬우라고 올려봅니다.

-푸쉬  서버  개발  관련 자료-
이지 APNS 오픈 소스 라이브러리
http://www.easyapns.com/
구글 코드 APNS 오픈 소스
http://code.google.com/p/apns-php/
서버 튜토리얼
http://blog.boxedice.com/2009/07/10/how-to-build-an-apple-push-notification-provider-server-tutorial/


-label이나 textView에 현재 시간을 표시하고 싶습니다-
NSDate *t = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
NSString *timeStr = [formatter setDateFormat:@"HH:mm:ss"];
myLabel.text = timeStr;
...
[textView scrollRangeToVisible:NSMakeRange([textView.text length]-1, 1)];


-시뮬레이터 포토 라이브러리 자신의 이미지 추가 방법-
UIImage * sShot = [UIImage imageNamed:@"imageName.jpg"];
UIImageWriteToSavedPhotosAlbum(sShot, nil, nil, nil);


-네이게이션바 스타일 바꾸기-
http://cafe.naver.com/mcbugi/1241


-이미지 자르기 함수를 소개합니다. (UIImage)-

- (UIImage*)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
{
CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
UIImage *cropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return cropped;
}
http://www.hive05.com/2008/11/crop-an-image-using-the-iphone-sdk/


-HTTP 라이브러리-
http://allseeing-i.com/ASIHTTPRequest/How-to-use


-json 관련-
라이브러리 http://code.google.com/p/json-framework/
json 투토리얼 http://iphonedevelopertips.com/networking/iphone-json-flickr-tutorial-part-1.html


-알럿 템플렛-
self.myAlertView = [ [UIAlertViewalloc]
initWithTitle:@"알림"
message:@"이메일을입력해주세요"
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"확인", nil];
self.myAlertView.delegate = self;
[self.myAlertViewshow];


-푸쉬서버 구현을 위한 서버 인증서 pem 만들기-
애플 개발자 센터 apps ID 추가 (이때 와일드카드(*)는 사용하면 안됨)
키체인에서 개인 인증서 하나 만들어 애플 개발 센터에 등록
애플 개발센터에서 cert파일을 다운받아서 키체인으로 추가

키체인에서 내보내기로 p12파일로 저장

커맨드에서  p12파일을 pem파일로 변환
openssl pkcs12 -in quizers_dev_cert.p12 -out quizers_dev_cert.pem -nodes -clcerts


-전역변수를 사용해 보자...-
http://cafe.naver.com/mcbugi/55643


-JSON 2중 뎁스 이상 키 접근하기-
NSDictionary*feed =[self downloadPublicJaikuFeed];
// get the array of "stream" from the feed and cast to NSArrayNSArray*streams =(NSArray*)[feed valueForKey:@"stream"];
// loop over all the stream objects and print their titlesint ndx;
NSDictionary*stream;
for(ndx =0; ndx &lt; stream.count; ndx++){
        NSDictionary*stream =(NSDictionary*)[streams objectAtIndex:ndx];
        NSLog(@"This is the title of a stream: %@", [stream valueForKey:@"title"]); 
}


-배열 NSArray-
초기 데이터로 생성
NSArray *array = [[NSArray alloc] initWithobjects:추가할 객체들.. , nil];
 스트링으로 생성
NSArray *joins =(NSArray*)[result objectForKey:@"joins"];
길이 구하기
NSLog(@"Array size : %d " , sizeof(BUILDING_DATA) / sizeof(BUILDING_DATA[0]));


-NSString 클래스를 이용하여 문자을 넣자니 유니코드를 받아 초기화-
-(NSUInteger) UnicharLength:(const unichar*)str
{
unichar* pStr = (unichar*)str;
for( ; pStr[0] != nil ; pStr++ );
return (NSUInteger)(pStr - str);
}
[[NSString alloc] initWithCharacters:(원본문자열) length:[self UnicharLength:(원본문자열)]];


-랜덤 출력-
srandom(time(NULL));
value = random() % 100;
위처럼 하시면 0~99사이의 한수를 리턴합니다.
srandom(time(NULL)); 는 첨에 한번만 해주시면 됩니다.


-Code Sign error: Provisioning profile이 맞지 않을 때 변경 방법-
여러 장비에서 작업을 하거나 여러 프로젝트를 진행 중에 변경된 Provisioning profile이 적용되지 않아 Debug를 할 때 ”Code Sign error: Provisioning profile ‘3E6AA725-6534-46F8-B9CE-D19AC9FD854B’ can’t be found” 이런 오류가 발생하는 경우가 있는데요. 이럴 때 현재 사용중인 Provisioning Profiles로 프로젝트 세팅을 변경해주는 방법을 소개한 글(원문)이 있어서 공유합니다.

1. 실행중인 Xcode Project를 닫습니다.
2. Finder에서 프로젝트 폴더로 이동합니다.
3. 프로젝트 .xcodeproj 파일 선택하고 마우스 오르쪽 키를 눌러 '패키지 내용 보기'를 선택합니다.
4. 패키지 내용 보기를 통해 패키지 안에 있는 project.pbxproj 파일을 Xcode로 불러옵니다.
5. 검색을 통해 PROVISIONING_PROFILE 부분을 찾아 변경된 Provisioning profile 로 변경해줍니다.
6. 현재 Provisioning profile을 확인하려면 Organizer 창을 열어보면 알 수 있습니다.
7. Window > Organizer로 Organizer 창을 열고 왼쪽에 IPHONE DEVELOPMENT > Provisioning Profiles로 이동합니다.
8. 오른쪽에 있는 Profile Identifier를 복사해서 변경해주면됩니다.
9. 변경이 끝나면 project.pbxproj 저장하고 프로젝트를 열어 테스트합니다.


-아이폰 웹개발에서 디바이스 아이디 가져올수있나요?-
[[UIDevice currentDevice] uniqueIdentifier];



-Accessing Objects in a NSArray-
To access an object in an NSArray, you use the -objectAtIndex: method, as in the following example:NSArray *numbers;
NSString *string;

numbers = [NSArray arrayWithObjects: @"One", @"Two", @"Three", 
                                     nil];
string = [numbers objectAtIndex: 2];   // @"Three"

Of course, you have to be careful not to ask for an object at an index which is negative or bigger than the size of the array; if you do, an NSRangeException is raised (we'll learn more about exceptions in another tutorial).
To get the length of an array, you use the method -count, as in:
NSArray *numbers;
int i;

numbers = [NSArray arrayWithObjects: @"One", @"Two", @"Three", 
                                     nil];
i = [numbers count];   // 3


-상태바 제어-
안 보이게
[UIApplication sharedApplication].statusBarHidden = NO;

스타일
UIApplication *myApp = [UIApplication sharedApplication];
[myApp setStatusBarStyle:UIStatusBarStyleBlackOpaque];


-메모리 오버되어서 어플이 죽는 경우에 호출되는 이벤트??-

뷰컨트롤러 베이스로 작업을 한다면

- (void)didReceiveMemoryWarning

함수로 메모리가 위험할시에 위 함수를 핸들링하니 내부에 관련 대응할 처리를 구현해주면 됩니다.



-D-Day 구하기-
NSDate* date  = [NSDatedateWithNaturalLanguageString:@"2010-06-30"];
NSDate* d_day = [NSDatedateWithNaturalLanguageString:@"2010-12-31"];

NSDateComponents *dcom = [[NSCalendar currentCalendar]components: NSDayCalendarUnit
fromDate:date  
  toDate:d_day  
  options:0];

NSLog(@"day=%d",   [dcom day]);   // 184


-라디오 버튼이나 체크박스등을 찾지를 못하고  있는데-
Interface Builder 에서 library를 보시면 segmented control, switch가 보일겁니다.
말씀하시는 라디오버튼이나 체크박스는 없지만  
라디오버튼은 segmented control로 대체, 체크박스는 switch 로 대체하셔서 사용하시면 될듯합니다.


-책장 넘기기 효과-
UIView 를 하나 만들고 그 안에 UIImageView 를 만들었습니다.
이제 이미지뷰어의 내용을 채울때 책장을 넘기듯이 넘기는 방법입니다.

[UIView baginAnimations:@"stalker" context:nil]; <- stalker 는 UIView 의 이름입니다
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:stalker cache:YES];
[UIView setAnimationDuration:1.0];
imageView.image = [UIImage imageNAmed:이미지파일명];
[UIView commitAnimations];

이 걸 터치 이벤트나 이런곳에 삽입하면
책장을 넘기듯이 이미지의 전환이 일어납니다. 


-image를 fade out 효과-
[UIView beginAnimations:nil context:NULL];
[imageView setAlpha:0.0];
[UIView commitAnimations]; 


-UIView Animation 중복방지-
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
....
[UIView setAnimationDelegate:self]; 
[UIView setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
        [UIView commitAnimations];

이런 식으로 에니메이션을 만들었는데 간단하게 UIImageView를 한점에서 다른 한점으로 이동시킵니다.
근데 그래서 에니매이션이 끝나면 다시 또다른 다른 두 좌표로 해서 위의 코드가 실행되서 계속해서 UIImageView를 움직이게 하고 있습니다.

근데 질문은 1. setAnimationDidStopSelector 에서 에니매이션이 끝난것을 알기전에 강제로 에니메이션을 멈출수 있나요?
2. 제 경우에는 어떤 경우에 위 코드가 setAnimationDidStopSelector 가 호출되었을때 만 실행되는 것이 아니라 다른 부분에서도 호출하기도 합니다.  근데 문제는 동시에 위 코드가 중복되어서 호출되면 이상하게 작동해요.  그래서 꼭 위 코드를 실행(에니매이션을 commit 하기전에는 반드시 에니메이션을 강제로 멈추던지 아니면 다른 체크를 해야 할것 같은데.....  

혹시 방법이 있으면 부탁드립니다.

꾸벅~

답글 : 
[UIView setAnimationsEnabled:NO];
// 에니메이션을 종료 합니다. 


-일정시간 딜레이 후 함수 호출-
[self performSelector:@selector(playerStop) withObject:nil afterDelay :1.0f];

-(void) playerStop 
{
}


-개발 완료, 베타 테스팅용 Ad Hoc 배포-
http://cafe.naver.com/mcbugi/9042


-테이블뷰에 원격이미지를 넣을경우 스크롤이 느려지는 현상-
LazyTableImages 샘플http://developer.apple.com/iphone/library/samplecode/LazyTableImages/Introduction/Intro.html#//apple_ref/doc/uid/DTS40009394
AsyncImageView 클래스 http://www.markj.net/iphone-asynchronous-table-image/


-테이블 뷰 섹션별로 이름 주기-
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
if( section == 0 ) {
return@"발행한퀴즈";
} elseif( section == 1 ) {
return@"참여한퀴즈";
} else {
return@"진행중인퀴즈";
}
}


-정사각형으로 사진을 CROP 하고, 썸네일 크기에 맞게 리사이즈-
먼저, 출처는 다음 기사입니다.
http://tharindufit.wordpress.com/2010/04/19/how-to-create-iphone-photos-like-thumbs-in-an-iphone-app/ 
 
iPhone 사진앨범의 특징은 가로나 세로가 긴 이미지라 할지라도,
정사각형으로 사진을 CROP 하고, 썸네일 크기에 맞게 리사이즈 시킵니다.
 
위의 기사의 내용을 나름대로 보기 편하게(?) 수정을 했습니다.
 
함수명 - makeThumbnailImage
파라미터 - 원본 이미지, 리사이즈없이 CROP만 할지 여부, 리사이즈할 정사각형 한변의 길이
리턴값 - CROP 및 리사이즈된 이미지
 
- (UIImage*) makeThumbnailImage:(UIImage*)image onlyCrop:(BOOL)bOnlyCrop Size:(float)size
{
 CGRect rcCrop;
 if (image.size.width == image.size.height)
 {
  rcCrop = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
 }
 else if (image.size.width > image.size.height)
 {
  int xGap = (image.size.width - image.size.height)/2;
  rcCrop = CGRectMake(xGap, 0.0, image.size.height, image.size.height);
 }
 else
 {
  int yGap = (image.size.height - image.size.width)/2;
  rcCrop = CGRectMake(0.0, yGap, image.size.width, image.size.width);
 }
 
 CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rcCrop);
 UIImage* cropImage = [UIImage imageWithCGImage:imageRef];
 CGImageRelease(imageRef);
 if (bOnlyCrop) return cropImage;
 
 NSData* dataCrop = UIImagePNGRepresentation(cropImage);
 UIImage* imgResize = [[UIImage alloc] initWithData:dataCrop];
 
 UIGraphicsBeginImageContext(CGSizeMake(size,size));
 [imgResize drawInRect:CGRectMake(0.0f, 0.0f, size, size)];
 UIImage* imgThumb = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 [imgResize release];
 return imgThumb;
}

위 소스를 참고하시면, 이미지를 CROP 하는 방법이나, 이미지를 RESIZE 하는 방법을 참고하실수 있을겁니다.
 
사족을 붙이자면, 왜 Resize 할지 여부를 따로 분리 시킨 이유는 실제로 사용을 해보면 Resize 루틴에서
많은 CPU 부하가 걸립니다. 그래서 UIImageView 에  contentMode를 UIViewContentModeScaleAspectFit 로 설정해서
자체적으로 리사이즈를 하게 하는 방법이 비동기적으로 괜찮습니다. (물론.. 실제 Resize된 이미지가 아니므로 메모리적인 소비는 있습니다.)
 
많은 도움 되셨으면 좋겠네요 ^^


-사진찍을때  아래에서  올라오는  메뉴 UIActionSheet-
http://ykyuen.wordpress.com/2010/04/14/iphone-uiactionsheet-example/


-uibutton disable-
http://www.iphonedevsdk.com/forum/iphone-sdk-development/2499-uibutton-disable.html


-이미지  슬라이드  샘플-
http://lievendekeyser.net/index.php?module=messagebox&action=message&msg_id=1351


-커버플로우  라이브러리-
http://apparentlogic.com/openflow/


-Xcode3.2.3과 SDK4로 업그레이드 후, 기존 앱 업그레이드 하는 법-
XCode3.2.3 과 SDK4로 버전업한 후, 기존 앱을 업그레이드 할 때 간단한 Tip 입니다.
1. XCode3.2.3과 SDK4로 업그레이드 한다. 별도로 기존 XCode 3.1 버전을 따로 보관할 필요가 없습니다.
2. 기존 앱을 새 XCode3.2.3에서 연다.
3.Group & Files를 right click -> Get Info 후
  3-1.General Tab 에서
Project Format 을 Xcode 3.2-compatible 로 바꾼다.
 3-2.Build Tab 에서
 Base SDK를 iPhone Device 4.0(배포시), 혹은 iPhone Simulator 4.0(테스트시) 로 바꾼다
 iPhone OS Deployment Target 을 iPhone OS 3.0 (즉 지원하고자 하는 하위버전으로) 로 바꾼다.
이렇게 하시면 됩니다.


-객체 타입 비교-
if ( [a isKindOfClass:b] )


-문자열 비교-
NSString *strText = idField.text;
if([srText isEqualToString:@"mihr01"])
....
else if([srText isEqualToString:@"mihr02"])
....
else
...
이렇게 하셔도 되고요 완전 같은 스트링이 아니라
 
포함된것을 찾으려면
if([strText rangeOfString:@"mihr01"].length) 


-탭뷰에 스타일시트를 붙일때-
UIActionSheet *popupQuery = [[UIActionSheetalloc]
initWithTitle:nildelegate:self
cancelButtonTitle:@"취소"
destructiveButtonTitle:nil
otherButtonTitles:@"사진찍기", @"기존의사진선택", nil];
popupQuery.actionSheetStyle = UIActionSheetStyleBlackOpaque;
QuizersAppDelegate *appDelegate = (QuizersAppDelegate *)[[UIApplicationsharedApplication] delegate];
[popupQuery showInView:appDelegate.window];


-스크롤  밀어서  데이터  리플래쉬  하기-
소스코드
http://github.com/facebook/three20/tree/master/samples/TTTwitter/
설명
http://www.drobnik.com/touch/2009/12/how-to-make-a-pull-to-reload-tableview-just-like-tweetie-2/


-테이블뷰 위에 검색창 붙이는 방법-
테이블뷰 위에 검색창 넣으신 후에, viewDidLoad 메서드 부분에 [table setContentOffset:CGPointMake(0.0, 44.0) animated:NO];해주시면 처음 보여질 때는 검색창이 안 보이다가 밑으로 땡기면 나타나게 됩니다.


-네트워크  연결  됐는지  확인 Reachability-
http://www.raddonline.com/blogs/geek-journal/iphone-sdk-testing-network-reachability/
http://theeye.pe.kr/entry/how-to-check-network-connection-on-iphone-sdk



-아이폰 강제종료 버튼 이벤트-
아래 메소드가 어플이 종료될 때 수행되는 함수입니다.
종료될 때에 각종 리소스들을 Free시킬 경우에 사용됩니다.
참고하시면 될 듯 합니다~
 - (void)applicationWillTerminate:(UIApplication  *)application



-크랙 방지 클래스-
http://cafe.naver.com/mcbugi/11661



-어플을 강제 종료하는 API 는 아이폰에서 제공하지 않는다?-
http://cafe.naver.com/mcbugi/11803



-탭바 클릭시 바로 UISearchBar 클릭되도록 할려면 어떻게 해야 하나요?-
UISearchBar가 first responder가 되게 하면 됩니다.
[searchBarObj becomeFirstResponder];



-UITextField 입력값 체크하기 : 문자열 길이, 숫자여부 체크-

헤더(.h)에 UITextFieldDelegate 선언

@interface 클 래스명 : UIViewController <UITextFieldDelegate>



구현부(.m)에 다음 메쏘드를 구현하면 됨

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

//return NO하면 입력이 취소됨
//return YES하면 입력이 허락됨
//textField 이용해서 어느 텍스트필드인지 구분 가능

//최대길이

int maxLength = 128;

NSString *candidateString;

NSNumber *candidateNumber;


//입력 들어온 값을 담아둔다

candidateString = [textField.text stringByReplacingCharactersInRange:rangewithString:string];


if(textField == IDField) {
maxLength = 8;
} else if(textField == AgeField) {
//숫자여부 점검

//length가 0보다 클 경우만 체크
//0인 경우는 백스페이스의 경우이므로 체크하지 않아야 한다

if ([string length] > 0) {

//numberFormatter는 자주 사용할 예정이므로 아래 코드를 이용해서 생성해둬야함

//numberFormatter = [[NSNumberFormatter allocinit];

//[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];


//numberFormatter 를 이용해서 NSNumber로 변환

candidateNumber = [numberFormatter numberFromString:candidateString];


//nil이면 숫자가 아니므로 NO 리턴해서 입력취소

if(candidateNumber == nil) {

return NO;

}


//원 래 문자열과 숫자로 변환한 후의 값이 문자열 비교시 다르면

//숫자가 아닌 부분이 섞여있다는 의미임

if ([[candidateNumber stringValuecompare:candidateString] != NSOrderedSame) {

return NO;

}


maxLength = 2;

}

}

//길이 초과 점검

if ([candidateString length] > maxLength) {

return NO;

}


return YES;

}

http://cafe.naver.com/mcbugi/37651



-How to split string into substrings on iPhone?-
http://stackoverflow.com/questions/594076/how-to-split-string-into-substrings-on-iphone



-메모리 누수-
http://cafe.naver.com/mcbugi/64257


-디바이스 가로 세로 상태-
UIDeviceOrientationIsLandscape([UIDevicecurrentDevice].orientation) ?


-UITextField 에 자동 포커스 주기-
키보드 올리면서 커서를 넣을때는 아래방법을 이용하시면 됩니다.
[textField becomeFirstResponder]; 
참고로 이건 커서를 빼면서 키보드를 내리실때 사용하시면 되구요...
[textField resignFirstResponder]; 


-홈버튼이 눌렸을 때도 텍스트뷰 내용을 저장하려면 어떻게 해야할까요?-
- (void)applicationWillTerminate:(UIApplication *)application / Application Delegate 메서드 부분에 구현하시면 되지않을가요? 


-3.2 4.0  동영상  플레이-
http://iphonedevelopertips.com/video/getting-mpmovieplayercontroller-to-cooperate-with-ios4-3-2-ipad-and-earlier-versions-of-iphone-sdk.html


-한글완성형(EUC-KR)을 iPhone/Mac에서 사용할 수 있는 언어셋으로 변환하기-
http://blog.backpackholic.tv/160


-인터페이스 함수들을 편하게 가져오는 방법-
http://code.google.com/p/xcode-auto-assistant/


-#pragma mark로 코드 쉽게 구분하기-
http://cafe.naver.com/mcbugi/64408


-os4에서 applicationWillTerminate가 안먹어서 알게된것-
os4에서 applicationWillTerminate: 가 안먹어서 삽질하다가 알아낸 결과입니다.
뒷북 인지는 모르지만 혹시 모르시는 분을 위해서 적어봅니다.
os3.x 에서는 홈버튼을 한번만 누르면 applicationWillTerminate 가 아주 잘 호출됩니다.
하지만 os4 에서는 홈버튼을 한번만 누르면 
applicationDidEnterBackground 가 호출됩니다.
os4 에서 멀티태스킹을 위해서 좀 바뀌었습니다.
os4에서도 홈버튼 한번 누를때 applicationWillTerminate 가 호출되게 하려면
info.plist 에서 'Application does not run in background' 이 속성을 추가해주면 됩니다.
위 속성이 없으면 기본적으로 멀티태스킹이 되는걸로 간주합니다. (진짜 멀티태스킹은 아니지만)
위 속성이 없을때 호출되는 메소드를 실험해 봤습니다.
-----------------------------------------------------------------
처음 어플을 실행시키면
     didFinishLaunchingWithOptions, 
applicationDidBecomeActive 
이 호출되고
홈버 튼을 한번 만 누르면
applicationWillResignActive, 
applicationDidEnterBackground
호출되면서 어플이 종료되고
이상태에서 다시 어플을 실행시키면
applicationWillEnterForeground, 
applicationDidBecomeActive 
호출됩니다.
홈버튼을 두번 누르면
applicationWillResignActive
이 호출됩니다.
----------------------------------------------------------------
'Application does not run in background' 을 체크하면
홈버 튼을 한번만 누르면 applicationWillTerminate 를 호출합니다.
'근데 속성 체크 안했을때 applicationWillTerminate 는 호출이 안되는건지 궁금하네요.
아시는 분 좀 알려주세요.

답글 : 
Applicationwillterminate함수 대신에 applicationDidENterBAckground 사용하라고하네여 이곳에서 공유자원해제나 사용자데이타 저장,타이머 무효화,어플상태정보등 저장을 하라고 합니다. http://cafe.naver.com/mcbugi/65497


-COCOS2D 번개 효과-
http://www.cocos2d-iphone.org/forum/topic/370


-iPhone 4.0 호환 키보드에 버튼 or 뷰 붙이기-
기존꺼에 비해 약간 수정되 었을뿐입니다....
하지만 -_-이거 찾느라 ㅠㅠ;; 

3.1.x에서는 windows 서브뷰에 항상 키보드 뷰가 있었지만 ...
4.0 부터는 windows 에 항상 있는게 아니고, 키보드를 불렀을때 -_- 붙어서 오더라고요.. 그래서

Done 버튼 붙이는 예제 입니다. (Number 패드에)

아래 액션을 Text필드의 BeginTouched 에 연결 시킵니다.
 // 키보드가 나왔을때랑 사라질때의 이벤트를 잡아냅니다.
//3.1.X 에서는 UIKeyboardWillShowNotification 으로 잡지만
// 4.0 때문에 --; DidShow로 잡아줬습니다.
//그래야 윈도우에 키보드가 있더라고요 ;;;
-(IBAction)FieldTouched{
    
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardDidShowNotification
                                               object:nil];
    
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillHide:) 
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
    
    
}

// 키보드가 나왔을때 Done 버튼 붙여주기 
- (void)keyboardWillShow:(NSNotification *)note {  
    
    UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
    doneButton.frame = CGRectMake(0, 163, 106, 53);
    doneButton.adjustsImageWhenHighlighted = NO;
    [doneButton setImage:[UIImage imageNamed:@"DoneUp.png"] forState:UIControlStateNormal];
    [doneButton setImage:[UIImage imageNamed:@"DoneDown.png"] forState:UIControlStateHighlighted];
    [doneButton addTarget:self action:@selector(backgroundTap:) forControlEvents:UIControlEventTouchUpInside];

    //3.1.x 와 4.0 호환 키보드 붙이기
    for( UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows] ){
        for( UIView *keyboard in [keyboardWindow subviews] ){
            NSString *desc = [keyboard description];
            if( [desc hasPrefix:@"<UIKeyboard"]==YES ||
               [desc hasPrefix:@"<UIPeripheralHostView"] == YES ||
               [desc hasPrefix:@"<UISnap"] == YES )
            {
                [keyboard addSubview:doneButton];
            }
        }
    }
    
}

// 키보드가 없어질때 Done 버튼을 삭제 합니다.
- (void)keyboardWillHide:(NSNotification *)note {  
    
    for( UIWindow *keyboardWindow in [[UIApplication sharedApplication] windows] ){
        for( UIView *keyboard in [keyboardWindow subviews] ){
            NSString *desc = [keyboard description];
            if( [desc hasPrefix:@"<UIKeyboard"]==YES ||
               [desc hasPrefix:@"<UIPeripheralHostView"] == YES ||
               [desc hasPrefix:@"<UISnap"] == YES )
            {
                for(UIView *subview in [keyboard subviews])
                {
                    [subview removeFromSuperview];
                }
                
            }
        }
    }
}

도 움 되시길 바랍니다 ;)
http://cafe.naver.com/mcbugi/62349


-배열내 숫자 값 비교해서 정렬하기-
만약에 객체내의 인스턴스를 키로 정렬할 경우에는 NSSortDescriptor 를
쓰시면 됩니다.
아래는 name으로 정렬한 예입니다.

@interface Test :
NSObject {
NSString *name;
double distance;
}
@property
(nonatomic, retain) NSString *name;
@property double
distance;
@end

@implementation Test
@synthesize name, distance;
@end


아 래는 사용방법입니다.
       Test *t1 = [[Test alloc] init];
Test *t2 = [[Test alloc] init];
Test *t3 = [[Test alloc] init];
[t1 setName:@"마바사"];
[t2 setName:@"아자차"];
[t3 setName:@"가나다"];
[t1 setDistance:1.2];
[t2 setDistance:2.5];
[t3 setDistance:0.5];
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:t1];
[array addObject:t2];
[array addObject:t3];
[t1 release];
[t2 release];
[t3 release];
// 이름순으로 정렬
NSSortDescriptor *nameSort = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(localizedCompare:)];
[array sortUsingDescriptors:[NSArray arrayWithObjects:nameSort, nil]];
[nameSort release];
for(Test *t in array) {
NSLog(@"%@ %f", [t name], [t distance]);
}
[array removeAllObjects];


------[결 과]------
2010-07-12 17:46:13.117 Sort[5070:20b] 가나다 0.500000
2010-07-12 17:46:13.125 Sort[5070:20b] 마바사 1.200000
2010-07-12 17:46:13.130 Sort[5070:20b] 아자차 2.500000


p.s. distance로 정렬하고자 한다면 
NSSortDescriptor *distanceSort = [[NSSortDescriptor alloc] initWithKey:@"distance" ascending:YES];
nameSort 대신 distanceSort를 넣으시면 됩니다.
http://cafe.naver.com/mcbugi/65873


-[TIP] 시뮬레이터 사진앨범에 사진넣기-
1) 시뮬레이터를 실행시킵니다.

2) 맥에서 포토라이브러리에 넣을 사진을 시뮬레이터로 Drag&Drop 합니다.

3) 그러면, 사파리가 열리면서 Drag한 이미지가 표시가 될겁니다.

4) 그 표시된 이미지를 마우스로 꾸~~~~~~욱 눌러줍니다.

5) 그러면, 메뉴가 뜨면서 이미지를 저장할건지 복사할건지를 묻습니다.

6) 이미지 저장을 누릅니다.

7) 이제 시뮬레이터의 사진앨범에 가 보시면 아까 저장한 사진이 들어가있을겁니다.


---


출처 : http://cafe.naver.com/mcbugi/67700

Posted by windship
프로그래밍/Objective-C2010. 7. 20. 10:53

코드가 길어질 수록 원하는 메소드를 찾아가기가 함든 경우가 많습니다.
이럴때 #pragma mark를 이용해서 코드를 쉽게 구분하고 찾아갈 수 있습니다.

 

예를 보겠습니다.

이 소스는 ADC에서 받은 Touches라는 프로젝트입니다.

 

젤 위에 세줄을 보시면  #pragma mark를 사용한걸 볼 수 있습니다.

 

Navigation Bar를 보시면 이것의 용도를 알 수 있습니다.

 

 

Navigation Bar에서 ===Animating subviews=== 라는 항목으로 구분되어서 두개의 메소드가 표시되는 걸 볼 수 있습니다.

즉 ...

#pragma mark - 는 구분용 실선

#pragma mark ===Animating subviews=== 는 항목명 출력

#pragma mark   는 그냥 빈 공간용 입니다.

 

 

좀 더 이해하기 쉽게 세줄을 주석처리 해보면

 

이렇게 몽땅 붙어서 나오게 되죠.

 

#pragma mark를 써서 코딩할때 관련된 메소드들을 잘 모아서 묶어둔다면 훨씬 보기 좋고 관리하기 좋을 것 같습니다.

전 아직 이렇게 긴 코드를 짤 수준까진 안되지만 지금부터 습관을 들여야 될 것 같네요 ^^

 

 

참고로 #pragma mark - 뒤에 공백을 넣으면 안됩니다.

 

 

공백이 들어가게 되면 위와 같이 됩니다.

그리고 Preferences... > Code Sense의 Sort list alphabetically  항목이 체크되어 있으면  Navitation Bar에서 알파벳 순으로

메소드들을 정렬해서 보여줍니다. 위의 기능을 사용하고 싶으시면 이 항목을 체크하지 마세요. 디폴트는 체크되어있지 않습니다.

 

#pragma mark가 무슨 용도인지 찾아보다가 알게되었네요.

도움이 되셨으면 합니다~ ^^


---


출처 : http://cafe.naver.com/mcbugi/64408

Posted by windship
iPhone 개발절차/준비2010. 7. 20. 10:49

이번에는 Xcode에 개발자 프로파일을 추가한다.

Xcode는 애플의 개발환경이며, Apple Iphone SDK를 설치하면 자동으로 함께 설치된다.
실행하기 위해서는 데스크탑(바탕화면)의 자신의 하드디스크 (예: Macintosh HD)에 Developer > Applications 디렉토리에 위치한 Xcode를 실행시키면 된다.
 
1. Xcode를 실행한다. 

2. 처음 실행하면 위와 같은 화면이 뜨는데, 여기서 보지 말고 메뉴의 Window > Organizer 를 실행시킨다.

 

3. 개발용으로 사용할 아이팟터치(아이폰)을 연결시킨다.  
연결시키면 다음과 같이 인식을 하게 되는데, "Use for Development"를 클릭하면 "Organizer"에 개발용 기기로 등록된다. 

4. 다음과 같이 등록되었으면, "Identifider"에 씌여있는 40자리 문자를 복사한다.

5. 다시 "Program Portal"로 돌아가서 좌측 메뉴의 "Devices"를 선택하고, 상단의 "Add Device"를 클릭하여 자신의 기기를 등록한다. 

6. "Device Name"은 원하는대로 적고, "Device ID"는 방금 복사했던 "Identifier" 값을 붙여넣기 한다. 
그리고 "+"를 눌러 추가하고 "Submit"버튼을 클릭하면 기기가 등록된다.

7. 좌측 메뉴의 "App IDs"를 클릭하고, 오른쪽의 "Add ID"를 클릭하여 ID를 등록한다.

8. "Apple ID Name"과 "App ID"를 등록한다. 개발자용이므로 아무거나 적어도 된다. 역시나 "+"와 "Submit"버튼을 클릭하여 추가한다.

9. 좌측 메뉴의 "Provisioning"으로 가서 "Add Profile"을 클릭하여 프로파일을 생성한다. (Development탭에서 진행한다.)

10. "Profile Name"을 자신이 원하는대로 적고 "Cetificates", "App ID", "Devices"를 자신이 등록했던 대로 선택하고, "Submit"버튼을 눌러 프로파일을 생성한다.

11. "Action"에 "Download"버튼을 클릭하여 프로파일 파일을 다운로드 받는다. "Download"버튼이 생기기 까지 시간이 좀 걸릴 수 있으므로 "Download"버튼이 없으면, 새로고침을 한다.

12. "Xcode"의 "Organizer"로 돌아와서, 방금 다운로드 받은 프로파일 파일을 "PROVISIONING PROFILES"에 끌어다 놓는다. 그럼 아래처럼 프로파일이 등록될 것이다.

이로써 기기연결을 위한 모든 준비를 마쳤다.  


---

출처 : http://k2man.com/1561

Posted by windship
iPhone 개발절차/준비2010. 7. 20. 10:48

이제 내 맥과 아이폰 개발자 홈페이지 간에 인증 과정을 거쳐야 합니다.

이 과정을 제대로 해야 기기 연결을 제대로 할 수 있습니다.

1. "Program Portal"에 들어 갑니다. 

"애플 아이폰 개발자 홈페이지"에서 상단 오른쪽에 있는 아래 링크를 이용하시면 됩니다.

 

아래와 같은 화면이 뜰겁니다. 여기서 왼쪽에 있는 메뉴를 주로 이용합니다.

 

2. 왼쪽의 "Certificates"에 들어가서 "Development"를 클릭해 보시면, 아직 인증서가 등록되지 않은 것을 볼 수 있습니다.

이제 인증서를 생성하도록 하겠습니다. (반드시 "Development"에서 진행하시기 바랍니다.)

 

3. 맥의 Finder로 가셔서 "이동 > 응용프로그램 > 유틸리티 "에 가셔서 "키체인 접근"을 실행합니다.

4. "키체인 접근"에서 "환경설정"으로 들어갑니다.


5. "검사/복구"탭에서 4개 항목 모두 체크되어 있는지 확인합니다. 안되어 있다면 체크합니다.

6. "인증서"탭에서 "끔, 끔, OCSP"으로 세팅되어 있는지 확인합니다. 안되어 있다면 세팅합니다.

7. "키체인 접근"에서 "인증 지원 > 인증 기관에서 인증서 요청..."으로 들어갑니다.

8. "애플 아이폰 개발자 홈페이지"에 등록한 "이메일 주소"와 "이름"을 적습니다.  
이름은 홈페이지에 나와있는 Welcome 다음에 나온 대로 적으면 됩니다. 아마 "이름 성" 형태로 나올 겁니다. 나온 대로 적으면 됩니다.

또, "요청"에서 "디스크에 저장됨"을 체크하시고, "자신이 키페어 정보 지정"도 체크하셔야 합니다.

9. 저장여부를 묻습니다. 데스크탑에 그냥 저장 하십시요.

10. 다음 아래와 같은 창이 뜰겁니다. "2048비트"와 "RSA"가 선택되었는지를 확인하고 "계속"을 누릅니다.

11. 바탕화면에 "Certificate..."하는 파일이 생성되었을 겁니다. "완료"를 누르세요.

12. 다시 "애플 아이폰 개발자 홈페이지"로 돌아와서 "Program Portal"로 들어갑니다. 좌측 메뉴에서 "Certificates"를 선택하면 다음과 같은 화면이 나올겁니다.

여기에서 "Request Certificae"버튼을 클릭합니다.

13. "파일 선택" 버튼을 클릭하여, 방금 전 키체인에서 생성한 파일을 선택하고, "Submit" 버튼을 클릭합니다. 

14. 다시 "Certificate" 화면으로 돌아 오는데, 새로 고침을 하다 보면 Action에 "Approve" 버튼이 생성됩니다. "Approve"가 생기면 버튼을 클릭합니다. 
다음, "click here to download now" 를 클릭하여 파일을 다운로드 받습니다. 

15. 다운로드 받은 파일을 실행시키면 아래와 같이 묻습니다. "승인"을 누르면 됩니다.

16. 다시 홈페이지에서 새로고침을 해보면

이번엔 "Download" 버튼이 생겨 있습니다. 이 버튼을 클릭해서 파일을 다운로드 받습니다.

 

17. 다운로드 받은 파일을 실행시켜 승인합니다. 

18. 다시 "키체인 접근"으로 들어가 보면 인증서가 생성된 것을 확인 하실 수 있습니다. 

---

출처 : http://k2man.com/iphone/1535

Posted by windship
iPhone 개발절차/준비2010. 7. 20. 10:47

실제 기기로 테스트하거나 앱스토어에 등록해 판매하지 않고 공부만 할 예정이라면, 개발환경구축 과정 필요 없이 시뮬레이터만으로도 가능하다. 이 때, 방법은 아래의 1, 2번 과정만 수행하면된다.

우선 아이맥과 아이팟터치를 최신 버전으로 업데이트 시켜줘야 합니다.

아이맥을 처음 실행시키고 인터넷에 연결되면 자동으로 업데이트가 시작됩니다. 또 아이팟터치도 아이튠즈와 싱크되면서 자동 업데이트 됩니다.

 1. 애플 개발자 홈페이지 (http://developer.apple.com) 에서 회원가입을 합니다. 

단, 이때 회원가입 정보와 차후 개발자 프로그램 구매 정보가 동일해야만 고생을 안합니다. 회원가입시 정확한 정보를 입력하시고, 다음 단계에서 개발자 프로그램 구매시에도 동일하게 정보를 입력해야 합니다.

 2. 애플 아이폰 개발자 홈페이지 (http://developer.apple.com/iphone) 에서 로그인 후 SDK를 다운로드 받아 설치합니다. 

애플 개발자 홈페이지는 크게 아이폰, 사파리, 맥OS로 나뉘어져 있습니다. 이 중 아이폰으로 이동하시면 됩니다.

단계 1에서 가입하신 정보로 로그인 하시면 최신 SDK를 다운로드 받을 수 있게 됩니다.

 3. 애플 아이폰 개발자 프로그램 홈페이지 (http://developer.apple.com/iphone/program)에서 Apply하시면 됩니다.

개인사용자인지 기업사용자인지를 물어보는데 자신에 맞게 하시면 될 것 같습니다. 혹시나 1인 기업을 생각하고 계신다고 하더라도 개인사업자 자격이므로 개인사용자로 해도 문제가 없지 않을까 개인적으로 생각합니다.

지역도 물어보는데 한국을 선택하시면 됩니다.

등록을 완료하면 자동으로 한국 애플 스토어로 이동하고 장바구니에 자동으로 Standard Program이 들어 있는 것을 보실 수 있습니다. 가격은 부가세 포함하여 11만원이 조금 안됩니다. 이 것을 구매해야만 앱스토어에 등록할 수가 있습니다.

 4. 하루정도가 지나면 회원가입시 작성한 이메일로 활성화 코드(iPhone Developer Activation Code)가 옵니다. 이메일 내의 코드 링크를 클릭하고 로그인을 하면 됩니다.

여기서 저는 인증에 문제가 생겼습니다. 그래서 다음 단계로 바로 진행이 안되고 신분을 확인하는 단계를 거쳐야 했습니다. 인증이 제대로 되었다면 "Program Portal"로 이동을 하거나 "애플 아이폰 개발자 홈페이지" 오른쪽에 "Program Portal"메뉴가 생성되었을 것입니다.

일단 받으신 인증코드 이메일은 절대 지우지 마시고 아래 방법으로 하시면 됩니다.

문제가 생기면 http://developer.apple.com/contact 로 가셔서 이메일을 보내시면 됩니다. 영어 실력이 개판인지라 아래처럼 딱 2줄 적어 보냈는데, 어이없게도 한글로 안내 이메일이 오더군요.

Im not activation, 
What should I do authentication?

이메일 내용을 보니, 신분 확인이 안되니 신분증(여권, 주민등록증, 운전면허증 중) 사본을 보내는데, 그냥 보내서는 안되고 문서 공증을 받거나 경찰서에 가서 아무 경찰관에게나 신분 확인 받았다는 사인을 받고 보내라고 합니다.

어떤 분은 그냥 해줬다고도 하던데, 저는 조금 많이 잘못되었나 봅니다. ㅜ_ㅜ

신분증 복사해서 동네 지구대를 4번이나 갔는데 계속 순찰중이라 아무도 없더군요. 다섯번째야 사인을 받았는데, 도대체 뭐하는 것인지 궁금해 할까봐 애플로부터 받은 이메일까지 출력해서 갔습니다.

사본을 보낼때는 팩스로 보내는데 호주 전화번호더군요. 인터넷팩스를 이용했습니다.

그리고 보낼 때 "등록아이디 번호"도 신분증 사본에 적어 달라고 하는데요 이것은 "애플 아이폰 개발자 홈페이지"에 가서 로그인 후에 오른쪽 위의 "Edit Profile"을 클릭하셔서 들어가셔 보면 "Person ID"란에 10자리 숫자가 적혀 있을 겁니다.

이 숫자를 적으시면 됩니다.

애플 쪽에서 확인이 되면 다시 인증코드를 클릭해 보라는 이메일이 옵니다. 그러면 처음에 받았던 인증코드 이메일을 다시 열어서 클릭하시면 "Program Portal"로 이동합니다.

---

출처 : http://k2man.com/1526

Posted by windship
프로그래밍/OpenGL-ES2010. 7. 20. 10:45

휴...거진 처음 시작한지 3주만에 알게 되네요... 개념도 없었다가...

 

대부분 게임 어플을 보면, 오픈지엘 100% 를 사용하고, UI 작업도 오픈지엘 에서 하고 있네요...

 

아이폰 xib UI 를 해보닌깐, 화면하나 꾸미는데 큰 어려움이 없던데...

(아직 table 주무리기 하나만 남은것 같지만...ㅋ)

 

이전 작업할때에도 마찬가지였지만, UI 작업을 코딩으로 하게되면, 창 하나 꾸미는데,

하루, 진짜 아주 열심히 하면, 창 2-3개정도 만들수 있는데, 그렇다고 UI 작업이라 아마도 인정안해 주더라구요..ㅋ

 

아이폰에서는 본 게임 부분은 Opelgl (당연히 속도 때문에...)

 

UI 관련된 부분등은 xib 띄워서, 버튼등으로 생성하고 하는게 좋더라구요.경고창이나 액션창도 그대로 사용하면 될테고...

 

창하나 꾸미는데 2-3시간 걸리던 것이, 2~30분정도로 단축되네요..^^

 

단 주의해야할 것이 있던데...

 

전 처음에 프로젝트 생성하면, opengl 쪽도 xib 로 생성해서, addsubview 로 자유자재로 이동하려고 생각했었다가,

나중에 낭패를 보았습니다 (물론 제가 실수한건지 모르겠지만...)

 

처음 프로젝트를 만들때, window 기반에 window 표면을 opengl class 로 설정하고,

그 위에 xib UI 창을 addsubview 로 하면 간편히 띄워 지더라구요..여기에, 로그인화면, 대기실 등등...꾸미면

되겠던데요...

 

그러닌깐 개념이 오픈지엘 베이스에 그 창 위에다가 xib 창을 덮어쓰고, 사용이 끝나면 그 창을 removeromsuperview

해 버리면 간단히 해결되었습니다.(다른창은 addsubview 로 다시 띄우면 되겠지요~)

 

물론 그때에도 내부 opengl 타임이 가동될것이라 예상이 되구요(아직 해보진 않았지만..ㅋㅋ)

그럴땐 상태 변수로 채크해서 잠시 멈춰서 사용하면 될테구요~~~

 

아직도 전체적인 개념은 못잡고 있지만, 그나저나, 아이폰 오픈지엘 관련서적은 어디서 구해야하는지...ㅋ

Posted by windship
iPhone 개발절차/준비2010. 7. 20. 10:44

스마일맨에서는 아이폰 어플을 만들면서 미국의 세무관련번호를 가지게 되었답니다.

그런데 애플사 측의 상황이 바뀌었는지 우리 회사처럼 어플을 만드는 회사에게는 별 필요가 없나봐요.

하지만 아이북스토어의 컨텐츠를 만드는 분들은 이 세무관련번호가 필요하다고 해서

궁금하신 분들이 많으신지, 저한테 물어보는 분들이 가끔 있더라구요.

그래서 어떻게 만드는지 소개 하려고 합니다.

 

먼저...

미국의 세무번호에는 SSN(Social Security Number) 도 있고, EIN(employer identification Number)도 있어요.

전자는 주민등록번호, 후자는 사업자등록번호 정도로 이해하시면 되겠지요.

그 중, 애플사와 거래하는 한국분들에게는 EIN이 필요하다고 합니다.

 

막상 EIN을 만드는 과정은 무척 간단합니다.

SS4 양식만 적어서 미국 국세청(IRS)에 팩스로 보내면 되거든요.

인터넷에 나온 자료는 미국에서 전화가 온다는데... 전화온건 없구요, 팩스가 오더라구요.

 

 

ss4양식은 2장으로 되어있는데 첫장만 쓰면 됩니다.

두번째 장에는 누가 EIN을 신청하는가, 어떤 항목을 적어야 하는가 뭐 그런게 적혀있어요. 

 

 

 

 

양식 적는 법 설명입니다.

 

    1. 회사명이나 개인 이름을 영어로 씁니다.

         이때 혹시 모를 나중을 대비해서 여권과 이름을 같게 적으세요.

    2. 회사명을 적습니다. 1에 회사명을 적으셨다면 안적으셔도 됩니다.

    3. 책임자의 이름을 적습니다. 

    4. 우편물을 받을 주소를 적습니다. (사서함도 가능합니다.)

    5. 회사 주소를 적습니다. (사서함은 안됩니다.)

    6. 국가를 적는 곳이므로 대한민국이라 적구요.

    7. 기존에 가지고 있던 SSN이나 ITIN 또는 EIN이 있으면 적는건데... 교포나 근로유학생이 아니라면 아마 없으시겠죠?

    8. 유한책임회사를 위한 신청인가 묻는데 당근 No!

    9. 대부분 1인 기업 또는 대표로 작업하실테니 'Sole  Proprietor'로 표시하시고  SSN은 없으니까 안적으면 되구요.

   10. EIN 만들라고 해서 만드는 거니까 " Compliance with IRS withholding regulations" 에 표시

   맨 아래쪽에 이름 쓰고, 서명하구요.

    전화번호는 국가번호82, 지역번호 02에서 2만 적어서 (822) 그다음에 전화번호, 팩스번호 적으세요.

 

위 샘플의 파란색 부분만 쓰시면 된다고 보심 되구요.

인쇄해서 사인 해가지구 미국으로 팩스 보내시면 됩니다.

 

 

제가 본 아이폰 관련 책에는 원래 알려진 번호 말고 1-215-516-2830으로 보내라고 되어있더라구요.

그런데 예정시간이 되도록 아무 연락도 받지 못해서 다시 팩스를 보냈습니다.

원래 알려진 번호인 1-215-516-1040으로 말이죠.

그래서 어떤 번호가 정확한지는 아직 모르겠습니다.

팩스를 보내면 근무일로 따져서 4일정도 소요된다고 하던데

넉넉잡고 1주일 기다리시면 됩니다.

 

그러면 아래와 같은 팩스를 받게 됩니다.

 

 

 

 

SS4 양식도 첨부해서 넣었습니다.

다운받으셔서 쓰시면 되요.

 

혹시 궁금한게 있으심 덧글이나 쪽지 주세요.

저희 직원이 작성한 EIN 받는 방법입니다.
저희는 출판도 하고 있는데, 출판쪽에 계신 분들이 아이북스 스토어 진출에 관심들이 많으시거든요.
그쪽은 출판사등록(ISBN 번호)와 EIN이 필수라서 많이들 문의하시나봅니다.
우리 회원님들도 혹시 필요하실까 하여 퍼왔습니다.

--- 

출처 : http://cafe.naver.com/mcbugi/66198
Posted by windship