2013년 12월 3일 화요일

[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)입니다.