아이폰 어플을 개발하다보면 현재 인터넷 접속이 가능한지 확인해야할 필요가 있다. 또 사용성 측면에 있어서도 네트워크가 연결되어 있는 상태인지 확인해서 인터넷 사용이 가능한지 메시지를 보여주는 일도 중요할 수 있다. 또 어떠한 경우에는 3G인지 WiFi인지 알 필요가 있을 수 있다.

 

이러한 일을 위해 직접 만드는 것도 좋지만, 빠르게 어플을 개발해야하는 입장에서는 그것마저 부담스럽니다. 

그러므로 검색이 필요하다. 

 

검색해보니깐 아주 유용한 소스를 발견했다. 바로 Reachability 이다. 

애플 예제소스로 공개된 것이다.

 

http://developer.apple.com/iphone/library/samplecode/Reachability/Introduction/Intro.html

 

위에서 제공하는 소스를 다운로드 받아 X-code에서 직접 실행해보자. 네트워크 상태를 껐다가 켰다가 하면서 실험해보자. 잘 동작한다. 아래는 본인이 직접 시뮬레이터 상에서 동작시켜본 것이다. 

 

 


사용법은 단순하다.

1. Reachability.h와 Reachability.m을 자신의 프로젝트의 클래스로 등록한다.

2. SystemConfiguration.framework 프레임워크를 추가시킨다. 

3. 사용한다. ^^

 

가령 현재 상태가 WiFi인지 WWAN(3G)인지 확인하려면 아래처럼 코딩을 하면 되겠다.


 


실시간으로 네트워크 상태변화를 감지하고 싶다면 Notification기능을 활용하면 된다. 이미 샘플코드에 다 정리가 되어 있지만 간단하게 설명하자면... 

 

먼저 아래와 같은 코드를 application:didFinishLaunchingWithOptions:와 같은 함수등에 넣는다. 여기서 _internetReach 변수는 Reachability *_internetReach;로 클래스 변수로 정의해둔다. 또한 dealloc시에는 [_internetReach release];_internetReach=nil;로 메모리 해제를 해주어야 한다.


 

그리고 다음과 같은 2개의 함수를 넣어서 간단하게 감지할 수 있도록 만들면 된다. 


 


이것으로 인터넷 연결상태를 실시간으로 감지할 수 있게 된다. 

 

개발자에 따라서 특정한 웹서버에 접속이 원할한지 확인할 필요가 있을지 모른다.

그러한 경우에는 샘플코드를 보면 아래와 같은 방법으로 사용했다. 

 

[[Reachability reachabilityWithHostName: @"www.apple.com"] retain];


이외에 샘플코드에 Local WiFi 감지를 하는 부분이 있는데, 사실 무슨의미인지는 잘 모를뿐더러 어디서 보니깐 실제 인터넷 접속감지는 위에서 소개한 2가지 방법만 사용해도 문제가 없는 것 같다.

 

동영상 강좌도 있다.

http://answers.oreilly.com/topic/1218-how-to-check-the-status-of-the-network-connection-from-your-iphone-app/

 

아주 간단하게 만들어진 소스도 있다.

http://theeye.pe.kr/entry/how-to-check-network-connection-on-iphone-sdk


 

신고
Posted by genius3k

관련링크

http://www.computer-vision-software.com/blog/2009/04/opencv-vs-apple-iphone/comment-page-1/

http://niw.at/articles/2009/03/14/using-opencv-on-iphone/en

http://zaaghad.blogspot.com/2009/02/universal-i386arm-opencv-framework-for.html

신고
Posted by genius3k

문자열 공백제거

IPhone 2010.07.25 15:34
1. 공백과 탭 제거(whitespaceCharacterSet)

NSString *newString = [oldString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];


2. 공백과 탭 및 개행(newlines) 제거(whitespaceAndNewlineCharacterSet)

