An overview about the iPhone SDK

The iPhone SDK was announced officially on March 6, 2008, the first beta release was on July 11, 2008 which demanded a firmware update for all iPhone and iPod users. The SDK continued to develop with time until the Beta3 update to the 2.1 SDK was released on August 8, 2008.


Here is a small timeline.


Date of release

SDK Version release

iPhone OS Version

March 6, 2008

First beta


March 27, 2008

Beta 2


April 8, 2008

Beta 3


April 23, 2008

Beta 4


May 6, 2008

Beta 5


May 29, 2008

Beta 6


June 9, 2008

Beta 7


June 26, 2008

Beta 8


July 24, 2008

First Beta for OS v2.0


July 30, 2008

Beta 2 update v2.0


August 8, 2008

Beta 3 update v2.0



The iPhone SDK package contents


The SDK is broken down to the following:

Cocoa Touch

The Cocoa Touch layer is one of the most important layers in iPhone OS. It comprises the UIKit and Foundation frameworks (UIKit.framework and Foundation.framework), which provide the basic tools and infrastructure you need to implement graphical, event-driven applications in iPhone OS.

It also includes several other frameworks that provide key services for accessing device features, such as the user’s contacts.

This framework is used to implement the core set of features.

  • Application management
  • Graphics and windowing support
  • Event-handling support
  • User interface management
  • Objects representing the standard system views and controls
  • Support for text and web content
  • Accelerometer data
  • The built-in camera (where present)
  • The user’s photo library
  • Device-specific information



The graphics and media technologies in iPhone OS are geared toward creating the best multimedia experience available on a mobile device. More importantly, these technologies were designed to make it easy for you to build good-looking and -sounding applications quickly. The high-level frameworks in iPhone OS make it easy to create advanced graphics and animations quickly, while the low-level frameworks provide you with access to the tools you need to do things exactly the way you want.

  • OpenAL
  • Audio mixing and recording
  • Video playback
  • Image file formats
  • Quatrz
  • Core Animation
  • OpenGL ES


Core Services

The Core Services layer provides the fundamental system services that all applications use. Even if you do not use these technologies directly, every other technology in the system is built on top of them.

  • Networking
  • Embedded SQLite database
  • GeoLocation
  • Threads


OS X Kernel

The Core OS layer encompasses the kernel environment, drivers, and basic interfaces of the operating system. The kernel itself is based on Mach and is responsible for every aspect of the operating system. It manages the virtual memory system, threads, file system, network, and inter-process communication.


The drivers at this layer also provide the interface between the available hardware and the system frameworks that vend hardware features. Access to kernel and drivers is restricted to a limited set of system frameworks and applications. iPhone OS provides a set of interfaces for accessing many low-level features of the operating system.

Your application accesses these features through the LibSystem library. The interfaces are C-based and provide support for the following:

  • Threading (POSIX threads)
  • Networking (BSD sockets)
  • File-system access
  • Standard I/O
  • Bonjour and DNS services
  • Locale information
  • Memory allocation

Develop your first iPhone application:

Things you need before going any further:

  • A “MAC OS X” platform of version 10.5.3 or later. You can get an original MAC box or you can simply get one of the hacked versions of the MAC OS, for more information click here.
  • The iPhone SDK “Software Development Kit” you can get one from the iPhone developer program home page, or simply click here.
  • Xcode, the IDE “Integrated Development Environment” used to develop applications and software for MAC based platforms. Although one of Xcode’s goals is to reduce the time you spend writing code, you still devote a considerable part of your development in the text editor. To that end, the text and source editor provide many features with the aim of making your source-code editing a productive and efficient endeavor. Code folding, code completion, Edit All in Scope, Refactoring, and other features allow you to focus your attention on the right areas and to use your time as efficiently as possible. It’s packed with the iPhone installer, so no need to worry about it.
  • Interface builder, this application lets you design compelling user interfaces graphically. Your work is saved as nib files that your application loads at runtime. This means that you what you design is exactly what users of your application see; you work with the actual controls that iPhone OS places on the users’ screens. It also means that you spend less effort codifying the user-interface–related aspects of your application in source code. It’s also supplied in the SDK package.



