2010년 3월 31일 수요일

Xcode에서 커스텀 템플릿 만들기



커스템 템플릿 만드는 방법.

영어 몰라도 대충 이해되는 동영상 ㅋ

직접 해본 결과..

1. /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Project Templates/Application 에서 기본 템플릿 중 하나를 복사

2. ~/Library/Application Support/Developer/Shared/Xcode 에 새폴더 생성
 폴더 이름은 Project Templates (이미 존재하면 새로 만들 필요 없음)

3. Project Templates 폴더에 이 폴더 안에 아까 복사한 기본 템플릿을 붙여 넣고 원하는 이름으로 변경한다.
이때 지정하는 폴더 이름이 Xcode에서 템플릿 선택시에 나타날 이름이 된다.

4. 템플릿 폴더 안에 projects 라는 폴더를 하나 생성하고.
 원래 템플릿 폴더 안에 있던 내용들을 projects 폴더 안에 끌어다 놓는다.

5. 기본 템플릿 폴더 안에 보면 예를 들어 Window-based 템플릿이라면 Window-based Application 폴더가 있을 것이다.
그 안에 보면 __PROJECTNAME__.xcodeproj 파일이 있는데, 이것을 열어서 원하는 대로 수정한 후 저장하면 된다.

6. Xcode를 열고 새 프로젝트를 만들어 보자.
방금만든 커스텀 템플릿이 보일 것이다.


내.. 이 쉬운것을.. 몰라가지고..헛지꺼리 했다 이거지..ㅡ_ㅡ;;;

2010년 3월 25일 목요일

Xcode 에서 OpenGL 시작하기

OpenGL SuperBible이라는 책을 보는데..
똑같은 코드가 Xcode에서 돌리면 제대로 안나오데요..

다음은 Xcode에서 OpenGL코드를 작성할 수 있는 방법에 대한 순서 입니다.
물론 개발 플랫폼은 MacOS 겠죠.

[ 프로젝트 생성 ]
1. Xcode에서 File/New Project... 를 선택

2. Mac OS X에 있는 Other를 선택
3. Empty Project 선택
4.Choose 클릭

5. 프로젝트를 저장할 경로 지정
6.Save As :란에 프로젝트 명 지정하고 Save 선택

[ 타겟 추가 ]
1.Groups & Files의 Targets에서 마우스 오른쪽 버튼 클릭

2. Add / New Target... 선택
3. Mac OS X 에서 Cocoa 선택
4. Application 선택 하고 Next 클릭
5. Target Name에 적당한 이름을 주고 Finish 클릭
6. 추가한 타겟의 Info 창이 뜰 것임
7. 맨 아래로 스크롤 하여 GCC_PREFIX_HEADER를 더블 클릭
8. 내용을 삭제한 후 OK 클릭
9. Info 윈도우를 닫음

[ Framework 추가 ]
1. Groups & Files의 Products 폴더에서 마우스 오른쪽 버튼 클릭
2. Add / Existing Frameworks ... 선택
3. 프레임워크 목록에서 커맨드버튼을 누른채로 GLUT.framework 와 OpenGL.framework를 선택한 후 Add 클릭
4. 다이얼로그 박스가 보인다면 그냥 기본설정으로 놔둔채로 Add 클릭

[ File 추가]
1. Products 폴더에서 마우스 오른쪽 버튼 클릭
2. Add / New File ... 선택
3. Mac OS X 에서 C and C++ 선택
4. C File 선택 하고 Next클릭
5. 이름은 main.c 로 한다.
5. Finish 클릭

근데 뭐.. 다 하고 보니깐 딴게 문제가 아니라
아직 OpenGL에 대해서 잘 모르기 때문에 정확히는 모르겠지만..
glutInit 함수를 안써줘서 안나오는 거던데..

잘 돌아가는가 간단히 테스트해 보려면 아래의 코드를 활용하시기바랍니다.
결과는 600x480 사이즈의 그냥 꺼먼 화면만 뜹니다.
 
#include <stdlib.h>

#include <GLUT/glut.h>

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glutSwapBuffers();
}