NSString *newString = [oldString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

신고
Posted by genius3k
이론~!!! 이젠 진짜 증강현실 어플들 많아지겠네 
Video Capture Session을 초기화 하는 함수

- (BOOL)initVideoCapture {

AVCaptureDeviceInput *captureInput =[AVCaptureDeviceInput deviceInputWithDevice:[AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]

  error:nil];

AVCaptureVideoDataOutput *captureOutput = [[AVCaptureVideoDataOutput alloc] init];

[captureOutput setSampleBufferDelegate:self queue:NULL];

NSString *key = (NSString *)kCVPixelBufferPixelFormatTypeKey;

NSNumber *val = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];

NSDictionary *videoSettings = [NSDictionary dictionaryWithObject:val forKey:key];


[captureOutput setVideoSettings:videoSettings];


AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];

[captureSession addInput:captureInput];

[captureSession addOutput:captureOutput];

[captureSession beginConfiguration];

[captureSession setSessionPreset:AVCaptureSessionPresetHigh];

[captureSession commitConfiguration];

[captureSession startRunning];

return YES;

}


- (void)captureOutput:(AVCaptureOutput *)captureOutputdidOutputSampleBuffer:(CMSampleBufferRef)sampleBufferfromConnection:(AVCaptureConnection *)connection {

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);

CVPixelBufferLockBaseAddress(imageBuffer, 0);

// Get information of the image

uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);

size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);

size_t width = CVPixelBufferGetWidth(imageBuffer);

size_t height = CVPixelBufferGetHeight(imageBuffer);

// Create Colorspace

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace,

kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);

CGImageRef newImage = CGBitmapContextCreateImage(newContext);

// Copy image data

/*

24.

CFDataRef dataref = CGDataProviderCopyData(CGImageGetDataProvider(newImage));

25.

memcpy(mImageData, dataref, 640 * 480 * sizeof(char) * 4);

26.

CFRelease(dataref);

27.

*/

UIImage *image = [UIImage imageWithCGImage:newImage];

[imageView setImage:image];

[imageView setFrame:CGRectMake(0, 0, width, height)];

// Release it

CGContextRelease(newContext);

CGColorSpaceRelease(colorSpace);

CGImageRelease(newImage);

// Unlock the image buffer

CVPixelBufferUnlockBaseAddress(imageBuffer,0);

// CVBufferRelease(imageBuffer);

}


참고사이트: http://forum.unity3d.com/viewtopic.php?p=300819
신고

'IPhone' 카테고리의 다른 글

OpenCV를 iphone에서 사용하는 방법법  (0) 2010.09.16
문자열 공백제거  (0) 2010.07.25
드디어 오픈된 카메라 프레임 얻어오는 함수  (0) 2010.06.29
입력  (0) 2010.05.17
UIView,CGPoint,CGRect  (0) 2010.05.07
사진 가져오기  (1) 2010.05.03
Posted by genius3k

입력

IPhone 2010.05.17 00:14
NSString *post =[NSString stringWithFormat:@"playerName=%@&playerId=%d&pLevel=%d&playerScore=%d",name,pid,plevel,pscore];
		NSLog(@"post-%@",post);
		NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
 
		NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
 
		NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://........./...../update.php"]];
		[request setHTTPMethod:@"POST"];
	        [request setCachePolicy:NSURLCacheStorageNotAllowed];
                [request addValue:@"text/plain" forHTTPHeaderField:@"content-type"];
		//[request addValue: @"multipart/form-data; boundary=0194784892923" forHTTPHeaderField: @"Content-Type"];
 
		[request setHTTPBody:[post dataUsingEncoding: NSASCIIStringEncoding]];		
 
		 NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self]; 
		if (!conn)
                  {
			UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"A Connection could not be established!"
			delegate:nil  cancelButtonTitle:@"OK"  otherButtonTitles: nil];
			[alert show];
			[alert release];
			return;
               }
신고

'IPhone' 카테고리의 다른 글