Other developing applications you may use:

  • Debugger, as you start testing your application, you may need to step through your code to the cause of unexpected behavior. Xcode’s debugging facilities provide the usual debugging features, such as breakpoints, viewing variables, and so forth. But Xcode provides these and other debugging features right in the text editor. That is, you can make a change in your code, add a breakpoint, start your application, and perform most debugging tasks in the same window.
  • Instruments, as you near the end of the development process, you must ensure your application uses the resources of the device on which it’s running as efficiently as possible, so that battery power is not wasted and your application does not gather system resources unnecessarily. “Instruments” shows your application’s resource usage, including memory, CPU, and network, in a graphical timeline that lets you see how your application behaves over time.

The MVC design pattern:

The structure of iPhone applications is based on the Model-View-Controller (MVC) design pattern because it benefits object-oriented programs in several ways. MVC–based programs tend to be more adaptable to changing requirements—in other words, they are more easily extensible than programs that do not use MVC. Furthermore, the objects in these programs tend to be more reusable and their interfaces tend to be better defined.

In the MVC design pattern, the model layer consists of objects that represent the data your application manages. The objects in this layer should be organized in the way that makes the most sense for the data. External interactions with model objects occur through a well-defined set of interfaces, whose job is to ensure the integrity of the underlying data at all times.

The view layer defines the presentation format and appearance of the application. This layer consists of your application’s windows, views, and controls. The views can be standard system views or custom views you create. You configure these views to display the data from your model objects in an appropriate way. In addition, your view objects need to generate notifications in response to events and user interactions with that data.

The controller layer acts as the bridge between the model and view layers. It receives the notifications generated by the view layer and uses them to make the corresponding changes in the data model. Similarly, if the data in the data layer changes for other reasons (perhaps because of some internal computation loop), it notifies an appropriate controller object, which then updates the views.

Developing the iCalculator application:

Here is a fast overview of what we will do:

  • Creating the project.
  • Implementing the Model Object.
  • Implementing the Controller Object.
  • Implementing the View Object by use of the “Interface Builder”.
  • Customizing the app delegate to incorporate the view controller object, and add it to the application window.
  • Connecting the view controller to its view.
  • Finalizing the application and setting its icon.


Creating the project

1) Launch Xcode. You can find it in the developer folder > Applications > Xcode.

2) Choose File > New Project.

3) Choose from the iPhone OS templates.

4) Choose Window-Based Application.

5) Name your project “iCalculator”.

Figure 1: New Project.


Figure 2: The iCalculator Project.

Note: The application binary, the project’s product. It’s in red because the product hasn’t been built yet.


iCalculatorAppDelegate.h, iCalculatorAppDelegate.m: The files that implement the application’s delegate.


MainWindow.xib: The nib file that defines the application’s main window. Despite its name, iPhone applications normally have only one window.




Implementing the Model Object

We will create a new class whose instance represents an object of the calculator, follow the following steps:

1) Click on the “Classes” folder.

2) Choose File > New File.

3) Choose Cocoa Touch Classes > NSObject subclass.

4) Name the class “iCalculator”, make sure that creating the header file option is selected.

5) Insert the following Code into iCalculator.h:



Figure 3: iCalculator.h.



6) Insert the following Code into iCalculator


Figure 4: iCalculator.m part I.


Notes for newbies:

1) The “retain” and “release” methods are used mainly in the memory management of iPhone applications, that’s because there isn’t any garbage collection in the iPhone OS.


Thus, memory management is done manually; you can’t simply call “dealloc” to free the resources and references of a certain object, because this object may contain references to other objects that will not be de-allocated, and thus will cause memory leaks, so we use retain which will increment the value of a certain variable for this instantiated object, and release decrements the value, and when it reaches zero, the referenced object is de-allocated.


For more information about this topic, read more about memory management in Objective C++ 2.0.

2) If ( Self = [ super init ] )


What does this mean? This means that init of the parent class “NSObject” function will be called and if self is not equals to null do the following.


Figure 5: iCalculator.m part II.



Figure 6: iCalculator.m part III.


Implementing the controller object:

1) Click on classes.

2) Choose File > New File

3) Choose iPhone OS> Cocoa Touch Classes > UIViewController subclass.

4) Name the class “iCalcViewController”.

5) Modify the iCalcViewController.h header file as the following:


Figure 7: iCalcViewController.h


