调度任务
我想实现类似于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.方法
您可以查看applicationDidEnterBackground
和applicationDidEnterForeground
之间的时间差异
let date = NSDate.date()
和差异let difference NSDate.timeIntervalSinceDate(date)