문자열 공백제거  (0) 2010.07.25
드디어 오픈된 카메라 프레임 얻어오는 함수  (0) 2010.06.29
입력  (0) 2010.05.17
UIView,CGPoint,CGRect  (0) 2010.05.07
사진 가져오기  (1) 2010.05.03
Post a UIImage to the web  (0) 2010.04.28
Posted by genius3k

UIView,CGPoint,CGRect

IPhone 2010.05.07 07:31
UIview
- 아이폰 화면에 보여지는 대부분은 View
 색, 그림, 버튼들을 가질 수 있다
- 드래그, 크기 조정,  등이 가능
- UIView는 GUI를 구성하는 단위 블록
- UIWindow는  UIView
01.//parentView(상위뷰)에 childView(하위뷰) 추가
02.[parentView addSubview:childView];
03. 
04.//parentView(상위뷰)가 가진 하위뷰들의 배열을 가져오기 (가장 뒤부터 가장 앞까지)
05.[parentView subview];
06. 
07.//childView(하위뷰)를 자신이 속한 상위뷰로부터 제거
08.[childView removeFromSuperview];
09. 
10.//i번째에 있는 하위뷰를 j번째에 있는 하위뷰와 순서를 바꿈
11.[parentView exchangeSubviewAtIndex:i withSubviewAtIndex:j];
12. 
13.//View의 투명도 조정 (value값은 0.0[완전투명]부터 1.0[완전불투명]까지)
14.[myView setAlpha:0.5];
15. 
16.//뷰의 배경색 지정
17.[myView setBackgroundColor:[UIColor redColor]];


CGPoint
- 포인트는  y 좌표로 정의된 위치를 말한다.
1.//x, y의 CGPoint를 생성한다.
2.CGPointMake(x, y);
3. 
4.//CGPoint를 문자열로 변환한다.
5.NSStringFromCGPoint(someCGPoint);
6. 
7.//문자열을 CGPoint로 변환한다.
8.CGPointFromString(aString);
 

CGSize
- 폭과 높이를 가지는 구조체
1.//width, height의 CGSize를 생성한다.
2.CGSizeMake(width, height);
3. 
4.//CGSize를 문자열로 변환한다.
5.NSStringFromCGSize(someCGSize);
6. 
7.//문자열을 CGSzie로 변환한다.
8.CGSizeFromString(aString);

 
CGRect
- 모든 View는 경계를  데 프레임을 사용한다.
- 프레임은 뷰의 위치, 폭, 높이와 같은  지정한다.
- 코어 그래픽 구조를 사용하여 프레임 직사각형을 정의한다.
 보통 시작점(CGPoint)과 크기(CGSize)로 구성된다.
01.//직사각형 정의
02.CGRectMake(origin.x, origin.y, size.width, size,height);
03. 
04.//CGRect 구조체를 특정 형식을 가진 문자열로 변환한다.
05.NSStringFromCGRect(someCGRect);
06. 
07.//위의 코드로 변환된 특정 형식을 가진 문자열을 CGRect구조체로 복구한다.
08.CGRectFromString(aString);
09. 
10.//직사각형의 위치에서 직사각형의 크기만큼 외곽을 잘라내거나 덧붙인 가운데 정렬된 직사각형을 만든다. 양수로는 잘라내고 음수로는 덧붙여 만들게 된다.
11.CGRectInset(aRect);
12. 
13.//직사각형 구조체 rect1과 rect2가 겹치는지 알 수 있다.
14.CGRectIntersectsRect(rect1, rect2);
15. 
16.//(0,0)에 가로, 세로 길이가 0인 직사각형 상수
17.CGRectZero;

신고

'IPhone' 카테고리의 다른 글

드디어 오픈된 카메라 프레임 얻어오는 함수  (0) 2010.06.29
입력  (0) 2010.05.17
UIView,CGPoint,CGRect  (0) 2010.05.07
사진 가져오기  (1) 2010.05.03
Post a UIImage to the web  (0) 2010.04.28
Xcode SVN 사용법  (0) 2010.03.05
Posted by genius3k

