2014년 2월 26일 수요일

[iOS] 문자메세지(SMS) 보내기 MFMessageComposeViewController 예제

아이폰용 앱에서 텍스트메시지(SMS)를 코드레벨에서 그냥(!) 보내기란 사실 불가능하다. 안드로이드 퍼미션만 확보하면 앱에서 마음대로 보내는 것이 iOS에서는 불가능하다는 이야기다. (물론 이 불편함 덕분에 아이폰은 보안이라는 다른 이득을 취했다)

그나마 다행인 점은 iOS에서 이런 SMS를 보내기 위한 수동적인 장치는 제공한다는 점이다. MFMessageComposeViewController 가 바로 이런 역활을 하는 프레임웍이다.

MFMessageComposeViewcontroller 를 사용하려면 우선 프로젝트 타깃의 링크할 프레임워크에 MessageUI.framework 를 추가해야 한다. (자동 추가 옵션을 사용한다면 별도로 추가 할 필요는 없다)

그리고 컴포저를 띄우는 코드가 있는 파일(아마도 ViewController)에 헤더파일을 추가한다.
#import <MessageUI/MessageUI.h>

실제 MessageComposeView를 띄우기 위한 코드는 아래와 같다.
if ([MFMessageComposeViewController canSendText]) {
    MFMessageComposeViewController *view = [[MFMessageComposeViewController alloc] init];
    view.body = @"Message Body";
    view.recipients = [NSArray arrayWithObject:@"123123123"];
    view.messageComposeDelegate = self;

    [self presentViewController:view animated:YES completion:nil];
}
canSendText 라는 메서드는 이름 만으로도 파악 가능하다. 시뮬레이터인 경우나 SIM이 없는 폰에서는 분명 NO가 리턴될 것이다. (참고로 시뮬레이터라면 MFMessageComposeViewController를 init 하면 nil이 리턴되기 때문에 앱이 죽을 수도 있다)

body 에는 메시지의 기본 내용이, recipients 는 받을 사람의 전화번호를 NSArray 형태로 복수로 넣을 수 있다.

위 코드가 정상적으로 실행되면 아래와 같은 창이 뜬다.


위 코드에서 messageComposeDelegate에 self를 넣어 놓았다. 이 delegate를 이용해 메시지가 전송되었는지 혹은 취소되었는지를 파악 가능하다.

delegate(위임)을 받을 클래스는 <MFMessageComposeViewControllerDelegate> 프로토콜을 명시하고 아래와 같은 메서드를 구현 할 수 있다.
- (void)messageComposeViewController:(MFMessageComposeViewController *)controller
                 didFinishWithResult:(MessageComposeResult)result
{
    [self dismissViewControllerAnimated:YES completion:nil];
    if (result == MessageComposeResultSent) {
        // Message Sent
    }
}

이런 식으로 delegate를 구현해서 메시지가 전송되었는지를 파악 할 수 있다.

댓글 없음 :