3

ローカル通知に条件付きの発火日時を設定しようとしていますが、これらの 2 つの方法を試しても失敗しませんでしたが、それでも機能しませんでした。それで、私はそのようなことができるかどうか疑問に思っていましたか?

注: 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] ;


}}

また

-(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] ;


}}

ありがとう

そうでない場合、そのような条件を作る最も簡単な方法は何ですか?

4

2 に答える 2

0

私がやろうとしていることは、スリープ時間が始まっgoingToSleep:たら、メソッドを呼び出すこと dispatch_laterですperformSelector: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];
    }
    

}

次に、SleepTime が終了したら、再度メソッドを呼び出します。wakingUp:

次にwakingUp:

  • 保存した NSDictionary の配列を読み取ります。
  • 再度、同じプロパティを使用して UILocalnotifications を作成します。

このようにして、スリープ時間中に UILocalNotifications がトリガーされることはありません。アプリケーションがメモリでない場合、1 つの問題がこれらのメソッドを実行している可能性があります。

EDIT 長いランニング Appicaions を持っています。

于 2013-05-10T13:21:47.213 に答える
0

代わりにNSDateCompare:メソッドを使用してください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
}

また、リンクを見てください。これは、必要なものと似ています。リンク

于 2013-05-07T10:09:59.377 に答える