제목 그대로, UIImageView에 웹 상의 이미지를 띄우는 방법을 알아보자.


1. xib에 UIImageView 생성
- xib에서 Object Library에 있는 Image View를 끌어다가 생성한다.


2. 헤더에 UIImageView 객체 생성
- 위에서 사용한 xib와 연결된 헤더 파일에서 UIImageView 객체를 생성한다.
@interface SampleViewController : UIViewController {
    UIImageView *webImage;
}
@property (nonatomicretainIBOutlet UIImageView *webImage;



3. 구현파일에 @synthesize 코딩

@implementation SampleViewController
@synthesize webImage;



4. 이미지 뷰를 나타내고자 하는 메서드 안에서 웹 상의 이미지를 UIImageView로 불러오기(여기서는 ViewDidLoad에 구현)

- (void) viewDidLoad {
    [super viewDidLoad];
    NSURL *imageURL = [NSURL URLWithString:@"http://static.naver.net/www/u/2010/0611/nmms_215646753.gif"];
    NSData *imageData = [NSData dataWithContentsOfURL:imageURL];        
    webImage.image = [UIImage imageWithData:imageData];
    
}



끝!


이미지 경로가 가변적이라면, 웹 상의 이미지가 없을 경우(imageData가 nil일 경우) 예외 처리를 해주면 좋다.



웹뷰를 사용하여 각종 처리를 할 때, 특히 로그인과 관련된 처리를 할 때 특정 사이트에 대한 쿠키를 삭제하고 싶은 경우가 있다. 예를 들어 한 사이트에 여러 개의 계정을 사용할 경우 쿠키를 삭제하지 않고 다른 계정으로 바로 로그인한다면 이전 계정 정보와 겹쳐 꼬일 수 있다.


뭐 기타 등등의 이유로 쿠키를 삭제해야 할 경우가 있을텐데, 특정 사이트에 대한 쿠키를 삭제하는 방법은 매우 간단하다. 아래 코드와 같다.


    //쿠키 삭제
    NSHTTPCookieStorage *cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray *someCookies = 
    [cookies cookiesForURL:[NSURL URLWithString:@"http://website.com"]];
    
    for (NSHTTPCookie *cookie in someCookies){
        [cookies deleteCookie:cookie];
    }


우선 쿠키 객체를 생성하고, 특정 URL에 대한 쿠키를 Array에 집어넣은 후 deleteCookie 메서드를 사용하여 삭제하면 된다.


끝!



아이폰 어플리케이션을 개발하는데 있어서 Push Notification 기능을 개발하기 위해서는 애플 개발자 계정을 등록하고, Provisioning 파일을 받아야 한다. 이때 참고한 사이트는 아래와 같다.


그런데 위 두 포스트에 자세히 설명되어 있는대로 그대로 따라서 했으나, device token을 계속해서 받아오지 못하는 것이다! 


Error: Error Domain=NSCocoaErrorDomain Code=3000 "응용 프로그램에 대해 발견된 'aps-environment' 인타이틀먼트 문자열 없음"


이라는 오류가 나왔는데 구글링을 해보니, 이는 프로비저닝 파일이 잘못되었기 때문이니 프로비저닝 파일을 지우고 다시 다운로드 해보라는 답들을 얻었다. 이러한 답을 얻은 곳들 중 대표적인 사이트는 아래와 같다.


http://blog.jidolstar.com/725


그런데 프로비저닝 파일을 지우고 다시 설치하기를 4~5번을 해도 같은 에러만 반복해서 나오고 device token은 받아오지 못한다. 빡쳐서 인증서까지 싹 다 지우고 처음부터 다시 하기도 3번 정도 반복했는데도 같은 에러... 인내심의 한계를 느끼며 좌절하다가 주말을 보내고 나서 상쾌한 마음으로 월요일 아침 출근! 역시 산틋한 마음으로 살펴봐서 그런지 문제를 드디어 해결했다.



1) App IDs를 생성할 때 Bundle Identifier (App ID Suffix) 를 입력하는 곳이 있다. 애플에서는 예로 com.domain.appname을 들어줬는데, 이때 domain부분과 appname 부분을 그냥 꼴리는대로 입력하면 안 되고, 잘 입력해야 한다.


2) xcode의 좌측 메뉴에서 프로젝트를 클릭해보면 Summary를 볼 수 있다. 여기에서 Bundle Identifier가 있는데 이를 위에서 생성한 App IDs의 Bundle Identifier와 동일하게 입력해준다.(만약 수정이 불가하게 되어있다면, 이에 맞추어 App IDs를 다시 생성해야겠지?)