6) Modify the iCalcViewController.m file as the following:


Figure 8: iCalcViewController.m part I.



Figure 9: iCalcViewController.m part II.


Implementing the View Object

To get users excited about your application, it should have the best user interface possible. Interface Builder allows you to build beautiful, more importantly, useful user interfaces by dragging controls from a library of user-interface elements and laying them out n a view as you want them to appear to the user, your user-interface designs are known nib files. Your application loads these resources at runtime to reconstitute the use interface you designed. This means that you can make substantial changes to the user interface layout (and even some behavior) without having to edit source code. This is the main benefit of the Model-View-Controller paradigm.

1) Expand the “Resources” folder.

2) Double click on “mainWindow.xib” and the interface builder will open.

3) From the interface builder choose File > New file.

4) Choose Cocoa Touch and then press on View.


Figure 10: iPhone OS UI templates.


5) Choose save, name it as “CalcView” and navigate till you reach the location of your project and save it under the “Resources” folder and press ok.


6) Xcode will ask you to update the project to accommodate the new file, confirm this process.


7) Press on the File’s Owner icon.

a. Choose Tools > Inspector.

b. Display the identity pane.

c. In the Class text field enter “iCalcViewController”, note that it will auto-complete.


And by this way, we’ve connected between our view object and the controller object.



Figure 11: “calcView”’s Components.


8) Press on the View icon.

a. Choose the Inspector Attribute pane.

b. Customize your view as you desire, here we changed the background’s color to black.


Figure 12: “calcView”’s View designer.


9) Add input and output controls to the view

a. Choose tools > Library.

b. In the organization pane, select Library > Cocoa Touch Plug-in > Inputs & Values.

c. Select the Text Field item and drag it to the View.

Figure 13: Drag and drop components.



d. Resize the text field, by enlarging it, such that it contained by most of the view’s width.


Figure 14: resize text field.


e. Display the Inspector Attribute pane.

f. Set the text field text to 0.

g. Set the alignment to right-align.

h. Set the title typeface and size, by setting the focus on the text field in the view > Choose Fonts, set it to bold and size 36.

Figure 15: Set font.


i. Add a rectangular button.

  • Choose “Round Rect Button” from the library and drag and drop.
  • In the inspector size pane, set the button’s width to 64 and height to 70.

Figure 16: Set font.


  • Connect the button’s “Touch Down” event to the “press:” action method of the “iCalcViewController” class.
  • Select the button in the view
  • Display the Inspector Attributes pane.
  • Set the title color to black.
  • Set the button title to 7.
  • Set the font size to 48.

Figure 17: Set button attributes.


j. Create the button grid:

  • Choose the button from the view.
  • Choose Edit > Duplicate.
  • Position the clone beside the original button.

Figure 18: Clone the button.


  • Select both buttons and do exactly as the previous steps.

Figure 19: Clone the two buttons.


  • Select the four buttons and with the same steps we can generate the following view.
  • But by changing the text of each button and making sure that the action event of each button is the “press” method

Figure 20: The final calculator view.


Editing the application delegate:

1) Double click on the iCalculatorAppDelegate.h to modify it, edit it to look like this:

Figure 21: iCalculatorAppDelegate.h.


2) Double click on the iCalculatorAppDelegate.m to modify it, edit it to look like this:

Figure 22: iCalculatorAppDelegate.m.


Connecting the View controller to the View

As mentioned before, we have connected between the view and the controller, but that was an initial connection.

We have to be more precise, for example we have to mention which controls do certain actions, and which preview certain data, so here is what we have to do:

1. In the CalcView.xib window, select the File’s Owner proxy (which represents an instance of the “CalcViewController” class).

2. In the Inspector Connections pane, connect the displayField outlet to the text field in the view.

Figure 23: Connecting the view with the controller.


3. Connect the view outlet to the view.

4. Save the “CalcView.xib” file.

Note: If you pressed on one of the buttons, you will find that their action event handler is already set, as we set it before during designing the view to the “press” function.

Setting the application icon

1. In Interface Builder, take a snapshot of the Calc button grid:

a) Place the pointer at the top-left corner of the grid.

b) Press Shift-Comand-4 and hold down the mouse button.

c) Drag the pointer to the bottom-right corner of the grid and release the mouse button.

