2012-03-24 11 views
9

月曜日から金曜日までは1回、週末は起動しないUILocalNotificationがあります。私はNSWeekdayCalendarUnitに通知のrepeatIntervalプロパティを設定するとこれを達成すると思った。残念ながら私のために、私の通知はまだ週末に発砲しています。誰もがなぜ示唆できますか?ここに私のコードは次のとおりです。UILocalNotificationは毎週繰り返されますが、週末にも発生します。

UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 

localNotification.alertAction = @"View"; 
localNotification.alertBody = NSLocalizedString(@"ALERT_MESSAGE", nil); 
localNotification.soundName = UILocalNotificationDefaultSoundName; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM-dd-yyyy HH:mm"]; 
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"America/Toronto"]]; 

// Notification fire times are set by creating a notification whose fire date 
// is an arbitrary weekday at the correct time, and having it repeat every weekday 
NSDate *fireDate = [dateFormatter dateFromString:@"01-04-2012 11:00"]; 

localNotification.fireDate = fireDate; 
localNotification.repeatInterval = NSWeekdayCalendarUnit; 
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
      break; 

[localNotification release]; 

答えて

15

iOSの平日は、1週間のうちの1日を意味します。週末とは対照的に、「仕事の週」の意味はありません。

NSWeekdayCalendarUnit

は平日単位を指定します。

ドキュメントでは、単位として1-7を使用することを示唆していることで、それは少し明確に述べています。

対応する値はkCFCalendarUnitSecondです。 kCFCalendarUnitWeekdayと同じです。曜日の単位は1からNまでの数字です(グレゴリオ暦の場合はN = 7、日曜日は1)。

出典:http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSCalendar_Class/Reference/NSCalendar.html

が適切に月曜日から金曜日まで、あなたの通知を設定するには、ここでいくつかのスケルトンコードです。それを5回実行する必要があるので、fireDateのパラメータのメソッドの中にカプセル化すると良いでしょう。私はあなたが月曜日にそれをどうやってできるかを示しました。

+0

おかげで、それはそれを理解することが良いことです。 1週間に1回繰り返す5種類の通知を設定する唯一の方法はありますか? – Darren

+0

はい。私はあなたが従うことができるいくつかのスケルトンコードで私の答えを更新しました。 – louielouie

+0

大変感謝しています! 10種類の可能な毎日の通知があるので、これを実装するのは少し苦しいことですが。 – Darren

5

ローカル通知のために1日を設定し、ローカル通知repeatIntervalをNSWeekCalendar Unitに設定する必要があります。

ここ
  [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:2 :tempDict] andRepeatInterval:NSWeekCalendarUnit]; 
      [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:3 :tempDict]andRepeatInterval:NSWeekCalendarUnit]; 
      [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:4 :tempDict] andRepeatInterval:NSWeekCalendarUnit]; 
      [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:5 :tempDict] andRepeatInterval:NSWeekCalendarUnit]; 
      [self notificationWithItem:tempDict Date:[self SetDateForAlarmWithWeekday:6 :tempDict] andRepeatInterval:NSWeekCalendarUnit]; 

ように私は、ローカル通知を設定し、ローカル通知とnotificationWithItemのfireDateプロパティにsettedされる日付を返すメソッドsetDateForAlarmWithWeekdayを行いました。

-(void) notificationWithItem:(NSDictionary*)tmpdict Date:(NSDate *)date andRepeatInterval:(NSCalendarUnit)CalUnit 
{ 
    UILocalNotification *localNotification =[[UILocalNotification alloc]init]; 

    if (localNotification==nil) { 
     return; 
    } 

    localNotification.fireDate=date; 
    localNotification.timeZone=[NSTimeZone defaultTimeZone]; 
    localNotification.repeatCalendar=[NSCalendar currentCalendar]; 
    localNotification.alertBody=[NSString stringWithFormat:@"%@",[tmpdict objectForKey:@"Reminder"]]; 

    NSDictionary *snoozeDic=[tmpdict objectForKey:@"Snooze"]; 
    if ([[snoozeDic valueForKey:@"Switch"]intValue]==1) { 
     [email protected]"Snooze"; 
    }else 
    { 
     localNotification.hasAction=NO; 
    } 

    localNotification.repeatInterval=CalUnit; 
    localNotification.soundName=[NSString stringWithFormat:@"%@.caf",[tmpdict objectForKey:@"Tone"]]; 
    localNotification.userInfo=[NSDictionary dictionaryWithObject:tmpdict forKey:@"AlarmInfo"]; 
    localNotification.applicationIconBadgeNumber=1; 

    [[UIApplication sharedApplication]scheduleLocalNotification:localNotification]; 

} 