void reshape(int width, int height)
{
    glViewport(0, 0, width, height);
}

void idle(void)
{
    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
    glutInitWindowSize(640, 480);
    
    glutCreateWindow("GLUT Program");
    
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);
    
    glutMainLoop();
    return EXIT_SUCCESS;
}




참고 : http://mitchallen.com/iphone/archives/50
main.c 코드 출처 : http://blog.onesadcookie.com/2007/12/xcodeglut-tutorial.html



그럼 OpenGL 열공하시기 바랍니다.

2010년 3월 24일 수요일

iPhone UI using OpenGL ES



게임인것 같네요.

탭바와 피커 관련 에러 해결 방법 (NSUnknownKeyException)

시작하세요 아이폰 3 프로그래밍에서 7장 탭바와 피커 에러 관련 해결 방법입니다.
컴파일시 "NSUnknownKeyException" 이 발생하는 경우에 참고하세요.


http://www.iphonedevbook.com/forum/viewtopic.php?f=25&t=1299

결론부터 말하자면.. 인터페이스 빌더에서 연결을 잘못해서 나는거군요..


코드가 이상한가 싶어서 코드만 뚫어져라 보지 말고, 인터페이스 빌더에서 차근차근 해보세요.

여기도 참고..:
http://iphonedevbook.com/forum/viewtopic.php?f=13&t=572

2010년 3월 22일 월요일

Xcode Project Templates

Cocoa dev: Design your own Xcode project templates

http://arstechnica.com/apple/guides/2009/04/cocoa-dev-design-your-own-xcode-project-templates.ars

 

 Carbon Five Community : Custom iPhone Template for iPhone Development

http://blog.carbonfive.com/2009/05/testing/custom-xcode-template-for-iphone-development

Read it!

2010년 3월 11일 목요일

Framebuffers

원문참조

Framebuffer 오브젝트들은 모든 명령들의 타겟이다.
원래 OpenGL ES 에서 framebuffer는 플렛폼에 한정된 인터페이스를 사용하도록 만들어졌다.
각 플렛폼은 그들 나름대로의 스크린에 그려질 수 있는 프레임 버퍼를 생성하는 함수를 제공한다.
OES_framebuffer_object는 오프스크린 렌더버퍼나 텍스쳐들로 렌더링되는 프레임버퍼들을 생성하고 구성하는 일반적인 메커니즘을 제공하도록 OpenGL ES 를 확장한다.
Apple은 프레임버퍼 오브젝트를 생성하기 위한 플렛폼 인터페이스를 제공하지 않는다.
OpenGL ES 2.0에서는 이 함수들이 코어 명세서의 일부이다.

프레임버퍼 오브젝트는 그림 1-1과 같이 프레임 버퍼에 들어가는 이미지에 대한 color, depth, 또는/그리고 stencil 데이터를 위한 저장을 제공한다.
가장 일반적인 이미지 부가장치는 renderbuffer 이다.
texture 역시 프레임버퍼의 색상 부가장치로 부가될 수 있지만, 이미지를 그리고 나면, 텍스쳐는 다른 도형에 맵핑 된다.

그림 1. 프레임 버퍼의 color, depth & stencil buffer들

프레임 버퍼를 생성하는 일반적인 절차 :
1. 프레임버퍼를 생성하고 연결(bind)
2. 이미지 생성, 연결, 구성
3. 프레임버퍼에 이미지 부착(Attach)
4. 다른 이미지들을 위해 2,3단계 반복
5.완전성을 위하여 프레임 버퍼 테스트. 완전성에 대한 규칙은 명세서에 나와 있음.
이 규칙들이 프레임 버퍼와attachment들이 제대로 정의되도록 보장한다.

2010년 3월 8일 월요일

2010년 3월 4일 목요일

Twitter API Limit

하루 최대 Tweet 1000 개 , DM 250개 - 해제 불가

트위터 REST API 는 시간당 150회 호출 제한
- IP 당 제한 및 접속 사용자별 제한으로 분류
- Whitelisting 신청으로 20000회로 상향 가능

검색 API 는 IP당 시간별 제한 > 150
- Whitelisting 불가


