调度任务

我想实现类似于WhatsApp的静音function的function。 所以基本上,用户停止接收通知(在我的情况下,使用位置pipe理器)一段时间。 此后,通知(位置pipe理器)自动开启。 我怎样安排这样的事件(自动打开位置pipe理器),例如在我点击一个button后的一个星期?

我会build议一个混合的方法,使用NSTimers和一个检查,无论何时启动应用程序或前景。

当用户在NSUserDefaults中将通知存储为notificationsDisabledTime时禁用此function。

// Declare this constant somewhere const NSString *kNotificationDisableTime=@"disable_notifications_time" [[NSUserDefaults sharedUserDefaults] setObject:[NSDate date] forKey:kNotificationDisableTime]; 

现在无论何时应用程序启动或到达前台,请检查notificationsDisabledTime和当前时间之间的时间间隔是否大于一周。 如果是这样重新启用通知。 把它放在一个很好的可重用函数中。 在应用程序委托applicationDidBecomeActive中调用此函数:

 -(void)reenableNotificationsIfNecessary { if ( notifications are already enabled ... ) { return; } NSDate *disabledDate = [[NSUserDefaults sharedUserDefaults] objectForKey:kNotificationDisableTime] NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSUInteger unitFlags = NSDayCalendarUnit; NSDateComponents *components = [gregorian components:unitFlags fromDate:disabledDate toDate:[NSDate date] options:0]; NSInteger days = [components day]; if(days >7) { // re-enable notifications } } 

作为备份,有一个NSTimer每小时执行一次相同的检查,即调用这个函数。 这是为了处理用户花费你的应用程序很多时间的情况。 这种方式一个星期后,它将最终重新启用,但不一定是在正确的时间,但通常这是正常的。

1.方法我build议使用NSTimer类,并设置一个定时器来获取呼叫function,将取消静音。 而且在后台使用方法的Background Task也可以通过添加来完成

 var bgTask = UIBackgroundTaskIdentifier var app = UIApplication.sharedApplication() app.beginBackgroundTaskWithExpirationHandler { () -> Void in app.endBackgroundTask(bgTask) } 

在打电话之前

例如,我想静音8小时,比你需要打电话

 NSTimer.scheduledTimerWithTimeInterval(60*8, target:(self), selector: Selector("stopper"), userInfo: nil, repeats: no); 

并添加你的stopper

 func stopper(){ //unmute } 

你也可以通过添加userInfo到定时器来发送关于将被静音的对象的特定信息。

2.方法

您可以查看applicationDidEnterBackgroundapplicationDidEnterForeground之间的时间差异

let date = NSDate.date()和差异let difference NSDate.timeIntervalSinceDate(date)