-(NSDate*)SetDateForAlarmWithWeekday:(int)WeekDay:(NSDictionary*)dics 
{ 
    NSLog(@"set date for alarm called"); 
    NSCalendar *calendar=[NSCalendar currentCalendar]; 
    [calendar setTimeZone:[NSTimeZone defaultTimeZone]]; 

    unsigned currentFlag=NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit|NSWeekdayCalendarUnit; 

    NSDateComponents *comp=[calendar components:currentFlag fromDate:[NSDate date]]; 

    NSArray *array=[[dics objectForKey:@"Time"] componentsSeparatedByString:@" "]; 
    NSInteger hour=[[[[array objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:0] intValue]; 
    NSInteger min=[[[[array objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:1] intValue]; 

    if ([[array objectAtIndex:1] isEqualToString:@"PM"]) { 
     hour=hour+12; 
    } 
    else 
    { 
     if (hour==12) { 
      hour=0; 
     } 
    } 

    comp.hour=hour; 
    comp.minute=min; 
    comp.second=0; 

    NSLog(@"set date for alarm (%i:%i:%i)",comp.hour,comp.minute,comp.second); 
    NSLog(@"weekday :%i ",WeekDay); 
    NSLog(@"comp weekday %i",comp.weekday); 
    int diff=(WeekDay-comp.weekday); 
    NSLog(@"difference :%i",diff); 

    int multiplier; 
    if (WeekDay==0) { 
    multiplier=0; 
    }else 
    { 
    multiplier=diff>0?diff:(diff==0?diff:diff+7); 
    } 

    NSLog(@"multiplier :%i",multiplier); 

    return [[calendar dateFromComponents:comp]dateByAddingTimeInterval:multiplier*secondsInOneDay]; 
} 

私はこれが役に立つと願っています。

+0

私はこれに似たようなことをしました。 – Darren

+0

あなたはSetDateForAlarmWithWeekdayメソッドを共有してください。 –

+1

@RahulGuptaはバディを楽しもう – Warewolf

1

私はそれについて検索しました。以下のコードは私のためにうまくいく。 1日の値を7日曜日から土曜日に渡し、あなたが発射したいと思う行動をした通知体に日付を指定すると、その特定の日に通知が来ます。 週末には土曜日と日曜日にこの関数を値7と1で2回呼び出します。

ご希望の場合はこちらをご覧ください。

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

} 
+0

私のnextfireDateは何もありません。 – JiteshW

1

Swiftに似ていますが、

平日は1 =日曜日から始まり、7を参照してくださいAppleのドキュメントに行くことを覚えておいてください:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/

func scheduleLocalNotification(date:NSDate, weekDay:Int){ 

     guard let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian), 
    let groupName = dateFormatter?.stringFromDate(date) else { return } 

     calendar.timeZone = NSTimeZone.defaultTimeZone() 

     let dateComponents = NSDateComponents() 
     dateComponents.calendar = calendar 
     dateComponents.hour = calendar.component(.Hour, fromDate: date) 
     dateComponents.minute = calendar.component(.Minute, fromDate: date) 
     dateComponents.weekOfYear = calendar.component(.WeekOfYear, fromDate: date) 
     dateComponents.weekday = weekDay 

     let localNotificaion = UILocalNotification() 
     localNotificaion.fireDate = calendar.dateFromComponents(dateComponents) 
     localNotificaion.alertBody = "Hey!" 
     localNotificaion.timeZone = NSTimeZone.defaultTimeZone() 
     localNotificaion.userInfo = ["Time": groupName] 
     localNotificaion.repeatInterval = .WeekOfYear 
     UIApplication.sharedApplication().scheduleLocalNotification(localNotificaion) 

} 
関連する問題