2013/11/07

[iOS] Photo Library접근시 사용자에게 표시 문구 넣기.

먼저 UIImagePickerController 이전 블로그를 참고하여 주세요.

iOS기기에서 Photo Library에 접근하려고 하면, Privacy로 사용자에게 접근을 할 것인지 물어보게 됩니다. iOS에서 표시하는데, 거기에 사용자에게 필요한 문구를 표시해 줄 수 있습니다.
 key값은 Privacy - Photo Library Usage Description이고, Value로 string을 입력하면 됩니다.

위와 같이 info.plist파일에 추가를 하면, 사용자에게 최초 접근 할 경우에, 아래와 같이 표시가 됩니다.

info.plist에 값을 넣은 경우 입니다.
info.plist에 값이 없는 경우
만약, 다국어 지원을 위해서는 info.plist파일을 다국어 적용하면 되겠습니다.

2013/11/04

[iOS] NSUserDefaults 를 사용한 설정값 간단 저장 방법

App 내에서 설정값을 저장하고 싶은데, 파일로 저장하기에는 번거로운 것이 많이 필요하므로, NSUserDefaults를 사용해서, 간단히 저장하는 방법을 정리합니다.

NSUserDefaults 클래스는, 디폴트시스템에 접근할 수 있는 방법을 제공하고 있습니다.
사용자의 기본데이터베이스에 값을 저장하도록 함으로써 간단하게 preference를 설정할 수 있게 하는 것입니다.

사용방법은 아래와 같이 standardUserDefaults를 가져와서 데이터를 셋팅하고 동기화하여 줍니다.

