iPhone Dev2011.02.11 15:27
형상관리툴로 svn 많이들 사용 하시죠? 

Xcode 에서 svn 사용하는 방법이 무지 간단한데.. 처음 접하실 때 "Xcode를 지원하는 mac용 svn 툴"을 찾아보거나 하실 것 같아서(제가 그랬거든요 ㅠ.ㅠ) 간단한 방법을 정리 해 보려고 합니다.

Xcode 에서는 기본적으로 SCM 메뉴가 있고, svn 을 포함 한 SCM Repositories 를 설정 할 수 있습니다.

Xcode를 실행 하신 뒤 상단 메뉴바에 SCM 을 선택 하신 뒤, "Configure SCM Repositories..." 하위 메뉴를 선택합니다.


Configure SCM Repositories... 메뉴를 선택하시면 다음과 같은 창이 뜹니다.

여기서 좌측 하단의 + 버튼을 누르신 뒤 Repository 를 설정 하면 됩니다.

SCM Repository 네임과 System을 선택 합니다. SCM System 은 Subversion 으로 선택하시면 됩니다.


이제 svn Repository 설정을 입력하시면 끝인데요~

URL 만 입력하시면 Scheme,  Host, Path, Port 가 자동으로 입력이 되고, 로그인(계정 인증)하실 User, Password를 입력 해 주시면 됩니다.

이렇게 설정을 완료 하신 뒤 OK 하시면, 

상단 메뉴바에 SCM 을 선택 시 Repositories 라는 메뉴가 추가 되 있음을 확인 하실 수 있습니다.

눌러 보시면..

svn Repository 를 살펴 보실 수 있습니다.

새 프로젝트를 svn 에 올리 실 경우에는 원하는 Directory Path를 만드신 후 Import 버튼을 통해 Finder 에서 프로젝트를 선택하여 올리시면 됩니다. :)
Posted by Min-gu, Kim
iPhone Dev2011.01.14 14:54
일전에 아이폰 어플 개발시에 Mac 상에서 hosts 파일 수정을 해야 할 일이 생겨서 알아보다가 해결 했던 사이트입니다.

사이트로 이동~

사이트 참고 하여, 잘 처리가 됐는데.. 한 동안은 hosts 파일 수정할 일이 없어서 잊고 지내다가, 이번에 사내 이슈트래커 구성 때문에 필요하게 되서 다시 같은 사이트를 찾아서 hosts 파일을 수정했어요. 내친김에 아예 블로그에 정리 해 두는게 낫겠다 싶어서 남깁니다.

1. 터미널을 실행


응용 프로그램 > 유틸리티 > 터미널.app 을 실행

2. hosts 파일을 연다

터미널 실행 후 sudo nano /private/etc/hosts 입력 후 앤터!
* 패스워드를 물어보면, mac 설정 변경 시 마다 물어보는 패스워드랑 동일하게 입력 해 주시면 됩니다.

3. hosts 파일을 수정한 뒤 저장

적용하실 내용을 입력하신 뒤, ctrl+o 후 엔터 (WriteOut).
그 뒤에 ctrl + x (exit)


4. DNS cache 를 갱신한다.

이제 hosts 파일이 수정 됐으니, 재부팅 하셔서 적용하시거나, dscacheutil -flushcache 를 입력 후 바로 적용 하실 수 있습니다.

Posted by Min-gu, Kim
iPhone Dev2010.11.15 15:26

UIWebView 에 특정 페이지를 Request 하고나면, Application 의 메소드를 실행하고 싶지만 말 그대로 웹뷰이기 때문에 불가능한 경우가 많이 있습니다.

예를 들어, 어플 상에서 UITableView 같은 컨트롤에 리스트를 출력하고, 선택하면 UIWebView 로 상세 페이지를 보여준다고 가정합니다. 이런 경우, 페이지간 이동을 Navigation으로 해서 Back 을 통해 다시 리스트로 돌아가는 방법이 있을 뿐, UIWebView 내에서 <input type=submit ...> 같은 버튼을 통해서 Back 하거나 새로운 UIViewController 로 연결할 수가 없습니다.

이런 경우에 해결책은 다름 아닌, UIWebViewDelegate 에 있습니다.

구현 시나리오는 이렇습니다.