Figure 24: Taking a snapshot.


Mac OS X places the snapshot file in your desktop using the name Picture 1.jpg (or a name with a higher number if you’ve captured other snapshots).

2. Rename the snapshot file, icon.jpg.

3. In the Groups & Files list, select Resources.

4. Choose Project > Add to Project.

5. Navigate to your Desktop directory and choose icon.jpg.

6. In the dialog that appears, ensure the copy option is selected, and click Add.

7. In the Groups & Files list, double-click Resources > Info.plist.

8. In the editor window, set the value of the Icon file key to icon.jpg,

Figure 24:Info.plist.


9. Save the Info.plist file.

Running your application

Build your application and run it on your simulator, if you have an iPhone connected to Xcode you can choose to deploy and run on it.

Please not that, you have to have a developer’s certificate from apple to develop for iPhones, which will cost you $99 or $299 a year depending on what kind of certificate you want, for more details click here.


Download Article Source Code Below (Must be registered user, registration is free!)


출처 :
Posted by 오늘마감

댓글을 달아 주세요

XCODE2010. 10. 12. 13:06
[아이폰 앱 개발] LightTheCandle 아이폰 어플 만들기
IBOutlet을 인스턴스 변수의 타입 앞에 붙여주면 인터페이스 빌더에 노출되고 적당한 UI요소로 연결을 할 수 있다. 각 인스턴스 변수를 property화 하는데, 이들은 IBOutlet으로 지정되어서 인터페이스 빌더에서 적당한 UI요소에 연결될 것이다. 즉 NIB파일이 로드될때 자동으로 생성되는 인스턴스들이다.
메소드의 리턴 타입의 void대신 IBAction을 넣어주고, 매게변수 (id)sender로 받도록하면 인터페이스 빌더에 노출되어 특정 UI요소가 터치될 때 실행되는 액션 메소드로 사용될 수 있다.
> 뷰 화면에 보이게 설정
> Switch에 액션 설정
> 리소스 추가하기
candle의 상태를 남는 상태변수와 이미지의 변수를 만듬.

NSBundle클래스 : 프로그램 안에서 사용되는 코드와 리소스 등을 모아놓은 곳(애플리케이션을 위한 폴더라고 생각~)
[NSBundle mainBundle]은 현재 애플리케이션의 실행 파일이 있는 번들을 리턴한다.
-pathForResource:ofType:에 파일의 이름과 확장자를 넘기면 현재 실행되고 있는 애플리케이션의 폴더에서 해당 이름의 리소스가 있는지를 찾고 있으면 그 경로를 넘긴다.
넘어온 경로를 이용해 UIImage를 초기화한다.
-setImage:메소드를 통해 UIImage를 넘기면 지정된 이미지를 뿌릴수 있다.
UISwitch에는 on이라는 프라퍼티가 있으며 BOOL값을 가진다.
UILabel의 인스턴스인 candleStateLabel의 text프라퍼티에 "현재 촛불의 꺼져 있으니 켜라"
라는 메시지를 넣어준다.
LightTheCandleAppDelegate가 dealloc될때 alloc했던 인스턴스를 메모스에서 릴리즈 해준다.
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 13:18
사운드 소스 만들기
사운드 만들기에 관심이 있는 분들을 위해 제 방법을 간단하게 정리해봅니다. 있는 사운드 찾아서 사용하는 것도 좋은 방법이지만 저작권 문제도 있고, 찾는 것도 쉽지 않은 경우가 많죠. 저같은 경우는 사운드는 다 제작해서 쓰는 편입니다.

사운드 프로듀싱두 세월이 지나니 취향이 좀 달라지네요.
옛날에는 주로 vsti 같은 거 조절하거나 사운드 제네레이터에서 기본파형을 응용해서 기본 소스 만들고 후반 이펙팅을 거쳐서 소리를 만들었는데, 나이가 좀 드니깐 자연음쪽이 더 좋더라구요. 그래서 요즘은 걍 자연음을 채집해서 가공하는 방식을 많이 씁니다. 의외로 녹음해보면 재미있는 소리가 많더라구요.

Edirol R-09      Zoom H4

