2013-10-31 12 views
13

設定バンドルを使用してUILocalNotificationをスケジュールしようとしています。設定では、通知を毎日(1日/ 1日)、2日ごとに1日、日曜日のみ、または決して受信しないようにすることができます。ここでiOS UILocalNotificationは毎日1回、2日に1回、日曜日にのみ起動します

は、私が使用したコードは(これはすべてのAppDelegate.mである)である:

-(void)defaultsChanged:(NSNotification *)notification { 

     [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

     [[NSUserDefaults standardUserDefaults]synchronize]; 
     NSString *testValue = [[NSUserDefaults standardUserDefaults] stringForKey:@"multi_preference"]; 

     NSLog(@"%@", testValue); 

     NSDate *today = [NSDate date]; 

     NSCalendar* calendar = [NSCalendar currentCalendar]; 
     NSDateComponents* compoNents = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:today]; // Get necessary date components 

     [compoNents month];[compoNents day]; 

     NSDictionary *dictToday= [self getDataFromdate : [compoNents day] month:[compoNents month]]; 


     if ([testValue isEqualToString:@"one"]){ 
      UILocalNotification* localNotification = [[UILocalNotification alloc] init]; 
      localNotification.fireDate = [[NSDate date]dateByAddingTimeInterval:20]; 
      localNotification.alertAction = @"View"; 
      localNotification.alertBody = [dictToday objectForKey:@"saint_description"]; 
      localNotification.repeatInterval = NSDayCalendarUnit; 
      localNotification.timeZone = [NSTimeZone defaultTimeZone]; 
      localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1; 

      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self]; 

      } 
     if (testValue==Nil){ 
      UILocalNotification* localNotification = [[UILocalNotification alloc] init]; 
      localNotification.fireDate = [[NSDate date]dateByAddingTimeInterval:20]; 
      localNotification.alertAction = @"View"; 
      localNotification.alertBody = [dictToday objectForKey:@"saint_description"]; 
      localNotification.repeatInterval = NSDayCalendarUnit; 
      localNotification.timeZone = [NSTimeZone defaultTimeZone]; 
      localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1; 

      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self]; 

     } 
     if ([testValue isEqualToString:@"two"]){ 

      UILocalNotification* localNotification = [[UILocalNotification alloc] init]; 
      localNotification.fireDate = [[NSDate date]dateByAddingTimeInterval:86401]; 
      localNotification.alertAction = @"View"; 
      localNotification.alertBody = [dictToday objectForKey:@"saint_description"]; 
      localNotification.repeatInterval = NSDayCalendarUnit; 
      localNotification.timeZone = [NSTimeZone defaultTimeZone]; 
      localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1; 

      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self]; 

     } 

     if ([testValue isEqualToString:@"three"]){ 
     NSDate *today2 = [[NSDate alloc] init]; 
     NSCalendar *gregorian = [[NSCalendar alloc] 
           initWithCalendarIdentifier:NSGregorianCalendar]; 

     // Get the weekday component of the current date 
     NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit 
                  fromDate:today2]; 

     /* 
     Create a date components to represent the number of days to subtract from the current date. 
     The weekday value for Sunday in the Gregorian calendar is 1, so subtract 1 from the number of days to subtract from the date in question. (If today is Sunday, subtract 0 days.) 
     */ 
     NSDateComponents *componentsToSubtract = [[NSDateComponents alloc] init]; 
     [componentsToSubtract setDay: 0 - ([weekdayComponents weekday] - 1)]; 

     NSDate *beginningOfWeek = [gregorian dateByAddingComponents:componentsToSubtract 
                  toDate:today2 options:0]; 

     /* 
     Optional step: 
     beginningOfWeek now has the same hour, minute, and second as the original date (today). 
     To normalize to midnight, extract the year, month, and day components and create a new date from those components. 
     */ 
     NSDateComponents *components = 
     [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | 
           NSDayCalendarUnit) fromDate: beginningOfWeek]; 
     beginningOfWeek = [gregorian dateFromComponents:components]; 



      UILocalNotification* localNotification = [[UILocalNotification alloc] init]; 
      localNotification.fireDate = beginningOfWeek; 
      localNotification.alertAction = @"View"; 
      localNotification.alertBody = [dictToday objectForKey:@"saint_description"]; 
      localNotification.repeatInterval = NSWeekdayCalendarUnit; 
      localNotification.timeZone = [NSTimeZone defaultTimeZone]; 
      localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber] + 1; 

      [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self]; 

     } 
    } 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(defaultsChanged:) 
               name:NSUserDefaultsDidChangeNotification 
               object:nil]; 

    UILocalNotification *locationNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 
    if (locationNotification) { 
     // Set icon badge number to zero 
     application.applicationIconBadgeNumber = 0; 
    } 
return yes; 
} 
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 




    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Today's Saint" 
                message:notification.alertBody 
                delegate:self cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
    if (notification.alertBody!=Nil) 
    [alert show]; 


    [[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" object:self]; 

    // Set icon badge number to zero 
    application.applicationIconBadgeNumber = 0; 
} 

は、私が述べてきたように、通知を起動するための正しいコードですか? そうでない場合は、何が問題なのですか?ありがとう!

答えて

6

ユーザーが設定を変更するたびに通知をスケジュールしているようです。ただし、のスケジュールを変更しないと、以前にスケジュールされた通知が表示されないことがあります。そのため、1日か2日前に繰り返し設定を変更した時刻と正確に一致する通知が表示されます。

スケジュールする通知は、変更する予定の通知とは異なるオブジェクトです。残念ながら、UILocalNotificationsには識別子トークンがありません。あなたが再スケジュール[[UIApplication sharedApplication] cancelAllLocalNotifications];前にdefaultsChanged:メッセージを受け取るたび

ただし、以前のすべての通知のスケジュールを解除することができます。これはあなたの問題を解決します。

this solutionもご覧ください。これは、ユーザーがアプリを再インストールしたときにバーストや重複した通知を避けるために、起動時に通知をキャンセルして再スケジュールすることを示唆しています。

+0

私はすでにcancelAllLocalNotificationsメソッドを使用していましたが、理由はわかりませんが、ここに貼り付けるのを忘れました。事は、今は彼らがすべきときに立ち上げられていないということです。例えば、私がlocalNotification.fireDate = [[NSDate date] dateByAddingTimeInterval:20];を使用すると、およびlocalNotification.repeatInterval = NSDayCalendarUnit;それは今から20秒後に毎日通知を出しますか? –

+0

あなたは間違った場所でそれを使用していますか? 'cancelAllLocalNotifications'は、貼り付けたメソッドで最初に行うべきことです。 –

+0

コードを更新しました。しかし通知はちょうどときに起動していません。何かご意見は? –

2

I持つ二つのアイデア、まず

:dictTodayの値は何ですか?

NSDictionary *dictToday= [self getDataFromdate : [compoNents day] month:[compoNents month]]; 
[dictToday objectForKey:@"saint_description"] 

この値がnilの場合、通知はポップされません。

第二:あなたのタイムゾーンを確認し、タイムゾーンから返された:あなたは+3時間帯になる可能性が

[NSTimeZone defaultTimeZone] 

と負の時間帯に発射するあなたのlocalnotificationを設定し、それはするつもりはありません起こる。

関連する問題