아.. 이런..

참고 : http://www.slideshare.net/guruguru/twitter-api-mashup

iPhone JSON and Flicker Tutorials

JSON Framework for iPhone
(링크 참조)
PART1
PART2
PART3

2010년 3월 3일 수요일

Http Request 결과를 JSON 으로 쉽게 파싱해 보기

링크 참조 : http://alones.kr/tag/json

Push Notification Service 서버 개발

내용출처 : Cocoa Touch for iPhone OS 3, WILEY  / http://www.wileydevreference.com

SSL을 사용하는 푸시 노티피케이션을 위한 애플리케이션 서버를 만들 수 있는 기술은 상당히 다양하며, 지금 이것들을 구성하는 내용에 대해서 모두 설명하는 것은 불가능 하다.
지금은 사용할 특정 기술을 하나 선택할 것이다.

이말인 즉슨, 이 예제에서는 Ruby를 사용한 푸시 노티피케이션 제공자의 구현방법을 보여주겠다는 것이다.

어떻게 애플리케이션을 작성하는지 또는 Ruby 코드를 어떻게 읽어야 하는지에 대한 자세한 내용은 다루지 않을 것이다.
지금은 일단 따라해 보자.
이 예제의 소스는 책에 전체 코드가 나와 있으며, 책의 웹사이트에서도 얻을 수 있다.

반드시 알아야 될 점은, 푸시노티피케이션 서비스는 전적으로 당신이 구성한 내용에 따라 실행이 달라진다는 것이다. 이 예제에서는 한가지 방법만을 알려줄 것이다.


Ruby 푸시 노티피케이션 공급자의 구현

Ruby로 푸시 노티피케이션 공급자를 구현하기 위해서는 OpenSSL, 연결 및 메시지 전송, 연결해제를 사용하기 위해 Ruby의 빌트인 서포트를 사용할 것이다.
당연히 다른 방법을 사용할 수도 있다.
특히, 모든 단일 메시지를 위해서 연결, 전송, 연결해제를 계속 하지는 말기 바란다.
솔직히, 이런 행동을 하면 애플은  그들의 서버를 공격하는 것으로 알고, 당신의 인증을 폐지시킬 것이다.
APNS 모델은 연결하고, 연결을 유지하고, 필요할때 메시지를 흘려보내는 개념을 기반으로 한다.  이런것은 또한 C, Python, Perl 등과 같은 다른 언어들로 수행할 수 있다.

잡담은 이쯤해 두고, 다음의 코드를 보도록 하자.
다음의 코드는 Ruby로 작성한 푸시 노티피케이션 공급자를 보여준다.


A Push Notification Supplier Implemented in Ruby
#!/usr/bin/ruby
# ./notify.rb '' ''
require 'socket'
require 'openssl'
# just checking our arguments...
if(ARGV.length < 2 or ARGV[0].length < 32)
    puts "Usage: ./notify.rb '' ''"
    exit(-255)
end
# strip out the space in the token
# the token is copied from an NSLog in our client app
tokenText = ARGV[0].delete(' ')
messageText = ARGV[1]
# pack the token to convert the ascii representation  back to binary
tokenData = [tokenText].pack('H*')
#construct the payload
payload = "{\"aps\":{\"alert\":\"#{messageText}\", \"badge\":1}}"
#construct the packet
packet = [0, 0, 32, tokenData, 0, payload.length, payload].pack("ccca*cca*")
# read our certificate and set up our SSL context
cert = File.read("devcerts.pem")
openSSLContext = OpenSSL::SSL::SSLContext.new
openSSLContext.cert = OpenSSL::X509::Certificate.new(cert)
openSSLContext.key = OpenSSL::PKey::RSA.new(cert)
# Connect to port 2195 on the server.
sock = TCPSocket.new('gateway.sandbox.push.apple.com',2195)
#do our SSL handsaking
sslSocket = OpenSSL::SSL::SSLSocket.new(sock, openSSLContext)
sslSocket.connect
#write our packet to the stream
sslSocket.write(packet)
#cleanup
sslSocket.close
sock.close