1. Web 과 App 이 통신할 수 있도록 하나의 Protocol 을 정의.
2. Web 상에서 버튼 등 Request가 일어나게 하는 컨트롤을 이용해 Protocol 을 써줍니다. 
3. App 상에서 webView: shouldStartLoadWithRequest: navigationType: 메서드를 구현하여 정의된 Protocol 을 찾아 구현 될 메서드를 실행.

저는 Javascript를 이용해 구현 해 봤습니다. 

1. Protocol 을 정의
"toApp:relationButton:param1"

저는 Protocol 을 이렇게 정의 했습니다. 원하시는 형태로 마음껏 구성하시되 3번 항에서 파싱만 완벽히 맞춰 주시면 되겠죠.
위 프로토콜을 정의하면서 파싱을 고려해야 하는데요, 저는 : 로 문자열을 나눈 후, 첫번째와 두번째 텍스트 각각이 toApp, relationButton 일 경우 세번째 텍스트인 param1 를 App 상에서 받아서 처리하기 위해서 Protocol 을 위와 같이 정의 한 것입니다.

2. Web 상에서 버튼 등 Request가 일어나게 하는 컨트롤을 이용해 Protocol을 써준다.
Web 상에서는 버튼등의 컨트롤을 사용해 Request가 일어나게 할 수 있죠. 이를 이용해 Javascript로 버튼이 onClick 시에 스크립트를 실행하도록 할 것이고, 스크립트에서는 Protocol을 써줄것입니다.

2-1. 스크립트에 Protocol을 써 주는 메서드를 정의
<script type="text/javascript">
     function eventtoApp(param1) {
          document.location = "toApp:relationButton:" + param1;
     }
</script>

2-2. HTML Body 내에서 버튼의 onClick 이벤트에 스크립트 실행 연결
<input type=submit onClick="javascript:eventtoApp('P0001001')";/>

3. App 상에서 webView: shouldStartLoadWithRequest: navigationType: 메서드를 구현하여 정의된 Protocol 을 찾아 구현 될 메서드를 실행.
마지막으로, App상에서 UIWebViewDelegate내 메서드인 webView: shouldStartLoadWithRequest: navigationType: 메서드를 구현 해 줍니다.
이 메서드는 UIWebView 컨트롤에서 Request가 일어날 때마다 들어오게 되는데요. 메서드의 반환형식은 BOOL 타입입니다. YES를 반환할 경우 UIWebView 에서 컨텐츠를 로드하게 됩니다.
그래서, 1번항에서 미리 정의 했던 Protocol 을 파싱하는 로직을 구현하되, 매치되지 않는 경우에는 return YES; 를 해 줘야 합니다. 정확히 매치되는 경우에만 어플에서 처리를 할 수 있도록 하면 되는 것이죠. 바로, 이 부분이 앞서 Protocol 에서 App 상에서 필요한 것은 param1 뿐이지만, toApp:relationButton 와 같은 전제를 붙인 이유입니다. 정확히 toApp:relationButton 가 매치되는 경우에만 파싱을 해서 param1을 가져오기 위함인 것이죠.

파싱은 간단하게 구현 하실 수 있습니다.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request 

 navigationType:(UIWebViewNavigationType)navigationType {

NSString *requestString = [[request URL] absoluteString];

NSArray *components = [documentLocation componentsSeparatedByString:@":"];

if([components count] <= 1) {

return YES;

}


if ([(NSString *)[components objectAtIndex:0] isEqualToString:@"toApp"]) {

// 1번째 문자열이 toApp 경우

if([(NSString *)[components objectAtIndex:1] isEqualToString:@"relationButton"]) {

// 2번째 문자열이 relationButton 경우

NSLog(@"%@", [components objectAtIndex:2]); // param1

return NO;

}

}

}


Request가 일어난 뒤 받아온 문자열을 : 로 구분하여 나눈 뒤, 첫번째 텍스트와 두번째 텍스트가 각각 toApp, relationButton 인 경우에만 3번째 param1 을 받아와서 사용합니다. 그 외의 경우에는 return YES; 를 통해 UIWebView 컨트롤에서 컨텐트를 로드하도록 나두고요. 

여기 예문에서는 NSLog로 어플에서 잘 받아지는가만 출력 해 봤습니다. param1을 어플 내 화면에 출력하거나, 다른 메서드를 실행하기 위한 파라미터로 사용하거나 하는 등.. 결과적으로는, Web에서 App을 호출하는 형태를 구현하실 수 있습니다. :)
Posted by Min-gu, Kim
iPhone Dev2010.10.12 14:25
어플 개발시 NSLog 를 통해 Debugger Console 상에 객체의 값이나 카운트 등을 출력하여 테스트 할 수 있습니다.
Log 를 찍어보는 방법은 특히나 Debug시에 자주 사용되는 방법입니다.