제가 쓰는 레코더가 이 두가지인데 Edirol 은 주로 실내에서 음악 잡을 때 쓰고 H4는 잡다한 용도로 씁니다. 둘다 감도가 우수하고 S/N 비가 아주 좋아서 소스 퀄리티가 훌륭하더군요.

사운드 편집은 Audacity 를 사용하고 있습니다. 맥전용 멀티트랙 레코더/에디터인데, 프리 소프트웨어지만 성능은 어떤 편집툴보다도 좋더군요. 굳이 비유하자면 윈도우즈에서 골드웨이브랑 사운드포지의 중간 정도?
이 툴을 이용해서 EQ, Normalizing 과정을 적절히 거친후에 필요한 부분에 살짝 reverb 정도 써주면 훌륭한 음원으로 다시 태어나더군요.

딱 맞는 카테고리가 없는 듯 하여 자유글에 남겨봅니다.


출처 :
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 11:36
openGL texture 만들기

by nik 13. 5월 2009 13:58
- (void)createGLTexture:(GLuint *)texName fromCGImage:(CGImageRef)img


 GLubyte *spriteData = NULL;

 CGContextRef spriteContext;

 GLuint imgW, imgH, texW, texH;

 imgW = CGImageGetWidth(img);

 imgH = CGImageGetHeight(img);

 // Find smallest possible powers of 2 for our texture dimensions

 for (texW = 1; texW < imgW; texW *= 2) ;

 for (texH = 1; texH < imgH; texH *= 2) ;

 // Allocated memory needed for the bitmap context

 spriteData = (GLubyte *) calloc(texH, texW * 4);

 // Uses the bitmatp creation function provided by the Core Graphics framework.

 spriteContext = CGBitmapContextCreate(spriteData, texW, texH, 8, texW * 4, CGImageGetColorSpace(img), kCGImageAlphaPremultipliedLast);

 // Translate and scale the context to draw the image upside-down (conflict in flipped-ness between GL textures and CG contexts)

 CGContextTranslateCTM(spriteContext, 0., texH);

 CGContextScaleCTM(spriteContext, 1., -1.);

 // After you create the context, you can draw the sprite image to the context.

 CGContextDrawImage(spriteContext, CGRectMake(0.0, 0.0, imgW, imgH), img);

 // You don't need the context at this point, so you need to release it to avoid memory leaks.


 // Use OpenGL ES to generate a name for the texture.

 glGenTextures(1, texName);

 // Bind the texture name.

 glBindTexture(GL_TEXTURE_2D, *texName);

 // Speidfy a 2D texture image, provideing the a pointer to the image data in memory

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texW, texH, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);

 // Set the texture parameters to use a minifying filter and a linear filer (weighted average)


 // Enable use of the texture


 // Set a blending function to use


 // Enable blending




출처 :
Posted by 오늘마감

댓글을 달아 주세요

아이폰기본사용2010. 6. 20. 23:17
아이폰 미국계정 만들기 / 한국계정 만들기

아이폰의 미국계정을 만드는 이유는

아이폰의 수많은 어플리케이션은 각 나라마다 다르게 됩니다.

그중 아이폰의 보급이 활성화 되었고 어플리케이션이 무궁무진하게 많은 미국 아이튠즈

접속을 하려하는겁니다.

 (단.. 무료계정이기에 유로어플은 받을수 없습니다. 하지만 수많은 free어플이

너무너무 많다는 겁니다)!

지금부터 계정을 차분히 만들어볼까요?

(모든그림은 클릭후 원본사이즈보기로 보시면 쉽게 보실수있으실거에요)

위는 아이튠즈를 받기위하여 애플의 아이튠즈 다운로드 홈페이지로 들어간 것입니다.

사이트를 모르실 경우는 요기를 클릭해주시면 바로 다운로드 홈페이지로 이동합니다 ^^./

인스톨의 모든과정을 행해여 주신뒤 아래와 같은 아이튠즈 화면이 나타납니다.

위와 같이 실행 되셨으면 왼쪽 메뉴에서 iTunes Store 를 클릭하신뒤 스크롤을 주루룩~ 내립니다

위의 빨간 화살표 처럼 태극기가 보이시나요? 클릭해주세요!

위의 그림처럼 수많은 국가들중에서  United States 를 찾습니다. US 즉 미국이죠~!?

클릭해주세요 !

한국의 무료 계정만들기도 여기서부터 따라하시면됩니다. 즉

