작업을 하던중 코코스와 sio2 엔진을 통합하면 좀 편하겠다. 싶어서

통합해 보았습니다.
http://www.cocos2d-iphone.org/forum/topic/3620#post-26503 문서의

yarri 님 글을 참고 했는데 오래된 버전으로 작성되어 있어 차이점이 좀 있었습니다.

맥 초보분들도 이해하기 쉽게 따라하는 식으로 써볼게요.


기본 준비물

cocos2d 0.99.4 설치

sio2 1.4 버전 다운로드


1. cocos2d는 xcode템플릿을 지원하므로 'cocos2d application' 템플릿으로 프로젝트를 생성합니다. ( ex, cocos2d_lib )

 

 

 

 


 소스만 사용할 것이므로 xcode를 종료합니다.

 

2. sio2는 template이라는 폴더를 복사하는 방식으로 새프로젝트를 생성하고 있습니다. 기본 template을 사용해도 무방하지만 리소스를 랜더링 하고 있는 tutorial02를 복사본을 뜬후 이름을 변경합니다. (ex, sio2withcocos2d) 이때 src 폴더와 data 폴더도 같이 복사해줍니다.

 

 

 

 

 

 

3. sio2withcocos2d 폴더내의 template.xcodeproj 를 열고 프로젝트 이름을 본인에 맞게 변경합니다. (변경안해도 상관은 없겠죠)


4. cocos2d에서 필요한 파일들을 sio2withcocos2d 폴더로 복사 합니다. libs, Resources 폴더를 복사한후 Resources폴더 내에서 fps_images.png만 남기고 지웁니다.






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

댓글을 달아 주세요

Cocoa tutorial – linking and using libmysqlclient in your application

Here’s a little tutorial on how to use libmysqlclient in a Cocoa application.

First of all you need to create a new Xcode project; suppose to create it in the directory: /path/to/your/project/.

Then you need to retrieve the libmysqlclient.aand libmysqlclient_r.afiles located in the /usr/local/mysql/lib/default directory. To do this you can, for example, start a new Terminal session and type the following commands:

cp/usr/local/mysql/lib/libmysqlclient.a /path/to/your/project/cp/usr/local/mysql/lib/libmysqlclient_r.a /path/to/your/project/

Now go to Xcode and select “Project” -> “Edit Project Settings” in the main menu. Now select the “Build” tab and make the following changes to all your configurations (Debug and Release):

  • “Architectures”: the same of your libmysqlclient architecture;
  • “Valid Architectures”: architectures compatibles with your libmysqlclient architecture(s);
  • “C/C++ Compiler Version”: GCC 4.2;
  • uncheck “Prebinding”;
  • turn on (if desired) the “Objective-C Grabage Collection”;
  • “C Language Dialect”: C99 [-std=c99];
  • check “Mismatched Return Type”;
  • check “Unused Variables”.

Note that not all of these flags are strictly required for the correct use of libmysqclient.aand libmysqlclient_r.a; you can test them and see what happens when you change some of them.

Now you need to import the libraries. To do so, right click on the group “Frameworks” located in the “Groups & Files” tree in Xcode and select “Add” -> “Existing Frameworks…”. Locate the libmysqlclient.afile and click the Add button. Repeat the operation with the libmysqlclient_r.afile.

Now you need to tell Xcode to copy the two libraries in the bundle directory. To do so, you must create a new copy build phase in your target and put the libraries in it:

  • Expand the “Targets” group in the “Groups & Files” tree;
  • right click on your application and select: “Add” -> “New Build Phase” -> “New Copy Files Build Phase”;
  • in the new window select “Frameworks” in the Destination popup menu;
  • close the window;
  • drag and drop the libmysqlclient.aand libmysqlclient_r.afiles from the Frameworks group to the new “Copy Files” group.

Now you need to copy all the MySQL C API headers in your project directory. To do so you can, for example, do something like this:

cp-R/usr/local/mysql/include//path/to/your/project/mysql_include/

That’s all. To access any MySQL API function, you only need to import the mysql.hand unistd.h

Here’s a short example on how to use the API in a .m file:

... #include "mysql.h"#include "unistd.h"  @implementationAppController   ...   -(void)connect {MYSQL conn; mysql_init(amp;conn);   if(!mysql_real_connect(amp;conn, "127.0.0.1", "", "", "", 0, NULL, 0))NSLog(@"%s", [NSStringstringWithUTF8String:mysql_error(amp;conn)]); elseNSLog(@"Connected"); }@end

Download the test project.



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

댓글을 달아 주세요

아이폰어플개발정보2010. 10. 15. 15:36
[아이폰 앱 개발] Throwing and rethrowing an exception

Listing 1  Throwing and rethrowing an exception


@try {

    // ...

    if (someError) {

        NSException *theException = [NSException exceptionWithName:MyAppException reason:@"Some error just occurred!" userInfo:nil];

        @throw theException;

    }

}

@catch (NSException *exception) {

    if ([[exception name] isEqualToString:MyAppException]) {

        NSRunAlertPanel(@"Error Panel", @"%@", @"OK", nil, nil,

                localException);

    }

    @throw; // rethrow the exception

}

@finally {

    [self cleanUp];

}

In this code the exception (exception) is thrown again at the end of the local handler, allowing an encompassing exception handler to take some additional action. Figure 1 illustrates the flow of program control between nested exception handlers created with the @catch directive.

Figure 1  Control flow with nested exception handlers—using directives