저도 이런 방법으로 Debug를 해 보다가.. 너무나 여러 곳에서 NSLog를 남발하였더니, 'Debug, Release 모드를 구분해서 Debug 모드일 경우에만 NSLog 를 출력하게 할 순 없을까?' 하는 생각이 들더군요.

해법

의외로 방법은 간단 했습니다.
바로, Project Info 에서 Configuration 을 Debug 모드로 하고, GCC4.2 - Processing 탭의 Preprocessor Macros 를 추가하는 것이죠. 저는 DEBUG=1 이라고 추가 했습니다.



단, 여기서 끝은 아닙니다. :)

NSLog 를 출력하시는 곳에서 Debug모드를 구분 할 수 있도록 다음과 같이 코딩 해 주시는 작업을 더하면 됩니다.

#ifdef DEBUG

NSLog(@"\nIMAGE_PATH : %@", [self IMG_PATH]);

#endif


이렇게 하면, Debug 모드인 경우에만 Debug Console에 "IMAGE_PATH : " 가 출력이 됩니다 :)


더하기

앗. 그리고 NSLog를 매번 #ifdef ~ #endif 로 감싸지 않고 Prefix에 NSLog를 재정의 해 두는 방법이 있군요. 
멋진 방법인 것 같아서 링크 남겨요. 꼭 참고 해 보세요 :) 

아이군의 블로그 :: [iPhone]NSLog 업그레이드 + Debug 모드에서만 로깅하기

#ifdef DEBUG

#define NSLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )

#else

#define NSLog( s, ... )

#endif


Posted by Min-gu, Kim
iPhone Dev2010.10.07 10:57
APNS 인증서 파일(p12)을 만드는 방법입니다.

1. Member Center - Provisioning Portal 에서 New App ID 를 만든다.



Description : 새로 생성 할 App ID의 이름을 정합니다.
Bundle Seed ID (App ID Prefix) : Generate New 를 선택 합니다.
Bundle Identifier (App ID Suffix) : 번들 ID를 설정합니다. com.domainname.appname 형식으로 하라고 하네요 :)

모든 정보를 입력 하신 뒤에 Submit 을 클릭 하시면 새로운 App ID가 생성 됩니다.



* 생성 된 App ID 에서 Apple Push Notification service 의 state 가 비활성(노란색) 되 있습니다.

2. Apple Push Notification service 의 state 를 활성화



생성 된 App ID 에서 Configure 를 클릭 합니다.

Push SSL Certificate 는 Development, Production 두 가지가 있습니다.
말 그대로, Development 는 앱스토어 등록 전에 개발용으로 사용하실 인증이며, Product 는 앱스토어에 등록 된 후 사용하실 인증입니다. 각각의  Push SSL Certificate 의 state 를 활성화 하기 위하여 Enable for Apple Push Notification Service 를 체크하신 뒤, Configure 를 클릭 합니다.



Configure를 클릭 하시면, Generate a Certificate Signing Request 라는 새 창이 뜹니다.



이 화면에서 Continue 를 클릭 하여 위자드를 진행하시고, Submit Certificate Signing Request 화면으로 넘어갑니다.



이번 프로세스가 APNS 인증서를 추출하는 모든 과정 중 가장 중요한 부분이라고 할 수 있습니다. 여기서 Select the Certificate Signing request (CSR) file that you saved to your disk. 라는 문구가 나오며, 파일을 선택하여 업로드 할 수 있는 submit 버튼이 나오는데요, 업로드 하실 파일은 바로 CertificateSigningRequest.certSigningRequest 파일입니다. 익숙하지만 너무 길어서 좀 낯선.. 이 파일은 맴버 센터에서 Certificates 를 하기 위해 진행할 때 만드셨던 파일이죠.

이 부분이 가장 중요한 이유는, 이 때  CertificateSigningRequest.certSigningRequest 파일을 잘 못 업로드 하는 경우 APNS 인증서와 Certificates 됐던 인증 키(개인 키)가 매치가 되지 않아 인증서 추출을 올바르게 할 수 없기 때문입니다.

