레이블이 NSUserDefaults인 게시물을 표시합니다. 모든 게시물 표시
레이블이 NSUserDefaults인 게시물을 표시합니다. 모든 게시물 표시

2013/12/04

[iOS] App이 몇번 실행되었는지, 처음 설치 된지 얼마나 지났는지 알아보자

App을 개발해서 배포하고 나면, 사용자에게 평가를 요청하고, 앱스토어에 좋은 평가가 많이 모여야, 더 많은 사람들이 앱을 설치하게 됩니다.
이 평가 요청을 언제하는 것이 좋을까요? 앱을 설치하고 바로 요청하면, 사용하지도 않은 상태에서 평가를 남기게 되니까. 뭔가 강요 당한 느낌이 들어서, 좋은 평가로 이어지지 않습니다.
그렇다면, 설치 후에 5일 정도 지났고, 10번정도(하루에 2번) 실행을 한 상태에서 사용자에게 평가를 요청하면, 고객 입장에서도 충분히 써봤으니 평가를 해줄 수 있을 것입니다.

App이 실행될 때, 현재 몇번 실행이 되었는지, 처음 실행한 후에 며칠이 지났는지 알 수 있어야 합니다.

NSUserDefault에 처음 실행한 시간과, 실행한 횟수를 저장해 두면, 다음 실행할 때, 알수가 있게 됩니다.

아래와 같이 viewDidLoad 함수에서, 해당 값을 읽어서 사용하면 됩니다.

Source Code
- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view, typically from a nib.

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
    if ([userDefault valueForKey:@"DBUAppInfo"] == nil)
    {   //앱을 처음 실행한 상태로, 상태 값이 없습니다.
        //오늘 날짜와, 앱 실행 횟수를 저장합니다.
        NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:[NSDate date], @"firstRunDate", [NSNumber numberWithInt:1], @"numberOfRuns", nil];
        [userDefault setObject:dic forKey:@"DBUAppInfo"];
    }else{
        //실행한 적이 있으므로, 저장된 dictionary를 가져옵니다.
        NSDictionary *dic = [userDefault valueForKey:@"DBUAppInfo"];
        NSNumber *numberOfRuns = [dic objectForKey:@"numberOfRuns"];      //실행 횟수
        NSLog(@"running Count: %d", numberOfRuns.intValue+1);
        NSDate *firstDate = [dic objectForKey:@"firstRunDate"];          //첫 실행 날짜
        NSLog(@"firstDate: %@", firstDate);
        
        //첫 실행 후, 며칠이 지났는지 확인
        NSDate *today = [NSDate date];
        NSCalendar *calendar = [NSCalendar currentCalendar];
        NSUInteger unitFlag = NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSSecondCalendarUnit;
        NSDateComponents *components = [calendar components:unitFlag
                                                   fromDate:firstDate
                                                     toDate:today
                                                    options:0];
        NSLog(@"month: %ld ,day: %ld, hour:%ld, second:%ld", (long)[components month], (long)[components day], (long)[components hour], (long)[components second]);
        
        //정보를 업데이트하여, 다시 저장.
        NSDictionary *dic2 = [[NSDictionary alloc] initWithObjectsAndKeys:firstDate, @"firstRunDate", [NSNumber numberWithInt:(numberOfRuns.intValue +1)], @"numberOfRuns", nil];
        [userDefault setObject:dic2 forKey:@"DBUAppInfo"];
    }
    [userDefault synchronize]; //NSUserDefault를 동기화
    
}

위에서 "DBUAppInfo" 는 NSUserDefault에 저장하는 dictionary의 키(key)입니다.
"numberOfRuns"와 "firstRunDate"는 횟수와 처음 실행한 날짜를 dictionary에 저장하는 키(key)입니다.

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가 준비되어 있습니다.