2013-05-05 116 views
3

我試圖對我的本地通知進行有條件的啓動時間,但是當我嘗試這兩種方式時,它沒有失敗,但仍然無法工作。所以,我想知道我是否能夠做這樣的事情?是否可以爲UILocalNotification設置Conditioned`firedate`?

注意: startTime和endTime是從日期選擇器開始的時間。

-(void) TEST { 

NSCalendar *calendar = [NSCalendar currentCalendar]; 
calendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"]; 

NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:[NSDate date]]; 
components.hour = 3; 
components.minute = (components.minute + 1) % 60; 
components.second = 57; 

NSDate *fire = [calendar dateFromComponents:components]; 
UILocalNotification *notif = [[UILocalNotification alloc] init] ; 
if (notif == nil) 
    return; 

if (fire < startTime.date) { 


notif.fireDate =fire ; 
    notif.repeatInterval= NSMinuteCalendarUnit ; 
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ; 
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ; 


    } 

if (fire > endTime.date) { 


    notif.fireDate =fire ; 
    notif.repeatInterval= NSMinuteCalendarUnit ; 
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ; 
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ; 


}} 

OR

-(void) TEST { 

NSCalendar *calendar = [NSCalendar currentCalendar]; 
calendar.timeZone = [NSTimeZone timeZoneWithName:@"GMT"]; 

NSDateComponents *components = [calendar components:NSHourCalendarUnit fromDate:[NSDate date]]; 
components.hour = 3; 
components.minute = (components.minute + 1) % 60; 
components.second = 57; 

NSDate *fire = [calendar dateFromComponents:components]; 
UILocalNotification *notif = [[UILocalNotification alloc] init] ; 
if (notif == nil) 
    return; 

if (fire > startTime.date & fire < endTime.date) { 

    [[UIApplication sharedApplication] cancelAllLocalNotifications] ; 
} 

else { 
    notif.fireDate =fire ; 
    notif.repeatInterval= NSMinuteCalendarUnit ; 
    notif.alertBody = [NSString stringWithFormat: @"You are missed!"] ; 
    [[UIApplication sharedApplication] scheduleLocalNotification:notif] ; 


}} 

感謝

如果沒有,會是什麼做出這樣的條件最簡單的方法?

+0

你記錄了火災日期嗎?如果使用組件中的分鐘,則需要在從日曆+日期(NSMinuteCalendarUnit)中獲取組件時加載分鐘。 – Wain 2013-05-05 06:13:24

+0

是的,我沒有記錄它,它永遠不會進入if條件 – user1949873 2013-05-05 11:38:08

+0

嘗試'if([fire timeIntervalSinceDate:startTime.date]> = 0)//火在開始之前。 – 2013-05-07 09:58:13

回答

0

使用的NSDate Compare:方法,而不是if(fire > startTime.date)

if([fire compare: startTime.date] == NSOrderedDescending) // if start is later in time than end 
{ 
    // do something 
} 

從類參考:

If: 
The receiver and anotherDate are exactly equal to each other, NSOrderedSame. 
The receiver is later in time than anotherDate, NSOrderedDescending. 
The receiver is earlier in time than anotherDate, NSOrderedAscending. 

使你的病情

if (fire > startTime.date & fire < endTime.date) { 

    [[UIApplication sharedApplication] cancelAllLocalNotifications] ; 
} 

可以使用

if([fire compare: startTime.date] == NSOrderedDescending && [fire compare: endTime.date]== NSOrderedAescending) 
{ 
    [[UIApplication sharedApplication] cancelAllLocalNotifications] ; 
} 

這將取消所有的本地通知,如果火災是所選擇的開始和結束日期

else { 
// Fire the notifications 
} 

也看看鏈接此類似,你需要link

+0

不幸的是,通知仍然是射擊,它並沒有取消!我聽說你不能對'UILocalNotification'有任何限制嗎? – user1949873 2013-05-07 22:19:00

+0

請告訴你究竟需要做什麼,什麼是不工作,我的保證:startTime和EndTime是u通知不會被觸發的時間。對。??根據這段代碼,如果fireDate在開始和結束時間之間,Notification將不會被創建,所以它不可能觸發。你是否想要取消所有已經創建的,在DoNotDisturb時間範圍內的通知?或者你只是不希望用戶允許在DoNotDisturb時間框架之間創建新的UILocalnotication – Bonnie 2013-05-08 05:56:56

+0

你的假設是正確的。我想取消startTime和endTime之間的通知。那麼,這段代碼是否能夠在後臺取消所有本地通知?因爲我試過了,它不起作用! – user1949873 2013-05-08 07:26:55

0

之間有什麼什麼,我,會嘗試做做的是,睡眠時間開始時,調用一個方法如:goingToSleep:,你可以使用 dispatch_laterperformSelector:withObject:afterDelay:爲,

goingToSleep:

NSArray* localNotifications = [[UIApplication sharedApplication] 
               scheduledLocalNotifications]; 
for (UILocalNotification *notification in localNotifications) 
{ 
    if([fire compare: startTime.date] == NSOrderedDescending && 
     [fire compare: endTime.date]== NSOrderedAescending) 
    { 

這是

  • 得到通知
  • 的所有屬性創建的NSDictionary這些屬性的
  • 添加的NSDictionary到一個數組
  • 的重要組成部分並將該數組保存到plist中。(Save Array to Plist

  • ,然後取消使用

    [[UIApplication sharedApplication] cancelLocalNotification:notification]; 
    } 
    

在此之後休眠時間結束 ,再次調用一個方法例如該通知}:wakingUp:

然後在wakingUp:

  • 讀取我們保存的NSDictionary數組。
  • 再次使用這些相同的屬性創建UILocalnotifications。

這樣,沒有UILocalNotifications會在睡眠時間觸發。如果應用程序不是內存,則可能有一個問題正在執行這些方法。

編輯To have long Running Appicaions

+0

非常感謝代碼部分工作。我嘗試了延遲屬性,它在應用程序運行時工作。但是,我仍然試圖理解Plist,NSDictionary和數組,所以我可以使它在後臺工作。我有兩個問題:你有任何指南的鏈接解釋你的答案?或者你能指出我詳細的答案嗎? – user1949873 2013-05-11 10:00:12

+0

你是指「如果應用程序不是內存,一個問題可以執行這些方法」是什麼意思?什麼是內存應用程序? – user1949873 2013-05-11 10:01:51

+0

不幸的是,performSelctor:withObject:afterDelay在第一個10分鐘後將不會在後臺工作:/ – user1949873 2013-05-11 16:22:37

相關問題