跟踪Cocoa app中的实际使用时间

时间:2014-11-03 06:35:04

标签: objective-c xcode macos cocoa trialware

受@ PeterHosey在this question的有趣评论的启发,我决定实施使用时间跟踪系统。

像:

  • 应用程序启动,计数器启动
  • 应用程序终止,记录整个持续时间
  • 在任何时候(即使在执行期间),总使用时间超过允许的时间,用户会收到通知

但是,我有几个......概念问题:

  • 我要跟踪什么? [NSDate date]会满足吗?
  • 如果用户只是在某个时刻更改了系统日期/时间怎么办?
  • 此外,还要挂钩哪些特定的委托方法?我的意思是,你会在哪里调用计数功能的启动/停止程序?

我全都耳朵! : - )

1 个答案:

答案 0 :(得分:3)

好吧,我认为您不需要使用[NSDate date]方法。为什么不使用mach_absolute_time()函数?为了追踪经过的时间,它可能是一些计时器(例如,每分钟刻度)。

GCD-timers是一种实现计时器的简单灵活方式,您可以根据需要暂停和恢复计时器(例如,如果您希望在程序未使用时暂停计时器。)。

- (void)createTimerSource
{
  // myTimerQueue and trialTimer are class members
  myTimerQueue = dispatch_queue_create("label.yourapp.com", NULL);
  trialTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, myTimerQueue);
  dispatch_source_set_timer(m_ping_timer, dispatch_time(DISPATCH_TIME_NOW,TimerPeriod * NSEC_PER_MSEC), TimerPeriod * NSEC_PER_MSEC,NSEC_PER_SEC/10);
  // set event handler
  dispatch_source_set_event_handler(m_ping_timer,^{
      // the code to check time elapsed
   });
  // set the cancel handler 
  dispatch_source_set_cancel_handler(m_ping_timer,^{
      // release timer dispatch source
      if(trialTimer)
         dispatch_release(trialTimer);
      // release dispatch timer
      if(myTimerQueue)
         dispatch_release(myTimerQueue);
   });
  // created sources always suspended
  dispatch_resume(trialTimer); // to suspend the timer use dispatch_suspend(trialTimer)
}