Search code examples
iphoneios5ios6uilocalnotification

Repeat alarm at particular time interval


Issue is, i put a date picker programmatically. In date picker i just used to display time from 1mins to 23 hours. User is supposed to set the time in the picker, and set up the notification. Now,i get notification in background but only one time.I have to repeat time until timer will not stop.

I found too many links and source but not able to solve this issue

My Code:

In Appdelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    application.applicationIconBadgeNumber = 0;

    //------ Handle launching from a notification-------
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

    self.localNotification =[launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (self.localNotification)
    {
        application.applicationIconBadgeNumber = self.localNotification.applicationIconBadgeNumber-1;
        NSLog(@"badge number: %d", application.applicationIconBadgeNumber);
        [self playSoundWithNotification:self.localNotification];
    }
    else
    {
        [[UIApplication sharedApplication]cancelAllLocalNotifications];
    }
}

didenterinbackground:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"Application entered background state.");
    NSAssert(self->bgTask == UIBackgroundTaskInvalid, nil);

    bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [application endBackgroundTask:self->bgTask];
            self->bgTask = UIBackgroundTaskInvalid;
        });
    }];

    dispatch_async(dispatch_get_main_queue(), ^{
        while ([application backgroundTimeRemaining] > 1.0)
        {
            NSString *str_friend = @"Hello,";
            if (str_friend)
            {
                UILocalNotification *localNotif = [[UILocalNotification alloc] init];
                if (localNotif)
                {
                    localNotif.alertBody = [NSString stringWithFormat:
                                            NSLocalizedString(@"%@ has a message for you.", nil), str_friend];
                    localNotif.alertAction = NSLocalizedString(@"Read Msg", nil);
                    localNotif.soundName = @"alarmsound.caf";
                   //localNotif.soundName =[NSString stringWithFormat:@"%@.mp3",str_Alarm];
                    localNotif.applicationIconBadgeNumber = 1;
                    [application presentLocalNotificationNow:localNotif];

                    NSLog(@"sound: %@, alertAction: %@, alerBody: %@",localNotif.soundName, localNotif.alertAction, localNotif.alertBody);
                    str_friend = nil;
                    break;
                }
            }
        }
        [application endBackgroundTask:self->bgTask];
        self->bgTask = UIBackgroundTaskInvalid;
    });
}

-

(void)playSoundWithNotification:(UILocalNotification *)notification
{
   notification.soundName=[NSString stringWithFormat:@"%@.mp3",str_Alarm];
    NSLog(@"soundname: %@",notification.soundName);
}

- (void)application:(UIApplication *)app didReceiveLocalNotification:(UILocalNotification *)notif
{
    testDate=notif.fireDate;
    NSLog(@"DATE IS: %@, %@",testDate, notif.fireDate);
    // Handle the notificaton when the app is running
    NSLog(@"Recieved Notification %@",notif);
    [self playSoundWithNotification:notif];

    [self _showAlert:[NSString stringWithFormat:@"%@",str_Motivation] withTitle:@"Daily Achiever"];
}

- (void) _showAlert:(NSString*)pushmessage withTitle:(NSString*)title
{
    UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:title message:pushmessage delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alertView show];
    if (alertView)
    {
    }
}

in myviewcontroller:

-(void)insert:(NSDate *)fire
{
    appDelegate=(AppDelegate *)[[UIApplication sharedApplication] delegate];
    appDelegate.localNotification = [[UILocalNotification alloc] init];
    NSLog(@"localNotification %@", appDelegate.localNotification);

    if (appDelegate.localNotification == nil)
        return;

    appDelegate.localNotification.fireDate = fire;
    appDelegate.localNotification.timeZone = [NSTimeZone defaultTimeZone];
    appDelegate.localNotification.alertBody = appDelegate.str_Motivation;
    appDelegate.localNotification.alertAction = @"View";
    appDelegate.localNotification.soundName = [NSString stringWithFormat:@"%@.mp3",appDelegate.str_Alarm];

    appDelegate.localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber]+1;
    NSLog(@"localNotification.alertBody %@", appDelegate.localNotification.alertBody);
    NSLog(@"localNotification.soundName %@",appDelegate.localNotification.soundName);
    [[UIApplication sharedApplication] scheduleLocalNotification:appDelegate.localNotification];
}

Please Help.


Solution

  • - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        ......
        ......
        if (localNotif)
        {
          localNotif.alertBody = [NSString stringWithFormat:
                                                    NSLocalizedString(@"%@ has a message for you.", nil), str_friend];
          localNotif.alertAction = NSLocalizedString(@"Read Msg", nil);
          localNotif.soundName = @"alarmsound.caf";
          localNotif.applicationIconBadgeNumber = 1;
          [localNotif setRepeatInterval:NSMinuteCalendarUnit];
          [application presentLocalNotificationNow:localNotif];
    
          str_friend = nil;
          break;
         }
    }
    

    I got solution.