혹시, 이 CertificateSigningRequest.certSigningRequest 파일을 이전에 Save 해 두신 게 없으시다면 방법은 2가지 밖에 없습니다.
그 첫번째는 Certificates 부터 아예 다시 진행하시는 방법입니다. 이 방법은 계정 인증부터 다시 하게 되니 이미 Provisioning Profile 이 배포 된 모든 프로젝트를  Provisioning Profile 을 업데이트 하신 뒤 다시 빌드해야 하는 리스크를 감수해야 합니다.
두 번째 방법은 CertificateSigningRequest.certSigningRequest 파일만 새로 만드는 것인데요. 이 방법은 아무런 리스크는 없지만 처음 Certificates 를 진행하면서 입력하신 정보를 정확하게 입력해야 만 APNS 인증서와 Certificates 됐던 인증 키(개인 키)가 매치 된다는 점을 유의하셔야 합니다.
[CertificateSigningRequest.certSigningRequest 생성]




그럼, 다시 Submit Certificate Signing Request 화면으로 가서 CertificateSigningRequest.certSigningRequest 파일을 업로드 해 보겠습니다.



CertificateSigningRequest.certSigningRequest  파일을 선택 하신 뒤 Generate 를 하시면,  APNs SSL Certificate has been generated. 되며 Push SSL Certificate 의 State 가 Enabled로 활성화 되 있는 것을 확인 하실 수 있습니다.



이렇게 Push SSL Certificate 가 활성화 된 뒤, Action 에서 Download 를 통해 인증서 파일(aps_developer_identity.cer, aps-product-identity.cer)을 받으신 뒤 실행 하시면 키체인 접근에 인증서가 등록 되고, 개인 키와 물려 있는 화면을 확인 하실 수 있습니다.



여기서 APNS 인증서와, 물려있는 개인 키를 함께 선택 하신 뒤, 우클릭을 하시면 컨텍스트 메뉴 중에 2개 항목 보내기.. 항목이 있습니다.



클릭하신 뒤 개인 정보 교환(.p12) 형식으로 저장 하시면 



비밀번호를 설정 한 뒤 원하시는 곳에 저장하실 수가 있습니다.

* 이렇게 추출 된 인증서는 서버 프로그램을 하실 때, 사용 되니 APNS 가 필요한 어플을 구상하신다면 반드시 필요합니다 :)
Posted by Min-gu, Kim
iPhone Dev2010.09.30 10:14
간단한 팁입니다.

앱스토어에 어플을 등록하기 위해 Application Loader 를 사용하시죠?
저 또한, itunesconnect.apple.com 에서 어플 기본 정보를 입력 한 뒤 Waiting for Upload 상태로 한 뒤에 Application Loader 를 통해 Binary Upload를 했습니다.

헌데, 졔속 하나의 계정(저희 회사 계정)으로 사용하다가.. 이번에, 외주로 작업을 하면서 다른 애플 개발자 계정으로 업로드를 하게 됐어요. 

아무런 문제 없이 진행 하다가.. 마지막으로 Waiting for Upload 상태에서 Application Loader를 통해 업로드를 하려는데 No eligible applications were found. 라는 메시지가 뜨면서 next 버튼이 비활성화 되 있더라고요.



조금 당혹스러웠지만.. 내용을 자세히 살펴보니, 이전 계정(저희 회사 계정)으로 Application Loader 를 로그인 했기 때문에 itunesconnect 를 이전 계정으로 검색 해서.. Upload 할 어플을 찾지 못하는 것이더군요.

그래서, 계정 설정을 변경하려고 Cancel 버튼을 눌러봤지만.. 그냥 Application Loader 가 종료 될 뿐.. 아무 액션이 없더라고요. Application Loader를 지우고 다시 설치 해 봐도 마찬가지였고요.. (헉)

계정정보를 삭제 할 방법을 찾아볼까.. 이쪽 담당자 분에게 업로드를 부탁 드릴까.. 어찌할까 고민을 해 보다가.. 정말 당혹스럽게도 간단하게 해결 했습니다.

바로.. 메뉴에 보시면 계정정보를 바꿔서 로그인 할 수가 있더라고요..

상단 메뉴 중 Window 탭을 선택하시면, Run Setup Wizard... 라는 메뉴가 있어요.


선택하시면, Application Loader 를 처음 설치했던 화면이 나오고,


Next 버튼을 클릭 하시면, 계정 설정을 다시 해서 로그인 할 수가 있더라고요.


