2013-10-09 71 views
2

我確定此問題在某處重複,但我無法找到解決方案。我正在製作一個應用程序,其中一項功能允許用戶選擇他們將收到本地通知的日期和時間。iOS在特定日期設置本地通知

他們可以選擇他們喜歡的一天中的任何時間,並可以切換一週中的不同日子(週一,週五,週六等)。通知將每週發送一次。因此,我限制用戶創建3個通知 - 如果選擇全部7天,我會將repeatInterval設置爲每日(一個通知)。如果每3個通知選擇6天,那麼我將需要每天的單獨通知(總計3x6 = 18通知)。很可能,只有1個通知將被使用,所以這很好。

我知道如何在將來某段時間設置通知,但是如何在星期一設置通知時間爲下午6點?

下面是我用來測試的代碼。它在將來設置一個4秒鐘的警報(我從applicationDidEnterBackground調用它)。

NSDateComponents *changeComponent = [[NSDateComponents alloc] init]; 
    changeComponent.second = 4; 

    NSCalendar *theCalendar = [NSCalendar currentCalendar]; 
    NSDate *itemDate = [theCalendar dateByAddingComponents:changeComponent toDate:[NSDate date] options:0]; 

    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    localNotif.fireDate = itemDate; 
    localNotif.timeZone = [NSTimeZone defaultTimeZone]; 
    localNotif.repeatInterval = NSWeekdayCalendarUnit; 
+0

接受答案? –

+0

@Patrick,rmaddy:你們有沒有在這方面找到任何解決方案? –

回答

3

正是你現在正在做同樣的方式,而是創建一個日期是不同的:

NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease]; 
[comps setDay:1]; 
[comps setMonth:1]; 
[comps setYear:2013]; 
[comps setHour:10]; 
[comps setMinute:10]; 
[comps setSecond:10]; 
localNotif.fireDate = [[NSCalendar currentCalendar] dateFromComponents:comps]; 
+0

嗯,所以這設置爲2013年1月1日10:10:10的提醒?我想知道將它設置爲過去的日期會發生什麼......並且如果它設置爲每週重複一次,它將在每個星期二自動啓動(因爲這是2013年1月1日的那一天)?噢,這真的有用。我可以使用'NSWeekdayCalendarUnit'在工作日和NSWeekCalendarUnit中重複,以便setDay有一些效果。輝煌! – Patrick

+0

如果您在過去設置日期,我認爲通知將在您初始化的同一時刻立即執行。如果應用程序正在運行 - 用戶將看不到任何內容 - 您的應用程序將收到有關它的通知。 –

0

我不認爲你可以安排通知具有很大的靈活性。只要他們改變下一個時間表,就可以安排下一個時間表,並且在下一個時間表出現時進行安排。只有一個擔心取消和易於設置。

+0

那真的不是一個問題 - 他更多地問如何在確切的日期創建通知 - 而這裏是fireDate。 –

1

我知道如何設定在未來一個通知,在一定時間內, 但我怎麼設置週一下午6點的通知?

您可以在下個星期一創建NSDate對象,代表下午6點,方法顯示在How to Get an NSDate for a Specific Day of Week and Time from an Existing NSDate。然後,如果您希望在每個星期一重複播放,可以使用localNotification.repeatInterval = NSWeekCalendarUnit。不過,我不確定在夏令時中,它會按預期工作。

3

我也搜遍了。下面的代碼適合我。將週日值1至7週日至週六以及通知主體與您想要觸發的操作進行比較,並指定日期,然後通知將在該特定日期發佈。希望這對您有所幫助。

-(void) weekEndNotificationOnWeekday: (int)weekday :(UILocalNotification *)notification : (NSDate*) alramDate 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    NSDateComponents *componentsForFireDate = [calendar components:(NSYearCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit| NSSecondCalendarUnit | NSWeekdayCalendarUnit) fromDate: alramDate]; 
    [componentsForFireDate setWeekday: weekday] ; //for fixing Sunday 
    // [componentsForFireDate setHour: 20] ; //for fixing 8PM hour 
// [componentsForFireDate setMinute:0] ; 
// [componentsForFireDate setSecond:0] ; 
    notification.repeatInterval = NSWeekCalendarUnit; 
    notification.fireDate=[calendar dateFromComponents:componentsForFireDate]; 
    [[UIApplication sharedApplication] scheduleLocalNotification:notification]; 

}