사진 가져오기

IPhone 2010.05.03 11:40

3.0이상의 버전에서는 

- (void)imagePickerController:(UIImagePickerController *)picker 

didFinishPickingMediaWithInfo:(NSDictionary *)info

함수로 이벤트를 밭아야 한다길래 사용해보았다.


일단 아래돠 같이 버튼클릭시 실행할 함수를 만들고 그함수에서는 사진 불러오는 클레스를 생성하게 하였다.

-(IBAction)cameraBtnAction:(id)sender{

UIImagePickerControllerSourceType sourceType;

sourceType = UIImagePickerControllerSourceTypeCamera;

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

picker.sourceType = sourceType;

picker.delegate = self;

picker.allowsEditing = FALSE;

[self presentModalViewController:picker animated:YES];

[picker release];

}


그 다음 헤더파일에 UIImagePickerControllerDelegate를 추가해주어 아래 함수로 사진을 가져올때 이벤트를 받을 수있게 하였지만 라이브러리에서 사진을 가져올때는 잘되지만 사진을 찍어서 가져올때는 절대 안되었다.

- (void)imagePickerController:(UIImagePickerController *)picker 

didFinishPickingMediaWithInfo:(NSDictionary *)info{

UIImage* resizeImage = [self resizeImage:image width:280 height:420];

[selPhotoView setImage:image];

[[picker parentViewController] dismissModalViewControllerAnimated:YES];

}


무식하게 로그를 다 남기면서 테스트한결과 라이브러리로 사진을 가져올때와 달리 카메라를 사용할경우 사진이 찍힐 때

- (void)viewDidUnload 함수가 호출된다. 

그 후 use 버튼을 클릭하게 되면 - (void)viewDidLoad이 함수가 호출되어 다시 로드하게 되는 것이다. 


그래서 


- (void)imagePickerController:(UIImagePickerController *)picker 

didFinishPickingMediaWithInfo:(NSDictionary *)info{

NSLog(@"imagePickerController");

takeImage= [info objectForKey:@"UIImagePickerControllerOriginalImage"];

NiceMFAppDelegate *appDelegate = (NiceMFAppDelegate *)[[UIApplication sharedApplication] delegate];

appDelegate.takeImage = takeImage;

[[picker parentViewController] dismissModalViewControllerAnimated:YES];

}


이렇게 수정하였다. Delegate에서 변수를 만들어서 사진이 찍힐때 이미지 객체를 저장해주고


- (void)viewDidLoad {

    [super viewDidLoad];

NSLog(@"viewDidLoad");

NiceMFAppDelegate *appDelegate = (NiceMFAppDelegate *)[[UIApplication sharedApplication] delegate];

[selPhotoView setImage:appDelegate.takeImage];

}


다시 로드될때 Delegate에 저장해 놓았던 이미지를 가져오게 하였다.


이리 하니 아주 자알된다...

이것때문에 1시간동안이나 삽질을 하다니... ㅠㅠ

신고

'IPhone' 카테고리의 다른 글

입력  (0) 2010.05.17
UIView,CGPoint,CGRect  (0) 2010.05.07
사진 가져오기  (1) 2010.05.03
Post a UIImage to the web  (0) 2010.04.28
Xcode SVN 사용법  (0) 2010.03.05
UITableView에서 Cell의 높이 설정하는 방법 두가지  (0) 2010.03.04
Posted by genius3k

Post a UIImage to the web

So here is something a lot of people have been wondering to do in the forums. How do I take a UIImage or any image and post it to a website. So this will go over how to do that.

There are two ways to tackle this issue. One we can base64 encode the file and post is normally inside a XML or JSON instance or we can simulate a normal HTML post. This tutorial will go over the HTML post.