이 코드에서 푸시 노티피케이션을 보내는 과정에 대해서 자세히 보도록 하자.

첫째로, 당신은 메시지와 디바이스 ID를 커맨드라인 파라미터를 통해서 얻는다.
그리고 이것을 이용해 APNS 서버에 보낼 패킷을 구성한다.

Constructing Your Packet
# strip out the spaces in the token
# the token is copied from an NSLog in our client app
tokenText = ARGV[0].delete(' ')
messageText = ARGV[1]
# pack the token to convert the ascii representation  back to binary
tokenData = [tokenText].pack('H*')
#construct the payload
payload = "{\"aps\":{\"alert\":\"#{messageText}\", \"badge\":1}}"
#construct the packet
packet = [0, 0, 32, tokenData, 0, payload.length, payload].pack("ccca*cca*")

기본적으로, 당신은 커맨드라인 인자를 얻어서 메시지와 payload에 넘겨질 직렬화된 JSON 오브젝트를 구성한다. 메시지는 JSON 딕셔너리에 "alert" 이라는 키를 이용해 위치 시킨다.
또 다른 키인 "bedge" 에는 1을 설정했다.
마지막으로, 이 딕셔너리 오브젝트를  "apt" 키와 연관된 곳에 넣는다.

다음은, 디스크에서 당신의 인증서를 읽어오는 것과 관련된 코드 이다.
Reading the Certificates
# read our certificate and set up our SSL Context
cert = File.read("devcerts.pem")
openSSLContext = OpenSSL::SSL::SSLContext.new
openSSLContext.cert = OpenSSL::X509::Certificate.new(cert)
openSSLContext.key = OpenSSL::PKey::RSA.new(cert)

여기에서 중요한 부분은 iPhone Developer Portal 에서 언제 당신의 인증서를 받을 것인지에 대한 것이다. 이것은 .p12 포멧으로 되어 있다.
대부분의 OpenSSL 라이브러리들은 .pem 포멧의 인증서로 동작하는것을 선호한다.
그러므로, .p12 포멧에서 .pem 포멧으로 변경해 주어야 한다.
이렇게 하기 위해서 다음의 명령어를 실행시킨다.

openssl pkcs12 -in Certificates.p12 -out devcerts.pem -nodes -clcerts

이 파일을 얻으면, 이것을 이용해서 OpenSSL 컨텍스트를 생성할 수 있다.
이 컨텍스트에서 당신의 인증서에서 얻은 정보로 cert와 key 속성을 설정한다.

다음으로, APNS 서버로의 연결을 오픈한다.
한번 연결을 오픈하면, TCP 소켓을 이용하는 새로운 SSLSocket 을 초기화 한다.
SSL socket 에서 connect 를 호출하면 SSL 은 handshaking을 수행한다.

Connecting to the Server and Sending Your Packet
# Connect to port 2195 on the server
sock = TCPSocket.new('gateway.sandbox.push.apple.com', 2195)
# do our SSL handshaking
sslSocket = OpenSSL::SSL::SSLSocket.new(sock, openSSLContext)
sslSocket.connect
#write our packet to the stream
sslSocket.write(packet)

마침내, 당신은 서버에 패킷을 보냈다.

Pushing Notifications

이제 간단한 명령어를 실행함으로써 노티피케이션 제공자를 실행시킨다.
./notify.rb '' ''
여기에서 토큰은 당신의 클라이언트 애플리케이션으로부터 받은 것이다.
테스트 목적이라면, 콘솔을 이용한 간단한 로그를 날리는 애플리케이션을 만들 수 있다.
그렇다면, 저 명령어를 커맨드 라인에 붙여 넣으면 된다.
실제 구현은 소켓을 사용하는 당신의 서버로 토큰을 날리는 메커니즘을 작성해야 하며 이런 절차는 자동화 시키도록 한다.

디바이스에서 이 메시지를 받으면 스크린에 표시될 것이다.




Checking delivery using feedback

만약에 사용자가 iPhone에서 당신의 애플리케이션을 삭제하면, 노티피케이션을 계속 보내야 되는지 알수가 없다.