An exception raised within Method 3's domain causes execution to jump to its local exception handler. In a typical application, this exception handler queries the exception object to determine the nature of the exception. The local handler may handle exception types that it recognizes and then may rethrow the exception object to pass notification of the exception to the handler nested above it—that is, the handler in Method 2. However, before the next outer exception handler is invoked, the code in the @finally block associated with the local exception handler is executed. (This has implications for memory management, as discussed in “Exception Handling and Memory Management .”)

An exception that is rethrown appears to the next higher handler just as if the initial exception had been raised within its own exception handling domain. Method 2's exception handler again may handle the exception and may rethrow the exception to Method 1's exception handler; Method 1’s handler does not receive the rethrown exception until Method 2’s @finally block completes its task. Finally, Method 1’s handler rethrows the exception. Because there is no exception handling domain above Method 1, the exception passes to the uncaught exception handler (see “Uncaught Exceptions”).

Nested Exception Handlers With Exception Macros

You program should use the exception-handling macros if it must be compatible with versions of the operating system prior to Mac OS X v10.3. If you are using the exception-handling macros, the code equivalent to that in Listing 1 would look something like Listing 2.

Listing 2  Raising and re-raising an exception


NS_DURING

    ...

    if (someError) {

        NSException *theException = [NSException exceptionWithName:MyAppException reason:@"Some error just occurred!" userInfo:nil];

        [theException raise];

    }

    [self cleanUp];

NS_HANDLER

    if ([[localException name] isEqualToString:MyAppException]) {

        NSRunAlertPanel(@"Error Panel", @"%@", @"OK", nil, nil,

                localException);

    }

    [self cleanUp];

    [localException raise]; /* Re-raise the exception. */

NS_ENDHANDLER

In this code the exception (exception or localException) is raised again at the end of the local handler, allowing an encompassing exception handler to take some additional action. Figure 2 illustrates the use of nested exception handlers, and is discussed in the text that follows.

Figure 2  Control flow with nested exception handlers—using macros

An exception raised within Method 3’s domain causes execution to jump to its local exception handler. In a typical application, this exception handler checks the object localException to determine the nature of the exception. For exception types that it recognizes, the local handler responds and then may send raise to localException to pass notification of the exception to the handler above, the handler in Method 2. (An exception that is re-raised appears to the next higher handler just as if the initial exception had been raised within its own exception handling domain.) Method 2’s exception handler does the same and then re-raises the exception to Method 1’s handler. Finally, Method 1’s handler re-raises the exception. Since there is no exception handling domain above Method 1, the exception is transferred to the uncaught exception handler (see “Uncaught Exceptions”).

Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 10. 12. 05:14
when textview empty, detecting it and disabling Button
In response to Victor Alexander on May 22, 2010 7:29 PM

This is what the 'delegate' property of the UITextField (or UITextView) is for. Then implement the appropriate delegate method so you get notified each time the field is changed. Then call your 'disabled' method from there.

In response to RickMaddy on May 22, 2010 11:47 PM

@RickMaddy thanks! So I'm really close... I know I'm missing something but I'm not quite sure what it is.

in my .h file I added my delegate to the view controller


UIViewController <UITextViewDelegate> 

I also added the following instance method that should tell the delegate that the text or attributes in the specified text view changed.


-(void)textViewDidChange:(UITextView *) textView1; 

In my .m file

I added a condition to the method above:


