2012-09-08 3 views
0

좋은 날!방법을 하루에 한 번 예약하십시오. 코코아

Mac OS X (iPhone 아님) 용 알리미 소프트웨어를 개발 중입니다. 그것은 하루에 한 번 창을 제시해야합니다. 정확한 시간이 정의되지 않았습니다. 한 번만 정의됩니다. 어떻게 만들 수 있습니까? 그것은 로그인 후 시작하도록 스스로를 등록합니다. NSTimer 시도했지만 첫 번째 메서드가 화재 후 [timer setfFireDate :] 호출 할 때 메서드를 발생시키지 않는 것 같습니다.

도움을 받으시기 바랍니다.

+0

"첫 번째 방법으로 화재가났다"는 것이 무슨 뜻입니까? 그것은 한 번 발사됩니까? 이 앱은 항상 켜져있는 컴퓨터에서 계속 실행됩니까? 당신이 여기서 뭘 하려는지 분명치 않습니다. – rdelmar

+0

불명확 한 질문에 사과드립니다. 네, 한번 불을 땐 다음에 불을냅니다. 로그인 시작 항목에 등록 된 소프트웨어는 시스템과 함께 시작하여 처음 시작한 후 경과 일을 확인한 다음 "Please register, bla, bla, bla"알림 메시지를 표시하는 방법을 시작합니다. – Vlad

답변

1

최근 댓글을 통해 타이머와 사용자 기본값을 모두 사용해야하는 것처럼 보입니다. 사용자 기본 방법은 먼저 "firstOpening"이라는 사용자 기본값이 있는지 확인하고 그렇지 않은 경우 현재 시간으로 설정합니다. 그러면 20 일 평가판 기간의 시작에 대한 시계가 설정됩니다. 첫 번째 if 절은 프로그램이 처음 열릴 때만 실행됩니다.

사용자 기본값에서 값을 검색하는 firstOpenTime 속성을 생성하고이를 사용하여 20 일이 만료되었는지 확인합니다. 그렇다면 프로그램은 presentExpiredWindow 메서드를 실행하고 그렇지 않으면 프로그램은 presentExpiredWindow 메서드를 실행합니다. 미리 알림 창을 열고 24 시간마다 한 번씩 실행되는 반복 타이머를 설정합니다. 따라서 프로그램이 항상 열려 있더라도 타이머는 24 분마다 한 번씩 실행되어 미리 알림 창을 표시해야합니다 (20 일 경과 후 타이머 메서드는 showExpiredWindow 메서드를 호출하고 자체를 무효화합니다).

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{ 

    if (![[NSUserDefaults standardUserDefaults] objectForKey:@"firstOpening"]){ 
     [[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:@"firstOpening"]; 
    } 

    self.firstOpenTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"firstOpening"]; 
    if ([[NSDate date] timeIntervalSinceDate:self.firstOpenTime] > 1728000) { //1,728,000 seconds is 20 days 
     [self presentExpiredWindow]; 
    }else{ 
     [self presentReminderWindow]; 
     [NSTimer scheduledTimerWithTimeInterval:86400 target:self selector:@selector(presentReminder:) userInfo:nil repeats:YES]; 
    } 

} 

-(void)presentReminder:(NSTimer *) aTimer { 
    if ([[NSDate date] timeIntervalSinceDate:self.firstOpenTime] > 1728000) { 
     [self presentExpiredWindow]; 
     [aTimer invalidate]; 
    }else{ 
     [self presentReminderWindow]; 
    } 

} 

-(void)presentReminderWindow { 
    //show reminder window 
} 


-(void)presentExpiredWindow { 
    //show trial period has ended window 
} 
+0

답변 해 주셔서 감사합니다. 미안 내 영어. 그러나 나는 단지 다음과 같은 것을 필요로한다. 이 소프트웨어는 매일 자동으로 시작되며 20 일이 지나면 "시험 사용 기간이 종료되었습니다"라는 메시지가 나타나면 "등록하십시오"라는 창이 나타납니다. 그러나 컴퓨터가 꺼지지 않고 일주일 동안 작동하고 소프트웨어가 하루에 한 번씩 방법을 실행해야 할 수도 있습니다. – Vlad

+0

@Vlad, 제 생각에 편집 된 코드를 이해합니다. – rdelmar

+0

고맙습니다. – Vlad

관련 문제