받은 노티피케이션들은 더이상 표시해 줄 애플리케이션이 없다.
디바이스 또한 APNS 서버에 전송될 수 없다는 공지를 해준다.
APNS 서버는 그 다음으로 이 디바이스에 대한 리스트를 APNS 피드백 서버에 올린다.
당신은 가끔 피드백 서버에 연결하여 당신이 보낸 노티피케이션을 받지 않는 토큰들의 리스트를 다운로드 해야 한다.
그리고 그 토큰들에 대해서는 메시지 전송을 중단시켜야 한다.



===================================
아오.. 루비는 모르는데 어쩔꺼임?

Push Notification이란?

원문참조

iPhone 이나 iPod 터치의 애플리케이션은 종종 클라이언트-서버 모델 기반에 중점을 두기도 한다.
애플리케이션의 클래이언트 부는 장치에 설치된다.; 애플리케이션의 서버 사이드는 다수의 클라이언트 애플리케이션들에 데이터를 제공하는 것을 주 기능으로 한다. (그래서 이걸 "Provider(공급자)" 라고 한다.)
하나의 클라이언트 애플리케이션은 때때로 그 애플리케이션의 프로바이더와 연결해서 원했던 데이터를 다운로드 한다. 이메일과   SN 어플리케이션들은 이런 클라이언트 - 서버 모델의 예이다.

하지만 프로바이더가 다운로드할 새로운 데이터를 가지고 있을 때 애플리케이션이 그의 프로바이더에 연결되지 않았거나 장치에서 실행조차 되지 않은 경우라면?  이 대기중인 데이터에 대해서 어떻게 알 수 있을까? 푸시 노티피케이션들은 이런 딜레마에 대한 해결책이 된다.  하나의 푸시 노티피케이션은 프로바이터가 디바이스에 넘겨주는 짧은 메시지이다.; 이 디바이스는, 변화에 대해, 다운로드 될 데이터가 있는 클라이언트 애플리케이션의 사용자를 알려준다.  만약 이 사용자가 이 기능을 사용할 수 있고 애플리케이션이 완전하게 등록되어 있으면, 노티피케이션은 디바이스와 애플리케이션에 전달된다.

"Apple Push Notification Service" 에서 설명하는 APNS(Apple Push Notification Service) 는, 리모트-노티피케이션 기능을 위한 일차적인 기술이다.

사용자 관점에서 본 푸시 노티피케이션

당신이 iPhone을 사용하고 있다고 가정해 보자: 전화를 하고, 웹서핑을 하고, 음악을 듣는다. 당신의 아이폰에는  체스 애플리케이션이 설치되어 있다.  그리고 원격에서 플레이 하고 있는 친구와 함께 게임을 시작한다. 당신은 첫번째로 말을 움직였고(이것은 서버 애플리케이션에 기록되었다.), 이메일을 읽기 위해서 클라이언트 애플리케이션을 종료했다. 그 동안에, 당신의 친구는 당신의 움직임을 계산한다. 체스 애플리케이션의 서버는 이 움직임에 대해서 인지하고 당신의 디바이스가 더이상 연결되어 있지 않다는 것을 알고 APNS에 푸시 노티피케이션을 보낸다.
당신의 디바이스 - 엄밀히 말하자면 당신의 디바이스에서 돌아가고 있는 iPhone OS - 는 APNS 로 부터 노티피케이션을 받는다.
당신의 체스 어플리케이션이 지금 동작하고 있지 않기 때문에 iPhone OS 는 그림 1-1 과 같은 Alert 창을 보여주게 된다.

   그림 1-1 Push Notification Alert

여기에서 View 버튼을 누르면, 체스 애플리케이션이 실행되며, 프로바이더에 연결해서 새로운 데이터를 다운로드 받은 후 체스 판 UI를 친구의 움직임을 반영하여 조정하게 된다.(Close 버튼을 누르면 단순히 Alert 창을 닫는다.)

Alert 메시지를 나타내는 대신에 - 또는 Alert 메시지와 함께 - iPhone OS 에서는 타겟 애플리케이션의 아이콘 우측 상단에 그림 1-2와 같이 배지(badge) 번호를 표시할 수 있다.