후.. 잠깐 큰 일이네.. 하고 고민 했다가.. 이렇게 간단한 방법으로 해결 되니 허무하기도 하면서.. 참 다행이었죠 :)

Posted by Min-gu, Kim
iPhone Dev2010.09.16 18:57
UILabel 에 Text 를 입력하고, 중앙선(취소선)을 표시하고 싶지 않으세요? ^^;


UILabel 레퍼런스를 샅샅이 뒤져봤지만,  Strike를 표시하는 속성이나 메소드가 없더라고요.
게다가, IB에서 폰트 설정에 Strike 를 설정하는 부분이 있지만, 적용이 되지 않고요..

결국, 고민 끝에 UILabel 을 상속받은 새로운 클래스를 정의해서 구현하기로 했습니다.
뭐.. 그냥, Frame 사이즈에서 중앙선 위치를 구한 뒤에 라인을 하나 그어주면 되겠다 싶었죠.

헌데! 한 가지 생각지 못한 결과가 나오더라고요. 
바로.. Frame 사이즈대로 중앙선의 With를 결정하니, UILabel 의 전체 사이즈. 즉, 입력 된 Text 부분을 제외한 나머지 여백에도 중앙선이 생기는 겁니다. 

그래서, Font 사이즈가 고려 된 Text의 총 With를 알아내야만 되겠더라고요~

UILabel 에 set 된 Text의 Size 알기.

CGSize textSize = [[UILabel text] sizeWithFont:[UILabel font]];

이렇게 하면, UILabel 내 set 된 Text의 Size를 알 수 있습니다. 

그럼, Size를 구하고 중앙선(취소선)은 언제 그려줘야 할까요?
UILabel 의 레퍼런스를 보면,  다음과 같은 메소드가 있더라고요. 

drawTextInRect:

Draws the receiver’s text (or its shadow) in the specified rectangle.

해서, 저는 메서드를 오버라이드 했습니다.

#define strikeHeight 1.0


@implementation UIStrikeLabel


- (void)drawTextInRect:(CGRect)rect {

[super drawTextInRect:rect];

CGContextRef context = UIGraphicsGetCurrentContext();

CGSize textSize = [[self text] sizeWithFont:[self font]];

CGFloat strikeWidth = textSize.width;

CGContextFillRect(context, CGRectMake(0, rect.size.height/2, strikeWidth, strikeHeight));

}



@end


여기에 BOOL값으로 Strike 를 사용자가 선택 할 수 있게 하고,

if([self strike]) {

CGSize textSize = [[self text] sizeWithFont:[self font]];

CGFloat strikeWidth = textSize.width;

CGContextFillRect(context, [self getStrikeRect:strikeWidth]);

}


중앙선(취소선)의 위치를 텍스트 정렬에 따라 맞춰준다면 쓸만한 컨트롤이 될 수 있겠네요 :)

switch ([self textAlignment]) {

default:

case UITextAlignmentLeft:

x = 0;

break;

case UITextAlignmentCenter:

x = (self.frame.size.width - strikeWidth) / 2.0;

break;

case UITextAlignmentRight:

x = self.frame.size.width - strikeWidth;

break;

}


간단하게 샘플을 추가 해 봤습니다. x 축 정렬만 적용 된 버전입니다. :)


Posted by Min-gu, Kim
iPhone Dev2010.09.08 15:44

 2010/07/29 - [iPhone Dev] - APXML 를 사용 해 보세요. 

이전에 남겼던 포스팅을 보고 쪽지로 질문이 날라왔어요. 궁금하셨던 사항이 XML Parsing과 연관성이 있는 질문은 아니지만,  해결책이 간단한 Tip 이 될 수 있을 것 같아서 포스팅으로 남길께요.

UITableView 에 Data 를 바인딩 하기 위해서는 UITableViewDataSource 프로토콜을 구현해야 합니다.
정확히는, row 수와 각 row 마다 바인딩 될 데이터를 지정 해 주는 numberOfRowsInSection, cellForRowAtIndexPath 두 메서드를 구현하면 됩니다.

헌데, 만약 UIViewController 내에서 UITableView 를 하나가 아닌 두 개 이상이고 각 UITableView에 데이터를 바인딩 하려면 어떻게 해야 할까요?  (같은 UIViewController 내에서 UITableViewDataSource 프로토콜 내 함수를 구현하게 되면,  여러개의 UITableView 가 모두 같은 메서드를 호출하기 때문에 뜻하지 않은 결과를 얻으신 것 같더라고요.)