This will start off where Using a UIImagePickerController left off. So you can grab the code and start there if you want. So lets begin.

So first open up testPickerViewController.h and we want to add in one outlet and one action.

So here is the outlet we want to add

IBOutlet UIButton *upload;

Here is the action we want to add

IBOutlet UIButton *upload;

Now double click on testPickerViewController.xib and we need to connect the new outlet and action. We also need to create our new upload button. So drag around the current items and place the new button under the grab button. Then you want to make the button hidden by default. The option is as shown below. Do get to that selector you do Tools -> Attributes Inspector

You might also want to setup your UIImageView to aspect fit. If the image is larger then your box you created in IB it will shrink the image to fill it. Click on the UIImageView and in the Attributes Inspector select the following drop down for Mode

Now you want to make your connections to the new outlet and action we created in code. So here is another screenshot of what they should look like

Now it is back to the code. So save this and you can quit IB. 

So open up testPickerViewController.m and find the imagePickerController method and at the end add 

upload.hidden = NO;

That will show our upload button once a image is set.

So now we need to create our uploadImage method that gets called then the button is pressed. So it is below and hopefully pretty well commented.

- (IBAction)uploadImage {
	/*
	 turning the image into a NSData object
	 getting the image back out of the UIImageView
	 setting the quality to 90
	*/
	NSData *imageData = UIImageJPEGRepresentation(image.image, 90);
	// setting up the URL to post to
	NSString *urlString = @"http://iphone.zcentric.com/test-upload.php";

	// setting up the request object now
	NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
	[request setURL:[NSURL URLWithString:urlString]];
	[request setHTTPMethod:@"POST"];

	/*
	 add some header info now
	 we always need a boundary when we post a file
	 also we need to set the content type

	 You might want to generate a random boundary.. this is just the same
	 as my output from wireshark on a valid html post
	*/
	NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
	NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
	[request addValue:contentType forHTTPHeaderField: @"Content-Type"];

	/*
	 now lets create the body of the post
	*/
	NSMutableData *body = [NSMutableData data];
	[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
	[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"ipodfile.jpg\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
	[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
	[body appendData:[NSData dataWithData:imageData]];
	[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
	// setting the body of the post to the reqeust
	[request setHTTPBody:body];

	// now lets make the connection to the web
	NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
	NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

	NSLog(returnString);
}

So now if you build and go you will upload the image you selected to the following image URL

http://iphone.zcentric.com/uploads/ipodfile.jpg

Below is my PHP file I am using to handle uploads.

$uploaddir = './uploads/';
$file = basename($_FILES['userfile']['name']);
$uploadfile = $uploaddir . $file;

if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "http://iphone.zcentric.com/uploads/{$file}";
}

It is nothing special. I do an echo so you can see in the console what the file is. If you switch the filename=”" part in the uploadImage section it will be placed as another file.

Files will be removed once they are 10 minutes old on the server so they won’t last but you can use it as a playground.

As always here is my code.

원문 http://iphone.zcentric.com/2008/08/29/post-a-uiimage-to-the-web/

신고
Posted by genius3k

Xcode SVN 사용법

IPhone 2010.03.05 17:23

http://developer.apple.com/mac/library/documentation/DeveloperTools/Conceptual/XcodeSourceManagement/30-Source_Control/source_control.html
신고
Posted by genius3k

1. UITableView의 rowHeight속성을 사용하는 방법
UITableView.rowHeight=높이값
이방법을 사용할 경우 모든 Cell의 높이가 동일하게 적용되지만 performance는 좋다

2. tableView:heightForRowAtIndexPath:를 재정의 하여 설정하는 방법
이방법은 각각의 셀의 높이를 다이나믹하게 설정할수 있지만 비싼 performance의 대가를 치뤄야 한다는데 사용해보니 정말그런지 잘 모르겠다 ㅎㅎㅎㅎ
신고
Posted by genius3k

티스토리 툴바