- (void) saveDebugInfoData:(BOOL) value
{
    [[NSUserDefaults standardUserDefaults] setObject:(value?@"YES":@"NO") forKey:SETTINGS_SHOW_DEBUG_INFO];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

그리고, 값을 읽기 위해서는 아래와 같이 읽어 오면 됩니다.

- (void)viewWillAppear:(BOOL)animated
{
    self.debugTextView.hidden = ![[NSUserDefaults standardUserDefaults] boolForKey:SETTINGS_SHOW_DEBUG_INFO];
}

Developer Library에 보시면, 각 데이터 타입에 따라서 Setter/Getter가 준비되어 있습니다.




[iOS6] App내에서 이메일을 보내자.

개발하는 App 안에서 개발자에게 문제점이나 요청사항을 보낼 수 있는 기능이 있어야 합니다.
즉, 개발자에게 이런 저런 기능이 있으면 좋겠다거나, 이럴때 문제가 발생해서 불편하다거나 하는 내용을 개발자에게 보낼 수 있는 기능은 있어야 합니다.
 간단하게 MFMailComposeViewController를 사용해서, 기본으로 제공하는 이메일을 사용할 수 있습니다.

위와 같이 Framework은 MessageUI를 추가해 주시고, 사용하는 곳에서
#import <MessageUI/MessageUI.h>를 해주시면 사용할 수 있습니다.
메일 보내기 위해서, MFMailComposeViewController를 만들고, 메일에 들어갈 내용을 각각 넣어 줍니다.

NSString *iOSVersion = [[UIDevice currentDevice] systemVersion];
    NSString *model = [[UIDevice currentDevice] model];
    NSString *version = FGS_VERSION;
    NSString *build = FGS_BUILD;
    MFMailComposeViewController *mailComposer = [[MFMailComposeViewController alloc] init];
    mailComposer.mailComposeDelegate = self;
    [mailComposer setToRecipients:[NSArray arrayWithObjects: @"ask.davidbae@gmail.com",nil]];
    [mailComposer setSubject:[NSString stringWithFormat: @"%@ V%@ (build %@) Support", NSLocalizedString(@"Family GoStop", @"App Name"),version,build]];
    NSString *supportText = [NSString stringWithFormat:@"[Device: %@]\n[iOS Version:%@]\n",model,iOSVersion];
    supportText = [supportText stringByAppendingString: NSLocalizedString(@"Please describe your problem or question.", @"")];
    [mailComposer setMessageBody:supportText isHTML:NO];

    [self presentViewController:mailComposer animated:YES completion:nil];

그리고, 호출하는 클래스에서 MFMailComposeViewControllerDelegate 프로토콜을 추가해 주시고, 아래 함수를 구현하면, 메일이 정상적으로 보내졌는지 확인이 가능합니다.

#pragma mark - MFMailComposeViewControllerDelegate

- (void)mailComposeController:(MFMailComposeViewController *)controller
          didFinishWithResult:(MFMailComposeResult)result
                        error:(NSError *)error
{
    [self dismissViewControllerAnimated:YES completion:nil];
    /*
     enum MFMailComposeResult {
     MFMailComposeResultCancelled,
     MFMailComposeResultSaved,
     MFMailComposeResultSent,
     MFMailComposeResultFailed
     };
     */
    NSLog(@"Email Send Result: %d", result);
    if (result == MFMailComposeResultFailed) {
        NSLog(@"Support mail failed: Error Code:%d, %@", error.code, [error description]);
    }
}
위에서 result값으로 보내 졌는지, 취소 되었는지, 실패 되었는지 확인이 가능합니다.
그리고, 메일을 보내기 위해서, Compose를 보여주기 전에, 실제 메일을 보낼 수 있는지 확인이 되어야 합니다.
그러기 위해서는, 클래스 메소드를 사용하여 확인이 가능합니다.

    [MFMailComposeViewController canSendMail]

위 확인코드는 메일을 보내기 위한 버튼을 보여주기 전에 확인하여야 하고, 메일을 보낼 수 없는 경우, 사용자에게 메일 작성 화면을 보여주면 안됩니다.
 왜? 어렵게 메일을 작성했는데, 메일 설정이 안되어 있어서 보낼 수 없으면, 허탈하겠죠.
이상입니다.

2013/10/14

[iOS] 자동 Sleep 모드로 안 가도록 만드는 방법

예전 버전에서 부터 간단하게 설정하던 것인데, 여기 적어 둡니다.

[UIApplication sharedApplication].idleTimerDisabled = NO;

위와 같이 설정을 하면, 자동으로 idle로 넘어가지 않습니다.


2013/10/12

[iOS7] 국가별 프로그램명 적용하기.

이건 iOS7에만 해당 되는 것이 아니고, 이전 지역화와 다 관련이 있지만, 일단 iOS7으로 테스트하니, iOS7으로 올립니다.

프로그램의 이름은 InfoPlist.strings의 Bundle display name과 관련이 있습니다.
이 내용은 InfoPlist.strings에 추가하면 됩니다.

위에 파일의 내용을 아래와 같이 추가합니다.


그리고, 실행을 하면, 한글의 경우, 프로그램이름이 지역화 테스트로 표시가 됩니다.





[iOS7] 다국어 스트링 지원하기.

iOS App에서 다국어를 지원하는 부분은 크게 3가지로 구성이 된다.
  • 다국어 스트링 적용하기
  • 다국어 리소스 적용하기
  • 국가별 프로그램 명 적용하기
이번 포스트에서는 다국어 스트링 적용만 알아보자.

다국어 스트링 적용하기 위해서, 신규파일로 Localizable.strings 파일을 생성한다.


위와 같이 New > File > iOS Resource > Strings File 선택하고, 이름을 Localizable로 입력한다.

파일이 추가 되었으면, 추가된 Localizable.strings를 선택하고, File Inspector를 통해서 Localize.. 시킨다. 현재 파일을 base로 만든다.
(Xcode 5 기준으로 위와 같이 생성되고, Xcode 4에서는 언어를 선택하게 되어 있다.)

Localize..를 하면, 아래와 같이 Based와 English를 생성이 된다. 

추가 언어를 넣기 위해서는 Project에서 Localization에 언어를 추가하면 된다.

그러면, 소스 코드에서 아래와 같이 사용하면 된다.

    NSLog(@"Name: %@", NSLocalizedString(@"Name", @"Name"));
    NSLog(@"Name: %@", NSLocalizedString(@"Text", @"Text"));
    NSLog(@"MyName: %@", NSLocalizedString(@"MyName", @"Name"));
    NSLog(@"MyText: %@", NSLocalizedString(@"MyText", @"Text"));

위와 같이 사용하면, Default로 Localizable.strings 파일에서 키("Name", "Text", "MyName", "MyText")에 대한 String을 찾아서 표시하게 된다.
만약, Localizable.strings외에 추가로 MyLocalizable.strings를 추가했을 경우, 거기에서 읽어 올 수 있는 방법이 있는가?
 기본적으로  NSLocalizedString은 NSBundle의

- (NSString *) localizedStringForKey: value: table:; 함수를 호출해서 읽어 오는데, table에 전달되는 것이 nil 이거나 파일이 없을 경우, Localizable.strings 파일에서 찾게 되는 것이다.
아래와 같이 직접 NSBundle을 이용해서 MyLocalizable을 넣어 주면, MyLocalizable.strings에서 찾아서 표시하게 된다.











위 코드의 결과를 아래와 같이 볼 수 있다.











여기서, Localizable.strings(Base) 에는
"Name" = "Name";
"Text" = "Text";
만 있고, Localizable.strings(English) 에는
"Name" = "이름 (en)";
"Text" = "텍스트 (en)";
이 있어서, "MyName", "MyText"에 대해서는 Default값이 표시가 된다.

여기서, MyLocalizable.strings(Base) 에는
"MyName" = "MyName";
"MyText" = "MyText";
만 있고, MyLocalizable.strings(English) 에는
"NyName" = "My 이름 (en)";
"MyText" = "My 텍스트 (en)";
이 있어서 "Name"과 "Text"에 대해서, Value로 전달되는 값이 표시된다.








2013/09/15

[iOS6] App개발에서 사용할 수 있는 Font 목록, 추가 한글 폰트 등록하여 적용하기.

폰트 적용하기.

iOS6에서 한글 폰트는 AppleSDGothicNeo-Medium 과,  AppleSDGothicNeo-Bold가 기본으로 등록되어 있습니다.

이 폰트를 사용하기 위해서는 UILabel이나 UIButton의 폰트로 등록해 주면 됩니다.


//h 파일에서..
@property (weak, nonatomic) IBOutlet UILabel *koLabel;
//m 파일에서..
self.koLabel.font = [UIFont fontWithName:@"AppleSDGothicNeo-Bold" size:17.0f];
//기본으로 AppleSDGothicNeo이므로 별 차이가 없다.


기본적으로 적용되어 있는 System 폰트와 비교를 하면 별 차이가 없습니다.
Label과 button에 적용해서 비교를 해보자. 아래 이미지를 보면, 거의 차기 없는 것 같습니다.

시스템 폰트는 System-Regular(Helvertica), 한글기본 폰트는 AppleSDGothicNeo-Medium입니다

한글 폰트 등록해서 사용하기.

네이버의 NanumGothic과 NanumBrush를 등록해서 표시해 보자. 폰트는 Naver에서 검색하면 나옵니다. (http://hangeul.naver.com/font)
폰트(ttf)파일을 받아서, 프로젝트에 등록하고, ~-info.plist 에 폰트 이름을 등록하고 사용할 수 있습니다.

//h 파일에서..
@property (weak, nonatomic) IBOutlet UILabel *koLabel;
//m 파일에서..
self.koLabel.font = [UIFont fontWithName:@"NanumBrush" size:17.0f];
// Naver의 나눔손글씨 붓 폰트가 적용이 되었다.
적용한 것을 한번 보면.
위에 손글씨 붓 폰트가 적용된 것을 볼 수 있다. 크기를 같게 하면, 손글씨 붓 폰트는 좀 작습니다.

사용가능한 폰트 리스트 가져오기.

현재 디바이스에서 지원 가능한 폰트의 리스트를 읽어서 어떤 것이 지원되는지 확인해 봅니다.
iOS6 Simulator에서는 61개의 font family 이름이 있고, 이것에 각각 Bold나 Medium이 있을 수 있으니, 지원하는 폰트는 61개 정도로 볼 수 있겠습니다.
 //UIFont에서 지원하는 폰트를 알아보자.
 NSArray *fonts = [UIFont familyNames];
 NSLog(@"Available fonts : %@", fonts);

 //Family Name에서 지원하는 폰트 리스트는 아래 함수로 읽어 올 수 있다.
 NSArray *fontList = [UIFont fontNamesForFamilyName:_familyFontName];

  그러면 이제 지원하는 폰트들을 화면에 표시를 해볼까요?


위에 자세히 보면, NanumBrush와 NanumGothic도 사용 가능한 폰트로 등록이 되어서 리스트에 나와 있는 것을 볼 수 있습니다.