3) xcode에서 summary 옆옆에 있는 Build Settings를 클릭하여 검색창에서 Code Signing을 검색해보면 해당 부분이 나온다. 이 부분에서 Code Signing Identity를 비롯한 아래에 선택할 수 있는 부분들을 자기가 받았던 프로비저닝으로 잘 선택이 되어있는지 확인하고, 잘 되어있지 않다면 제대로 선택해준다.



이 3단계를 거치니깐 드디어 device token 을 받아오게 되었다. 


이제 device token을 받아왔으니 본격적으로 push 기능 개발 고고싱!





뷰를 전환할 때 모달 뷰(Modal View) 형태로 띄우고 싶을 경우를 위해 포스팅을 해본다. 해놓고 나니 완전 기초 코드였고 도대체 내가 왜 헤맸을까 싶기도 했지만, 처음에는 모달 뷰라는 것이 뭔지도 몰랐고 어버버버 하다가 구글링에 구글링을 거듭해 겨우 해냈던거 ㅜㅜ

 

0. 목표

우선 하려고 하는 바를 정리해보면, 뷰를 2개 만들고, 뷰1에서 버튼을 클릭하면 뷰2가 모달 뷰로 나타나도록 하고 여기에 전환 효과를 살짝 넣어보는 것이다. 그리고 뷰2에서 닫기 버튼을 클릭하면 모달 뷰가 사라지고 다시 뷰1이 나타나게 한다.

 

1. 뷰 2개 생성하기

뷰를 2개 만들어준다. 처음에 프로젝트를 생성할 때 view based project로 생성하면, "프로젝트명ViewController"와 함께 스토리보드 혹은 xib파일이 생성되니 이미 뷰 1개는 만든 것이다. 그리고 뷰 하나 추가는 New File을 생성할 때 View Controller Subclass로 생성하면 .h, .m, .xib파일이 하나씩 생성된다. 이로써 뷰 2개 생성은 완료! 아래 코드에서는 편의상 뷰1의 뷰컨트롤러는 뷰1.h, 뷰1.m라 하고, 뷰2의 뷰컨트롤러는 뷰2.h, 뷰2.m 이라고 하자.

 

2. 뷰1 헤더파일(뷰1.h)에 메서드 선언

- (IBAction)popupSetting;

이 메서드는 뷰1의 스토리보드나 xib에 만들 버튼에 연결할 메서드이다. 헤더파일에 선언 한 다음에 스토리보드나 xib에서 버튼 만들고, control + 클릭해서 touch on inside 오른쪽 원 부분 클릭하고 끌어서 popupSetting에 연결하면 된다.

 

3. 뷰1 구현파일(뷰1.m)에 메서드 정의

#import "뷰2.h"

일단 뷰2를 모달 뷰로 띄울 것이기 때문에, 뷰2.h를 임포트!

- (IBAction)popupSetting
{
    Setting *modalSetting = [[Setting alloc]initWithNibName:@"Setting" bundle:nil];
    [modalSetting setModalTransitionStyle:UIModalTransitionStylePartialCurl]; //모달뷰 전환효과
    [self presentModalViewController:modalSetting animated:YES];
}

메서드 내부에는 딱 저 3줄만 있으면 된다. 심지어 2번째 줄은 전환 효과를 위한 것이고, 전환 효과를 디폴트로 주고 싶으면 굳이 입력하지 않아도 된다.

 

4. 뷰2 헤더파일(뷰2.h)에 메서드 선언

-(IBAction)closeSetting;

모달 뷰로 사용될 뷰2에는 해당 모달 뷰를 닫기 위한 버튼을 만든다. 위의 뷰1에서 했던 것 처럼, 메서드를 생성하고 버튼에 메서드를 연결시키면 된다.

 

5. 뷰2 구현파일에 메서드 정의

-(IBAction)closeSetting
{
    [self dismissModalViewControllerAnimated:YES];
}

모달 뷰 닫기 버튼에 대한 메서드는 심지어 단 한 줄!

 

이렇게 한 후에 빌드를 해보면 시뮬레이터에서 모달 뷰가 아름답게 떴다가 사라졌다가 하는 것을 볼 수 있다. 잘 안 되면 아마 버튼과 메서드를 연결을 시키지 않아서일 가능성이 높음...

 

** 모달뷰 전환효과 더 알아보기

기본적으로 사용할 수 있는 모달 뷰 효과는 총 4가지이다. 위에서 이미 사용한 효과는 종이를 말아 올리는 듯한 효과이고, 아래에 있는 3개 효과도 추가로 있다. (디폴트는 CoverVertical이다.) 

    [modalSetting setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
    
    [modalSetting setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
    
    [modalSetting setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];