- (void) textViewDidChange:(UITextView *)textView1{      if (textView.text.length == 0) {           //disable button           moreButton.enabled = false;      }      else {           //enable button           moreButton.enabled = true;      } } 

I know that I'm missing something related to my delegate, but I'm not quite sure how to work this... even though I've read the documentation :/ Sorry to keep asking!


@property(nonatomic, assign) id<UITextViewDelegate> delegate 
In response to Victor Alexander on May 23, 2010 6:16 AM

"I'm not quite sure how to work this."

Two observations:

One, you have a typo.

You use textView1 as the parameter, and in the body of the method you use textView.

Two, connect the UITextView's delegate to you custom view controller class.

Try this:

  1. Open the view containing the UITextView.
  2. Double click on the View icon in the document window  to make sure the view is open in its editor window.
  3. Select the UITextView.
  4. Open the inspector to the Connections pane (cmd-2).

  5. Make a connection from the delegate to the File's Owner. Just click the delegate outlet and drag to the File's Owner icon the in the document window. Afte dragging you should see something like this:

  6. Save the nib file.
In response to Jeremy French on May 23, 2010 8:20 AM

Or if you are not using IB then in your view controller's 'viewDidLoad' method add the line 'textView.delegate = self'.







https://devforums.apple.com/message/223850

Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 10. 12. 05:09
UITextFields and UIButton

UITextFields and UIButtons

Hi again everyone, sorry for the late update, I have been pretty busy with another project for the blog this past week, along with a few other jobs/projects unrelated to this.  I still have yet to finish that other tutorial so I thought I would throw something together today that most of you guys will find relatively helpful (I hope).  So here we have it, a little tutorial that covers labels (nothing new at all here), textfields, buttons, and NSUserDefaults.  Alright, lets begin, open Xcode and create a new View Based Application, name it TextInput.

Navigate to TextInputViewController.h and you will need to declare the UITextFieldDelegate protocol by adding<UITextFieldDelegate> after TextInputViewController : UIViewController, this will tell your program that it needs to conform to the UITextFieldDelegate protocol, which in turn, allows you to create UITextFields. Now, in the @interface section, declare two UILabels, two UITextFields, and two UIButtons like so:


UILabel *firstLbl; UILabel *lastLbl; UITextField *firstName; UITextField *lastName; UIButton *saveBtn; UIButton *loadBtn;,

Under that, make sure to add the following code outside of the brackets but before the @end, this will let you control the UIButtons and UITextFields:


@property(nonatomic,retain) UITextField *firstName; @property(nonatomic,retain) UITextField *lastName; @property(nonatomic,retain) UIButton *saveBtn; @property(nonatomic,retain) UIButton *loadBtn;

Now, go to your TextInputViewController.m and uncomment the loadView method. Create a UIView now to fit the frame of the screen and set it to the self.view:


CGRect frame = [UIScreen mainScreen].applicationFrame; UIView *view = [[UIView alloc] initWithFrame:frame]; self.view = view;

NOTE: This is the last time I will be explaining how to create the viewController’s main view, same goes with generic labels that we will be using a lot, which will follow
From here, we need to prepare and initialize all of your views and objects that we will be using in the main viewController. Starting with the labels:


firstLbl = [[UILabel alloc] initWithFrame:CGRectMake(20,10,320,32)]; lastLbl = [[UILabel alloc] initWithFrame:CGRectMake(20,70,320,32)]; firstLbl.backgroundColor = [UIColor clearColor]; lastLbl.backgroundColor = [UIColor clearColor];

This is simple, we are preparing the UILabels for the loaded data that we will be accessing later. I didn’t bother setting any other properties for these labels, this isn’t a UILabel tutorial, I covered more of that in the Hello World tutorial a couple of weeks ago. After that, we get into the new stuff, the fun stuff. You will need to start by creating a method that looks something like this:


- (UITextField *) firstName { if(firstName == nil) { CGRect frame = CGRectMake(20,40,280,30); firstName = [[UITextField alloc] initWithFrame:frame]; firstName.borderStyle = UITextBorderStyleRoundedRect; firstName.textColor = [UIColor blackColor]; firstName.font = [UIFont systemFontOfSize:17.0]; firstName.placeholder = @"First Name..."; firstName.autocorrectionType = UITextAutoCorrectionTypeNo; firstName.keyboardType = UIKeyboardTypeDefault; firstName.returnKeyType = UIReturnKeyDone; firstName.clearButtonMode = UITextFieldViewModeWhileEditing; firstName.delegate = self; } return firstName; }

Alright, there are a LOT of new concepts here, all of which pertaining to setting up your customized UITextField, we will be using this again in a moment. First off, we have an if statement that checks to see if the text field has already been allocated and initialized, if the firstName returns a nil value, then the enclosed statements are executed, if it doesn’t, then it just returns the already allocated UITextField. Assuming that the statement was satisfied, lets step through all of the properties of the text field. Like with most of the UIKit objects, you need to set the text field inside of a frame using the CGRectMake method. We initializefirstName with this frame. Then we set the borderStyle, this is what the frame of the field will look like, I used theUITextBorderStyleRoundedRect style here, which, like it says, makes the frame rounded on the corners. textColorsets the input text’s color and font sets the font size of that input, similar to that used in a UILabel. We use placeholder to fill the UITextField with a background text until it is touched and/or has any input. autocorrectionType sets whether or not to use the iPhone’s auto-correct dictionary with input, I set this to no for proof and practice, the default is YES. ThekeyboardType and returnKeyType properties delegate the keyboard settings, the first sets it to the standard keyboard and the latter sets the return key to say Done and to dismiss the keyboard. Almost done, clearButtonMode property tells us whether or not to use the little gray ‘X’ that clears the field. Finally, delegate tells the text field that it is being controlled by this particular view controller. We return the UITextField now at the end.

We use this method form again for the lastName, replacing firstName with lastName and changing any properties based on what you want to play with. Remember, hit Esc on your keyboard to list the available options for each property after the ‘=’ sign.

Add the following code to dismiss the keyboard when Done is clicked:


- (BOOL) textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return YES; }

Now we need to start setting up the buttons that save and load the data:


- (UIButton *) saveBtn { saveBtn = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; saveBtn.frame = CGRectMake(0,0,90,45); [saveBtn setTitle:@"Save" forState:UIControlStateNormal]; [saveBtn setTitle:@"Save" forState:UIControlStateHighlighted]; [saveBtn setTitleColor:[UIColor colorWithRed:0.0 green:0.3 blue:1.0 alpha:1.0] forState:UIControlStateNormal]; [saveBtn setTitleColor:[UIColor colorWithRed:0.0 green:0.1 blue:1.0 alpha:1.0] forState:UIControlStateHighlighted]; [saveBtn setBackgroundColor:[UIColor clearColor]]; [saveBtn addTarget:self action:@selector(saveText) forControlEvents:UIControlEventTouchUpInside]; return saveBtn; }

Alrighty then, same idea as the UITextField method, we are just setting a group of properties for the UIButton. First we set the type of button we want to UIButtonTypeRoundedRect and retain the view. Next is the frame as always, the x,y coordinates are set to 0 because frankly, I prefer to set the location of UIButtons using the center point, which I will show later. Button’s titles and images etc are based off of the UIControlState of the button. First, we set the title of the button at itsUIControlStateNormal, in this case it just says “Save”; we use the same statement again below, except usingUIControlStateHighlighted, this sets the title of the button when it is clicked down. We set the titleColor now for both states to a custom UIColor value, followed by the backgroundColor property, which makes the outside of the frame meld with the background’s color or image. Finally, the most important bit of code is theaddTarget:action:forControlEvents: that tells the program to execute the method saveText inside of self when the user performs a UIControlEventTouchUpInside, aka a touch of the button. We return the button and continue.

Do this again with loadBtn, only this time make sure to change that second to last line to:


[loadBtn addTarget:self action:@selector(loadText) forControlEvents:UIControlEventTouchUpInside];

Configure it how ever you wish and play around with the properties, the best way to learn how to program is trial by error.

Now before we put this all together in our loadView method, we have two more bits of code to write, and these will be the ones the let us save and load our data: saveText and loadText. Let us start with the first one, insert the following code after the UITextField and UIButton methods:


[[NSUserDefaults standardUserDefaults] setObject:firstName.text forKey:@"firstName"]; [[NSUserDefaults standardUserDefaults] setObject:lastName.text forKey:@"lastName"]; [[NSUserDefaults standardUserDefaults] synchronize]; firstName.text = @""; lastName.text = @"";

Alright, new concept here: NSUserDefaults. This is the Foundation Frameworks method of saving the default settings for a program along with other bits of data. The first two methods are essentially identical, you start by callingstandarUserdefaults which tells the next commands to look in the standard library of saved data. Next, we need to save the string from the UITextField, which is done by using setObject: and then the string, which is the text property of your text field, and finally, we need to tell the computer where exactly to look when we want to load this, so we set forKey: to the name of the variable. NOTE: I usually do it this way as an organizational method but you can set the forKey to whatever you want. Also, if you poke around through the documentation from Apple, you can get the methods to save other types of data. Last new bit of code here is the synchronize method, which tells the program to pretty much save and do so now. If you do not use this, when you are saving larger bits of data there is a chance that it does not save before the application is exited, at which point you can lose an entire saved game, as was the case with an error I was having on an application I wrote a while back. Nothing new after that, these two calls just clear the text fields, I used this as a little visual aid to indicate that something actually happened.

Okay, almost done… now we just need to tell the program just how to load the data that we previously saved. Add:


NSString *first = [[NSString alloc] initWithString:[[NSUserDefaults standardUserDefaults] objectForKey:@"firstName"]; NSString *last = [[NSString alloc] initWithString:[[NSUserDefaults standardUserDefaults] objectForKey:@"lastName"]; firstLbl.text = first; lastLbl.text = last; [first release]; [last release];

Alright, just the normal NSString declartaion/allocation/initialization is used here, we all know how to use that, the new part comes with the string that we are initializing the variable with. We do as we did before and tell NSUserDefaults to use thestandardUserDefaults, then we tell it to load the object that has a matching key to the one we put after objectForKey, if there is an object there, it loads it, if not, nothing happens, simple as that. We do the same thing again only loading a different object this time. NOTE: I am relatively sure that you can use stringForKey: instead although I have never had a reason to so play with it as you will. Now we place those strings inside of the UILabels, release the retained memory from the strings and move on to the last little thing, putting it all in play. Back to the loadView method, insert:


[self firstName]; [self lastName]; [self saveBtn]; [self loadBtn]; [saveBtn setCenter:CGPointMake(100,200)]; [loadBtn setCenter:CGPointMake(220,200)]; [self.view addSubview:firstName]; [self.view addSubview:lastName]; [self.view addSubview:saveBtn]; [self.view addSubview:loadBtn]; [self.view addSubview:firstLbl]; [self.view addSubview:lastLbl];

This is what makes everything activate and come alive. The first 4 lines execute your button and text field methods that initialze and allocate them with your custom settings. The following two set the center of the buttons to exactly where I want them, I find this easier for most subviews. The last 6 lines add everything to the superview. That is it, make sure that you releaseeverything that you retained in the dealloc method, Build & Go.

I changed the background color the same way we did in Hello World

That is all for now, you can get the sample code here.

Regards,
sj

http://idevkit.com/iphonedev/2009/09/uitextfields-and-uibuttons/
Posted by 오늘마감

댓글을 달아 주세요

오브젝트C2010. 10. 12. 04:48
[objective-c] Throwing and rethrowing an exception

Listing 1  Throwing and rethrowing an exception


@try {

 // ...

 if (someError) {

 NSException *theException = [NSException exceptionWithName:MyAppException reason:@"Some error just occurred!" userInfo:nil];

 @throw theException;

 }

}

@catch (NSException *exception) {

 if ([[exception name] isEqualToString:MyAppException]) {

 NSRunAlertPanel(@"Error Panel", @"%@", @"OK", nil, nil,

 localException);

 }

 @throw; // rethrow the exception

}

@finally {

 [self cleanUp];

}

In this code the exception (exception) is thrown again at the end of the local handler, allowing an encompassing exception handler to take some additional action. Figure 1 illustrates the flow of program control between nested exception handlers created with the @catch directive.

Figure 1  Control flow with nested exception handlers—using directives

An exception raised within Method 3's domain causes execution to jump to its local exception handler. In a typical application, this exception handler queries the exception object to determine the nature of the exception. The local handler may handle exception types that it recognizes and then may rethrow the exception object to pass notification of the exception to the handler nested above it—that is, the handler in Method 2. However, before the next outer exception handler is invoked, the code in the @finally block associated with the local exception handler is executed. (This has implications for memory management, as discussed in “Exception Handling and Memory Management .”)

An exception that is rethrown appears to the next higher handler just as if the initial exception had been raised within its own exception handling domain. Method 2's exception handler again may handle the exception and may rethrow the exception to Method 1's exception handler; Method 1’s handler does not receive the rethrown exception until Method 2’s @finally block completes its task. Finally, Method 1’s handler rethrows the exception. Because there is no exception handling domain above Method 1, the exception passes to the uncaught exception handler (see “Uncaught Exceptions”).

Nested Exception Handlers With Exception Macros

You program should use the exception-handling macros if it must be compatible with versions of the operating system prior to Mac OS X v10.3. If you are using the exception-handling macros, the code equivalent to that in Listing 1 would look something like Listing 2.

Listing 2  Raising and re-raising an exception


NS_DURING

 ...

 if (someError) {

 NSException *theException = [NSException exceptionWithName:MyAppException reason:@"Some error just occurred!" userInfo:nil];

 [theException raise];

 }

 [self cleanUp];

NS_HANDLER

 if ([[localException name] isEqualToString:MyAppException]) {

 NSRunAlertPanel(@"Error Panel", @"%@", @"OK", nil, nil,

 localException);

 }

 [self cleanUp];

 [localException raise]; /* Re-raise the exception. */

NS_ENDHANDLER

In this code the exception (exception or localException) is raised again at the end of the local handler, allowing an encompassing exception handler to take some additional action. Figure 2 illustrates the use of nested exception handlers, and is discussed in the text that follows.

Figure 2  Control flow with nested exception handlers—using macros

An exception raised within Method 3’s domain causes execution to jump to its local exception handler. In a typical application, this exception handler checks the object localException to determine the nature of the exception. For exception types that it recognizes, the local handler responds and then may send raise to localException to pass notification of the exception to the handler above, the handler in Method 2. (An exception that is re-raised appears to the next higher handler just as if the initial exception had been raised within its own exception handling domain.) Method 2’s exception handler does the same and then re-raises the exception to Method 1’s handler. Finally, Method 1’s handler re-raises the exception. Since there is no exception handling domain above Method 1, the exception is transferred to the uncaught exception handler (see “Uncaught Exceptions”).

Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 10. 5. 23:52
The Basics of Protocols and Delegates

The Basics of Protocols and Delegates



출처 : http://blog.naver.com/PostList.nhn?blogId=philipousys¤tPage=44
Posted by 오늘마감

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 21. 23:55
[번역] Getting started with Audio and Video

원본 링크: http://developer.apple.com/iphone/library/referencelibrary/GettingStarted/GS_AudioVideo_iPhone/index.html

역자주: 오디오와 비디오의 play 를 구분하기 위해 오디오는 연주(play), 비디오는 재생(play) 이라고 번역을 했어요. 참고^^; 그리고 이 번역부터는 원본 문단에 있는 링크를 복사해 오지 않으려고 합니다. 링크 가져오는게 무척 번거럽네요. 지송^^;

오디오와 비디오로 시작하기

개요
iPhone OS 의 멀티미디어 기술은 여러분이 iPhone OS 장치의 사용하기 편리한 오디오와 비디오 기능을 이용할 수 있게 합니다. 여러분
의 어플리케이션에서 오디오를 생성, 녹음, 믹스, 편집, 연주하는 것이 필요하다면 Core Audio 를 사용하시기 바랍니다. 오픈소스로 제공되는 OpenAL 인터페이스는 고성능의 위치 지정이 가능한 연주를 지원하며, 게임에 가장 이상적입니다. Media Player 프레임웍은 비디오 파일의 꽉찬 화면의 재생을 지원하며, 사용자의 iPod 라이브러리 안의 오디오들의 재생도 제공합니다. iPhone OS 3.0 에서 부터 여러분은 여러분의 어플리케이션에 비디오 녹화 기능 또한 추가할 수 있습니다.

기본

여러분이 오디오 관련 코드를 작성하기 전에...

[] [Core Audio Overview] 안의 [What Is Core Audio] 을 읽어야 합니다. 이것으로 여러분은 iPhone OS 에서 오디오 서비스로의 기본적인 인터페이스에 친숙해져 합니다.

[] 또한 iPhone OS 위에서의 오디오 관련 개발을 배우기 위해서 [iPhone Application Programming Guide] 안의 [Using Sound in iPhone OS] 를 읽어야 합니다.

[] 이것의 구조, 프로그래밍 규약, Core Audio 의 사용을 배우기 위해서 [Core Audio Overview] 안의 [Core Audio Essentials] 역시 읽어주기 바랍니다.

[] 사운드를 연주하는 방법을 보여주는 [avTouch] 샘플과 기본적인 녹음과 연주를 보여주는 [SpeakHere] 샘플, 그리고 진동을 발생시키고(역자주: 모바일의 진동음을 이야기하는 것 같네요) 경고음을 연주하고 사용자를 위한 음향 효과를 만드는 방법을 보여주는 [SysSound] 샘플을 참고해야 합니다.

비디오 관련 코드를 작성하기 전에...

[] iPhone OS 위에서의 비디오 녹화와 재생의 기본적인 내용을 위해서는 [iPhone Application Programming Guide] 안의 [Using Video in iPhone OS] 를 읽어주기 바랍니다.

다음 과정들

여러분이 작성하려는 어플리케이션의 요구 사항을 바탕으로 오디와 비디오 관련의 다양한 API 를 선택할 것입니다. 모든 iPhone 개발자들은 오디오 세션에 대해서 배울 필요가 있습니다.

오디오 세션을 사용하기

iPhone OS 내의 Audio Session Service 를 이용하여 여러분은 걸려오는 전화와 같은 인터럽트에 대한 어플리케이션의 대응 처리를 관리할 수 있으며, 사용자들이 헤드셋을 모바일에서 뽑았을 때 처럼의 오디오 흐름 변화를 관리할 수 있습니다. 이러한 기술을 이용하여 또한 여러분은 오디오의 상태를 지정할 수 있습니다. 가령 사용자가 [링/무음] 상태에서 [무음] 상태로 변경을 할 때 여러분의 오디오를 정지시킬 것인지 아니면 계속 지속시킬 것인지 설정할 수 있습니다.

오디오를 사용하는 모든 iPhone 어플리케이션은 반드시 Audio Session Services 를 사용해야만 합니다. 더 많은 정보를 위해서는, [Audio Session Programming Guide] 를 읽어 주시기 바랍니다. 녹음과 재생이 필요한 어플리케이션에서 이러한 기술을 사용하는 방법의 예는 [SpeakHere] 샘플을 참고하시기 바랍니다.

오디오를 연주하기
여러분의 필요에 따라서, 여러분은 AVAudioPlayer 클래스, Audio Queue Services, OpenAL, I/O 오디오 unit 또는 System Sound Services 를 이용하여 iPhone OS 에서 오디오를 연주할 수 있습니다. 또한 여러분은 iPod Library Access API 들을 이용하여 사용자의 iPod 라이브러리에 있는 오디오들을 연주할 수 있습니다.

[] 임의 구간의 사운드를 연주하거나, 동시에 여러 사운드를 연주하거나, 레벨 제어를 하면서 사운드를 연주하기 위해서는, AVAudioPlayer 클래스를 이용합니다. 이러한 기술은 MP3, AAC, ALAC(애플의 무손실 포맷), IMA4, 선형 PCM 포맷은 물론이고 iPhone OS 에서 제공되는 어떠한 종류의 오디오 포맷을 연주할 수 있습니다. 이러한 기술을 위해서 [iPhone Application Programming Guider] 와 [AVAudioPlayer Class Reference] 를 참고하십시오. 또한 [avTouch] 샘플도 참고하십시오.

[] 정밀한 제어를 하면서 사운드를 연주하기 위해서 (가령 동기화를 위해서), 또는 인터넷 스트리밍을 캡처한 오디오를 연주하기 위해서는, [Audio Queue Services] 를 사용합니다. 더 자세한 내용은 [Audio Queue Services Programming Guide] 를 참고하십시오. 샘플 코드는 [SpeakHere] 를 보십시오.

[] 위치를 지정하여 오디오를 연주하기 위해서(특히 여러분의 어플리케이션이 게임이라면), OpenAL 를 사용하십시오. 이것은 http://openal.org 에서 소개되어 있습니다. 이 기술을 사용한 것에 대한 중요한 정보를 위해서 OpenAL FAQ 를 참고하십시오. 샘플 코드는 [oalTouch] 를 보십시오.

[] 가장 저수준의 I/O 접근을 하면서 사운드를 연주하기 위해서, 또는 동일한 시간에 오디오의 입력과 출력을 제공하기 위해서는, I/O 오디오 유닛을 사용합니다. 음성 채팅 어플리케이션을 위해서는 Voice Processing I/O 오디오 유닛을 사용합니다. 자세한 내용은 [System Audio Unit Access Guide] 와 [aurioTouch] 샘플을 참고하십시오.

[] 경고음을 연주하거나, 사용자 인터페이스를 위한 사운드 효과를 연주하거나, 진동음을 발생시키기 위해서는 System Audio Services 를 사용합니다. 이 기술은 .caf, .wav, .aif 포맷의 30초 또는 그 이하 길이를 갖는 사운드를 연주할 수 있습니다. 자세한 내용은 [iPhone Application

Programming Guider] 에서 [Using Sound in iPhone OS] 를 참고하십시오.

[] 사용자의 iPod 라이브러리에 있는 오디오를 연주하기 위해서는 Media Player 프레임웍에 있는 iPod Library Access API 들을 사용하십시오.  자세한 내용은 [iPod Library Access Programming Guider] 를 참고하십시오. 또한 샘플은 [AddMusic] 을 보십시오.

스트리밍되는 오디오를 사용하기

여러분은 스트리밍되는 오디오를 캡처하거나 연주할 수 있습니다.

[] 네트웍 연결로 부터 스트리밍되는 오디오를 분석하기 위해서는, [Audio File Stream Services Reference] 에서 설명된 [Audio File Stream Services] 를 사용합니다.

[] 캡처된 스트리밍 오디오를 연주하기 위해서는, [Audio Queue Services Programming Guide] 와 [Audio Queue Services Reference] 를 보십시오.

[] 여러분은 MPMoviePlayerController 클래스를 사용하여 AAC-LC 포맷으로 된 인터넷 오디오 파일 또한 연주할 수 있습니다. 이것에 대한 예는 [MoviePlayer] 샘플을 참고하시기 바랍니다.

오디오를 녹음하기

iPhone 에서 사운드를 녹음하기 위해서는, [AVAudioRecorder Class Reference] 에서 설명된 것처럼 [AVAudioRecorder] 를 사용하십시오.

여러분은 또한 [Audio Queue Services Programming Guide] 와 [Audio Queue Services Reference] 에서 설명된 [Audio Queue Services] 를 사용하여 사운드를 녹음할 수도 있습니다. iPhone OS 에서 지원되는 모든 종류의 오디오를 녹음하는 방법은 [SpeakHere] 샘플에서 볼 수 있습니다.


 

비디오를 재생하기
MPMoviePlayerController 클래스는 H.264 (baseline profile level 3.0) 포맷으로 또는 MPEG-4 part 2 (simple profile) 의 비디오 포맷으로 비디오 재생을 지원합니다. 비디오 재생은 꽉찬 화면을 지원하며 주로 애니매이션 재생이 필요한 게임 개발자를 위해 특화되어 있습니다.

여러분은 또한 [MoviePlayer] 샘플에서 보여지는 것처럼 인터넷으로 부터 스트리밍되는 비디오를 재생하기 위해서 MPMoviePlayerController 클래스를 사용할 수 있습니다. 여러분의 어플리케이션에 비디오 재생 기능을 추가하는 것에 대한 자세한 내용은 [iPhone Application Programming Guide] 안에 [Playing Video Files] 를 읽기 바랍니다.

비디오를 녹화하기
iPhone OS 3.0 에서 부터, 여러분은 지원되는 장치 바탕으로 오디오를 포함하고 있는 비디오를 녹화할 수 있습니다. 단지 정지 이미지를 캡처하는 것에 대해서는 UIImagePickerController 클래스를 사용합니다. 자세한 내용은 [iPhone Application Programming Guide] 안에 [Recording Video] 를 참고하시고,  [UIImagePickerController Class Reference] 도 참고하기 바랍니다.

추가 리소스들

iPhone Dev Center 는 여러분의 어플리케이션에 멀티미디어 기능 추가를 위해서 기본적인 지침, 참고 문서와 기술 조언, 샘플 코드를 제공합니다.

Core Audio 메일링 리스트 (coreaudio-api@lists.apple.com) 는 같은 관심사를 갖고 있는 개발자들과 Core Audio 와 OpenAL 관련 문제를 토론할 수 있는 매우 훌륭한 수단입니다.

iPhone 개발자 포럼에서 여러분은 질문을 하거나 어떠한 주제 또한 모든 iPhone 개발 주제에 대한 답변을 볼 수 있습니다.


 



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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 21. 23:55
[번역] Getting started with Networking and Internet.

원본 링크: http://developer.apple.com/iphone/library/referencelibrary/GettingStarted/GS_Networking_iPhone/index.html

네트웍과 인터넷으로 시작하기

개요

iPhone 의 O/S 는 몇가지의 프레임웍과 라이브러리를 갖고 있으며, 이것은 네트웍과 인터넷을 기반으로 하는 여러분들의 어플리케이션에서 사용하도록 제공하는 것입니다. 따라서 여러분들은 Foundation 과 Core Foundation 또한 CFNetwork 과 BSD 소켓들을 이용하여 일반적인 네트웍 프로토콜과 서비스에 접근할 수 있습니다.

[] Foundation 은 Objective-C 기반의 프레임웍이며, CFNetwork 의 API 사용을 위한 객체 지향형의 추상화(abstraction)를 제공합니다.

[] Core Foundation 은 C 기반의 프레임웍이며, URL 자원을 생성, 접근, 갱신 또는 삭제하기 위한 편리하고(다른 것들에 비해서) 시스템에 독립적인 방법을 제공합니다.

[] CFNetwork 은 C 기반의 프레임웍이며, 여러분들의 어플리케이션의 다양한 네트웍 처리를 위해서 제공된 것입니다. 가령, 실행 루프를 갖는 소켓들의 통합과 HTTP 와 FTP 서버들과의 의사 소통이 예가 될 수 있습니다.

[] CFNetServices 는 C 기반의 API 이며, 이것으로 여러분은 Bonjour 네트웍 서비스를 찾거나 등록할 수 있습니다; 가령 프린터나 파일 서버 등을 말합니다.

[] BSD 네트웍 API (libSystem 의 일부인) 들은 저수준의 소켓 함수들이며, 만일 여러분들이 이미 다른 플랫폼을 경험해 본 적이 있다며, 이것은 여러분에게 어렵지 않을 것입니다.

여러분이 이러한 인터페이스를 사용할 때, 여러분은 Wi-Fi 또는 모바일 기반의 신호를 선택할지 고민할 필요가 없습니다.

이 인터페이스들은 자동적으로 기본적인 하드웨어 장치에 접근하며, 최적의 신호를 선택하고, 필요에 따라 신호들 사이에서 끊김없이 부드럽게 왔다갔다 할 수 있습니다.

기본

여러분이 코드를 작성하기 이전에 아래 사항을..

[] iPhone OS 환경 위에서의 네트웍 어플리케이션을 개발할 때,
고려해야 할 문제들에 언급하고 있는 [Document Transfer Strategies]
를 읽으시기 바랍니다.

[] 여러분의 네트웍 관련 코드를 작성하기 위해 여러분이 선호하는 언어를 선택합니다. iPhone OS 는 C 와 Objective-C 로 작성된 네트웍 코드를 지원합니다. 여러분의 선택은 여러분이 가장 편안하게 느끼는 언어에 따라 결정하는 것과 다른 플랫폼으로 부터 기존 네트웍 코드를 가져올 것이냐에 따라 결정됩니다.

[] 여러분이 소켓을 통해 직접 작업할 것인지, 추상 계층을 사용할 것인지 결정합니다.

[] iPhone OS 는 소켓을 통해 직접 작업하는 것을 불필요하게 만드는 것으로 대부분의 소켓 상호 작용 기능을 위해서 편리한 추상 계층을 제공합니다.

[] 기존 네트웍 서비스를 찾기 위해서 Bonjour 를 사용할 것인지 새로운 것들을 등록할 것인지를 결정합니다.

여러분이 위의 과정을 거친 다음에는, 여러분은 어떤 네트웍 API (기존 또는 여러분이 원하는 것들 중에서) 을 선택할 것인지 알 수 있게 됩니다.

다음 과정들
만일 여러분이 네트웍 위에서 작동하는 어플리케이션을 개발한다면, 여러분은 네트웍 프로토콜과 서비스를 이용하기 위해서 iPhone OS 가 제공하는 API 들에 익숙해지기를 원할 것입니다. 만일 여러분이 웹서버와 연동되는 어플리케이션을 개발한다면, 예를들어, 여러분은 Core Foundation 또는 Foundation 에 포함된 애플의 HTTP 기반의 API 를 선택할 것입니다. 만일 소켓을 직접 사용하는 어플리케이션을 개발한다면, 여러분은 다양한 소켓 API 를 이해해야만 합니다. 이러한 과정이 서로 분리된 것처럼 보임에도 불구하고, 이러한 것들은 필수적으로 상호 독립적이지는 않습니다.(역주: 서로가 상당히 연관이 있을 수 밖에 없다는 얘기인것 같네요.)

URL 을 이용하여 리소스를 다운로드하기
Cor Foundation URL 접근 유틸리티, 즉 CFURL 과 NSURL API 는 가장 기본적으로 제공되며, 이들은 웹서버 또는 FTP 서버로 부터 개개의 파일들 또는 다른 리소스들의 다운로드를 위해 쉬운 방법을 제공하고 있습니다.

[] C 기반의 CFURL 은 Core Foundation 프레임웍 중의 일부입니다. 여러분은 [CFURL Reference] 에서 자세한 내용을 배울 수 있습니다.
[] Objective-C 기반의 NSURL 은 Foundation 프레임웍 중이 일부입니다. 여러분은 [NSURL Class Objective-C Reference] 에서 자세한 내용을 배울 수 있습니다.

HTTP 와 FTP Stream 을 이용한 웹과 파일 서버와 연동하기
만일 여러분의 어플리케이션이 CFURL 또는 NSURL 에 의해 제공되는 기능을 통해 웹서버 또는 FTP 서버와 연동하는 것이 필요하다면, 여러분은 CFHTTPStream 과 CFFTPStream API 들을 사용해야 할 것입니다. 이들은 HTTP 의 GET, POST 요청, HTTP 의 쿠키와 요청 헤더 관리, FTP 의 디렉토리 조회, FTP 의 파일 업로딩과 같이 복잡한 HTTP 와 FTP 의 요청에 대한 지원을 제공합니다.

일반적으로 이러한 API 를 배우기 위해서는, [CFNetwork Programming Guide] 를 참고해야 합니다. 자세한 API 관련 문서는 [CFHTTPStream Reference] and [CFFTPStream Reference] 를 참고하시기 바랍니다.

소켓을 이용하여 통신하기

만일 여러분이 소켓을 사용한다면, iPhone OS 에서 제공하는 실행-루프 소켓의 통합 API 를 사용할 수 있으며 또한 이러한 API 에 있는 BSD 소켓으로의 직접 접근을 사용할 수 있습니다.

[] 만일 여러분이 맥 OS X 기반의 네트웍 어플리케이션을 계획하고 또한 iPhone OS 기반의 네트웍 어플리케이션을 만들고 싶다면, 여러분은 동일한 네트웍 API 들을 이용할 수 있습니다.

만일 소켓 수준의 CFNetwork API 로 작업하기로 결정한다면, 여러분은 [CFNetwork Programming Guide] 와 [CFNetwork Framework Reference] 을 반드시 참고해야 합니다.

[] iPhone OS 에서 BSD (POSIX) 네트웍 API 제공됨에도 불구하고, 여러분은 이들을 사용하지 말아야한다. 만일 소켓으로 직접 통신한다면, 즉 On-demand 방식의 VPN 과 같은 iPhone OS 의 특정 네트웍 기능, 이러한 직접 통신을 사용하지 않기를 바랍니다. 대신 [CFStream Socket Additions] 에서 제공되는 API 를 사용해야 합니다.

BSD (POSIX) 네트웍에 대해 알기 위해서는,  예제 코드와 일반적인 정보를 위해서 [UNIX Socket FAQ] 웹사이트를 참고해야 합니다. API 에 대한 자세한 내용은 [iPhone OS 의 메뉴얼 페이지]에서 소켓(2) 를 읽어주기 바랍니다.

네트웍 서비스를 등록하기와 찾기

여러분은 Bonjour 를 사용하여 네트웍 서비스를 찾거나 네트웍 서비스를 등록할 수 있습니다.
이것을 하기 위해서는, C 기반의 CFNetServices 또는 Objective-C 기반의 NSNetServices API 를 사용해야 합니다.

이러한 API 들은 [NSNetServices and CFNetServices Programming Guide] 에 설명되어 있습니다. 이러한 API 의 CFNetwork 과 Foundation 형식에 대해 각각  [CFNetServices Reference] and [NSNetService Class Reference] 을 읽어 주시기 바랍니다.

역자주: 제가 아직 개발을 시작하지 않아서, 위에서 네트웍 서비스를 discover, register 한다는 의미가 크게 와닿지를 않네요. 오역이 안되었기를 바라며, 혹시 오역이라면 댓글 부탁합니다.

2010년 2월 27일 00:16 경부고속도로 아래에서..



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

댓글을 달아 주세요