이런 경우에는,  UITableViewDataSource 프로토콜 내 함수에서 분기해서 처리하면 됩니다. 
분기할 때 방법은 두가지 정도가 있는데요. 
우선은 1. 각 테이블 뷰를 전역으로 가지고 있다가 메서드 인자 중 하나인 tableView 와 비교하는 것입니다. 
다른 방법으로는 2. 각 테이블 뷰를 생성할때 Tag 값을 주고, 마찬가지로 메서드 인자인 tableView 의 Tag 값을 확인하는 것이죠.
샘플 내에선 IB로 객체를 연결 했기 때문에 (전역으로 두고 사용) 1번 방법으로 코딩 되 있습니다.

[샘플]

Daum RSS 중 사회, IT 를 두 개의 테이블에 표시하는 간단한 샘플을 만들어 봤습니다.


[ UITableViewDataSource 내 메서드 에서 각 UITableView 분기하여 처리 ]

#pragma mark UITableView dataSource

// Customize the number of rows in the table view.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

if(tableView == societyTable) {

return [societyItems count];

} else if(tableView == digitalTable) {

return [digitalItems count];

}

else

return 0;

}



// Customize the appearance of table view cells.

- (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];

    }

// Configure the cell.

if(tableView == societyTable) {

item* obj = (item *)[societyItems objectAtIndex:indexPath.row];

[[cell textLabel] setText:[obj title]];

} else if(tableView == digitalTable) {

item* obj = (item *)[digitalItems objectAtIndex:indexPath.row];

[[cell textLabel] setText:[obj title]];

}

    return cell;

}


Posted by Min-gu, Kim
iPhone Dev2010.09.06 17:27
APNS(Apple Push Notification Service)를 하기 위해서, 어플을 설치한 각 디바이스에서 Device Token 을 알아야 하는데요.

이 Device Token 을 알 수 있는 방법은 다음과 같습니다.

1. 어플 사용자가 APS(Apple Push Service) 를 이용하겠다는 동의를 해야 한다.

2. 어플리케이션 delegate 에서 UIApplicationDelegate 내 함수 (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 을 구현한다.


바로 2번 항목에서 (NSData *)deviceToken 이라는 파라미터로 Device Token 이 들어옵니다.  이 때, Device Token 은 퍼포먼스 때문에 바이너리 포맷으로 전달 된다고 하네요.

1. APS Register

어플 사용자가 APS 를 이용하겠다는 동의를 해야 한다고 했는데요, 이를 위해서 -(BOOL)application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 에서 다음 코드를 추가 하시면 어플이 설치 되고 처음 실행 될 때 APS 를 이용하겠는지의 여부를 묻게 됩니다. (이 메시지는 처음에만 묻고, 그 뒤로는 다시 묻지 않습니다. 설정 변경은 일반 설정에서 On / Off 하실 수 있습니다.)
코드

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

// Override point for customization after application launch.

[window addSubview:[nav view]];

    [window makeKeyAndVisible];

// APS Register

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:

UIRemoteNotificationTypeAlert |

UIRemoteNotificationTypeBadge |

UIRemoteNotificationTypeSound ];

return YES;

}

설정 변경



2. Device Token 얻기

어플리케이션 delegate 에서 UIApplicationDelegate 내 함수 (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 을 구현을 하면, 어플이 처음 실행 될 때 다음 코드를 타게 됩니다. 이 때, Device Token 을 얻으 실 수 있습니다. (전역으로 두셨다가 필요하실 때 쓰시면 되겠네요)

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 

    NSLog(@"Device Token : %@" ,deviceToken);

}


Posted by Min-gu, Kim
iPhone Dev2010.08.18 10:28
UIWebView 로 HTML Page 를 로드하면 Input 태그의 경우 터치시 키보드 자판이 나타납니다.
여기서, 태그내 어트리뷰트 추가하는 간단한 방법으로 아이폰 자판을 선택하실 수 있습니다. 

키보드 자판 형태의 4종류


// Text

<input type="text"></input>

// Telephone

<input type="tel"></input>

// URL

<input type="url"></input>

// Email

<input type="email"></input>



참고로 위 기능은 HTML5 에서 지원되며, iOS 3.1 버전 이후에서 지원된다고 합니다 :)
Posted by Min-gu, Kim

티스토리 툴바