그림 1-2 배지 넘버를 표시한 애플리케이션 아이콘

배지 넘버는 종종 그 애플리케이션을 위해 서버에서 가지고 있는 대기중인 아이템의 수를 반영하지만, 다른 의미로도 쓰일 수 있습니다.
배지 넘버는 그 애플리케이션의 특정된 그 어떤 숫자라도 나타낼 수 있습니다.
예를 들자면, 다운로드할 데이터 아이템의 수라던지, 읽지 않은(하지만 다운로드는 된) 이메일의 갯수라던지 하는것입니다.

Alert메시지나 배지 넘버와 함께 iPhone OS는 노티피케이션이 들어올때 특정 소리를 이용해서 사용자에게 알려줄수 있습니다.

Apple Push Notification Programming Guide

[링크 참조]
http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Introduction/Introduction.html


[ 서론 ]
푸시 노티피케이션 (리모트 노티피케이션이라고도 함) 은 데이터를 가지고 있는 서버의 IP와 지속적으로 연결하고 있으면서, 애플리케이션이 실행중이지 않을 때 디바이스에서 데이터를 받아 경고창, 소리 또는 배지를 이용해서 사용자에게 알려준다.
푸시 노티피케이션은 데스크탑 컴퓨터의 백그라운드 애플리케이션과 같은 용도를 가진다.
(알다시피, 백그라운드 애플리케이션은 모바일 기기에서는 허용되지 않는다.)

푸시 노티피케이션의 용법 가이드라인에 대해서는 iPhone Human Interface Guideline 에 있는  Enabling Push Notifications 를 보길 바란다.

이 문서에서는 푸시 노티피케이션이 무엇인가, 또 당신의 애플리케이션에서 푸시 노티피케이션의 기능을 어떻게 구현하는가에 대해서 논한다.
클라이언트 부의 구현은 Objective-C와 Cocoa Touch Framework으로 한다.
프로바이더 부의 구현은 TLS/SSL 기술과 스트리밍 소켓 기술이 도움이 될 것이다.


[이 문서의 구성]
이 문서는 다음과 같은 장으로 구성되어 있다.
  • "Push Notification 이란?" 푸시 노티피케이션이 무엇인지 설명한다.  어떻게 사용자에게 알려줄지, 그리고 개발자에게 어떤 이점들을 가져다 주며, 어떤 요구사항들이 있는지에 대해서 설명한다.
  • "Apple Push Notification Service" 프로바이더에서 클라이언트 애플리케이션에게 노티피케이션의 전송 및 라우팅(경로설정)을 하기 위한 Central Push Service 에 대해 설명한다.
  • "Provisioning and Development" 아이폰 개발자 프로그램 포탈로부터 권한을 얻는 과정과 개발환경 설정에 대해서 설명한다.
  • "Provicer Communication with Apple Push Notification Service" 프로바이더가 APNS 와 소통하기 위한 인터페이스와 요구사항에 대해 설명한다.
  • "iPhone OS Client Implimentation" iPhone OS 시스템에서 푸시(리모트) 노티피케이션을 제어 및 등록 하기 위해서 클라이언트 애플리케이션이 반드시 해야하는 것이 무엇인지 설명한다.

푸시 노티피케이션을 이해하는데 도움이 되는 유용한 정보에 대한 부가적인 소스는 다음을 보기 바란다.
  • Security Overview iPhone OS 및 Mac OS X 플랫폼에서 사용되는 보안 기술에 대해 설명한다.
  • UIApplication 과 UIApplicationDelegate 레퍼런스 문서는 클라이언트 애플리케이션을 위한 리모트 노티피케이션 API 를 설명한다.
  • RFC 5246 는 TLS 프로토콜에 대한 표준이다.
데이터 프로바이더와 APNS 사이의 안전한 커뮤니케이션을 위해서 Transport Layer Security(TLS) 이것의 이전 버전인 Secure Sockets Layer(SSL) 기술이 요구된다.
그 이상의 정보를 위해서는 암호화 관련 문서들을 참조하도록 하자.

내 블로그 목록

팔로어