iOS 프로그래밍 가이드 #1

1. 백업 되지 않는 파일 만들기 (Preventing Files From Being Backed Up)

사용자가 만든 문서나 컨텐츠처럼 iCloud나 iTunes로 백업 되어야 하는 사용자 데이터는 일반적으로 <Application_Home>/Documents 디렉터리에 저장한다. 반대로 백업이 필요 없고, 중요하지 않거나 앱에서 필요할 때 다시 생성해 낼 수 있는 파일은 <Application_Home>/Library/Application Support 에 만들어 NSURLIsExcludedFromBackupKey 속성을 지정한다.12

- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL {
    NSError *error = nil;
    BOOL success = [URL setResourceValue:[NSNumber numberWithBool:YES] forKey:NSURLIsExcludedFromBackupKey error:&error];
    if (!success) {
        NSLog(@"Error excluding %@ from backup: %@", [URL lastPathComponent], error);
    }
    return success;
}

- (void)doSomething {
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *possibleURLs = [fm URLsForDirectory:NSApplicationSupportDirectory
                                       inDomains:NSUserDomainMask];
    // Use the first directory if multiple are returned.
    NSURL *appSupportDir = possibleURLs[0];

    NSURL *dataFileURL = [NSURL URLWithString:@"example.dat"
                                relativeToURL:appSupportDir];

    [self addSkipBackupAttributeToItemAtURL:dataFileURL];
}

Swift에서는 다음과 같이 할 수 있다.

var url = URL(...)
var values = URLResourceValues()
values.isExcludedFromBackup = true
try? url.setResourceValues(values)

2. Xcode에서 위치 시뮬레이션 설정하기

위치기반 앱을 iOS Simulator 상에서 실행하거나 디버깅할 때 기본 위치를 미리 지정해 놓으면 편리하다. (Product 메뉴 > Scheme > Edit Scheme...)3

Edit Scheme... (Xcode)

Default Location에서 Add GPX File to Workspace...를 선택해 새로운 위치를 GPX 파일로 추가할 수 있다. GPX 파일은 GPX-POI file generator 사이트에서 생성하거나, XML 포맷을 취하기 때문에 텍스트 에디터로 직접 만들어도 된다. Xcode는 Waypoint(wpt 태그)만을 인식하기 때문에 간단히 위도와 경도 좌표만 입력하면 된다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<gpx xmlns="http://www.topografix.com/GPX/1/1"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd"
     version="1.1"
     creator="gpx-poi.com">
    <wpt lat="37.484161" lon="126.911162">
        <time>2014-03-12T20:12:55Z</time>
        <name>Sindaebangdong</name>
    </wpt>
</gpx>

3. iPhone 6와 iPhone 6 Plus 화면 지원 (iOS 8)

예전부터 개발되어 온 앱에서 Base SDK를 iOS 8로 설정하여도 iPhone 6와 iPhone 6 Plus에서 새로운 화면의 해상도로 작동하지 않는데, iOS가 실행을 시작하는 앱이 iPhone 6 화면을 지원하는지 판단하기 위해 스토리보드 런치 화면 파일Launch Screen File이 존재하는지 확인하기 때문이다.4

App Icons and Launch Images (Xcode)

애플의 문서에서 스토리보드라 되어있지만 실제로 Laucn Screen XIB 파일을 만들어 지정하면 되는데, New File... 메뉴의 User Interface 카테고리에서 새 Launch Screen File을 만들 수 있다.

Xcode 6 이상에서 새롭게 개발되는 앱이 아니라면 PNG나 JPG 파일의 런치 이미지가 지정되어 있을 경우가 대부분이다. Launch Screen File 대신 예전 방식의 런치 이미지를 iPhone 6와 iPhone 6 Plus 크기로 준비하여 기존의 Launch Images Source에 설정해도 동일하게 iPhone 6의 화면을 지원한다.

4. 상태바(status bar)를 없애고 전체 화면을 사용하기

Info.plist파일에 View controller-based status bar appearance 항목을 추가하고 YES로 설정한다. 상태바의 유무를 뷰컨트롤러 클래스에서 prefersStatusBarHidden 메소드를 오버라이드하여 원하는 값을 리턴하면 된다.

override func prefersStatusBarHidden() -> Bool {
    return true
}

각 뷰컨트롤러와 상관없이 앱 전반에서 상태바를 숨기고 싶을 때는 View controller-based status bar appearance를 NO로 설정하고, Status bar is initially hidden을 추가해 YES로 설정해도 된다.

Info.plist 파일을 텍스트 에디터에서 편집할 때, View controller-based status bar appearance의 키 이름은 UIViewControllerBasedStatusBarAppearance이고 Status bar is initially hidden은 UIStatusBarHidden이다.