(리퍼블릭코리아 를 클릭하고 아래와같이하시면 됩니다)

빨간 네모박스 위치에 app store 를 클릭해주세요

우측하단에 Free app중에 아무거나 클릭한후 다운 받으세요!

그러면 아래의 화면 처럼 계정을 입력하라고 창이하나 뜹니다.

위의 창을 클릭하신뒤에

나오는 화면에서 continue 을 클릭합니다

위 처럼 나왔오시면 작은칸의 V 체크와  Contine를 다시한번 클릭해 줍니다.

자 여기서 중요합니다.!!

위와 같은 화면이 나오면

자신이 이메일을 받을 수 있는 정확한 메일주소를 기입해야합니다.

Email Address :  이메일을 받을 수 있는 꼭! 자신의 이메일을 기입해주세요

                         곳 아이튠즈 자신의 계정 ID이기도 합니다.

Password: 비밀번호를 적으세요

verify: 비밀번호를 재차 확인합니다


Question: 비밀번호를 잃었을경우 물음입니다.

Answer: 물음에 대한 답변입니다

Month: 생일의  일 입니다

Day: 생일의 월 입니다.

입력하신뒤  Continue 를 눌러주세요.

위의 화면까지 오셨나요?  카드 모양중에 none이라 곳이 보이면 거의 다오셨습니다.

none를 클릭하면   Card Number 와 Expires 창이 사라지는걸 보실수 있으실 겁니다 그걸 제외하고

code: 공란으로 두세요.

Salutation: 아무거나

Forst Name : 아무거나

Last Name: 아무거나

Address: 아무거나

City:  Cupertino State

Zip Code: 95014

State: 아무거나

Phone: 800 5007078

을 써넣어주신뒤 Continue 를 눌러주세요.  이제 마무리네요 !

그뒤 자신이 써넣었던 이메일계정으로 들어가 메일 읽기를 합니다

받으신 메일중에 애플에서온 메일을 열어서 빨간창의 링크를 클릭하시면 계정이 생성됩니다 ^^ 수고하셨습니다.

한국의 계정도 똑같이 무료어플받기를 하신뒤 위와 같이 따라하시면 됩니다 ^^ 참쉽죠~!?

출처 :
Posted by 오늘마감

댓글을 달아 주세요

아이폰기본사용2010. 6. 20. 23:16
아이폰 벨소리 만들기

보통 자신이 가지고 있는 음악으로 벨소리를 만들려면 이런 충격적인 사실을 알고 맙니다..

난 2년동안 개짖는소리로 살아야하는건가?..... 

(스토어가 아니더라도 꼭 멜X, 도시X 이런 곳에서 구입을 하셔서

못쓰는경우일 경우입니다.불법 다운로드는 왠만하면~하지마세요

^^// 정품을 씁시다!!)


먼저 사이트 가운데에 있는 박스 안에 Upload를 누릅니다.

그러면 개인 폴더 화면이 열리고 가지고 있는 음악 중에서 파일을 선택하라는 창이 나옵니다.

아이폰 벨소리로 만들 음악 파일을 선택하면

업로드가 끝난뒤 아래 화면이 나옵니다.

이런 화면이 열리고 듣고 싶은 부분으로 골라서 창을 옮겨 선택하고

아래 있는 하얀 박스의 Create rightone을 누릅니다.

그 다음엔 아티스트랑 타이틀을 적으라고 나옵니다. 적고 Done!을 누릅니다.

가운데 있는 다운로드 링톤 포 아이폰을 누르고 파일을 다운 받아저장 해 줍니다. 

아무곳에 저장해도상관없습니다. 옮길꺼니깐요~

아이튠즈와 아이폰을 동기화시켜 엽니다.

파일 창에서 보관함에 파일 추가를 엽니다.

벨소리를 선택하면 보관함 목록에 벨소리 목록이 생깁니다

그럼 벨소리를 그대로 마우스로 끌어 자신의 아이폰 아이콘 위에 갖다 붙입니다.

그 다음에 벨소리 적용파일이 나옵니다.

벨소리 동기화 체크해주고,

동기화 한번 해주면 아이폰 벨소리 파일이 들어갑니다.



출처 :
Posted by 오늘마감

댓글을 달아 주세요