Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Random Local Notification in background

I want random Local Notification (Text and Sound) in every minute. I am using this below code:

self.randomIndex_text  = arc4random() % [self.array_motivation count];
self.randomIndex_alarm = arc4random() % [self.array_alarm count];
NSLog(@"text %d, alarm %d",self.randomIndex_text, self.randomIndex_alarm);

This code perfectly works for

- (void)application:(UIApplication *)app didReceiveLocalNotification:(UILocalNotification *)notif
{
notif.soundName = [NSString stringWithFormat:@"%@.mp3", [self.array_alarm objectAtIndex:self.randomIndex_alarm]];
    [self _showAlert:[NSString stringWithFormat:@"%@",[self.array_motivation objectAtIndex:self.randomIndex_text]] withTitle:@"Daily Achiever"];
}

Display alert from above code and on Ok of alert this below method call:

-(void)insert:(NSDate *)fire
{
    self.localNotification = [[UILocalNotification alloc] init];

    if (self.localNotification == nil)
        return;

    self.randomIndex_text  = arc4random() % [self.array_motivation count];
    self.randomIndex_alarm = arc4random() % [self.array_alarm count];
    NSLog(@"text %d, alarm %d",self.randomIndex_text, self.randomIndex_alarm);

    self.localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:refTimeIntrval];
    self.localNotification.timeZone = [NSTimeZone defaultTimeZone];
    self.localNotification.alertBody = [NSString stringWithFormat:@"%@",[self.array_motivation objectAtIndex:self.randomIndex_text]];
    self.localNotification.soundName = [NSString stringWithFormat:@"%@.mp3",[self.array_alarm objectAtIndex:self.randomIndex_alarm]];
    self.localNotification.alertAction = @"View";
    self.localNotification.applicationIconBadgeNumber = [[UIApplication sharedApplication] applicationIconBadgeNumber]+1;
    self.localNotification.repeatInterval=NSMinuteCalendarUnit;

    NSLog(@"alertBody %@,soundName %@", self.localNotification.alertBody, self.localNotification.soundName);
    [[UIApplication sharedApplication] scheduleLocalNotification:self.localNotification];
}

but does not work in background. I just put this above random method in

- (void)applicationDidEnterBackground:(UIApplication *)application
{
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)
        {
            UILocalNotification *localNotif = [[UILocalNotification alloc] init];
            if (localNotif)
            {
                self.randomIndex_text  = arc4random() % [self.array_motivation count];
                self.randomIndex_alarm = arc4random() % [self.array_alarm count];
                NSLog(@"tempmethod text %d, alarm %d",self.randomIndex_text, self.randomIndex_alarm);

                localNotif.fireDate = [[NSDate date] dateByAddingTimeInterval:refTimeIntrval];
                localNotif.alertBody = [NSString stringWithFormat:@"%@",[self.array_motivation objectAtIndex:self.randomIndex_text]];
                localNotif.soundName =[NSString stringWithFormat:@"%@.mp3",[self.array_alarm objectAtIndex:self.randomIndex_alarm]];
                localNotif.alertAction = NSLocalizedString(@"Read Msg", nil);
                localNotif.applicationIconBadgeNumber = 1;
                [localNotif setRepeatInterval:NSMinuteCalendarUnit];
                [application presentLocalNotificationNow:localNotif];

                NSLog(@"sound: %@, alertAction: %@, alerBody: %@, ref: %f, str_time: %@",localNotif.soundName, localNotif.alertAction, localNotif.alertBody, refTimeIntrval, str_Time);

                [self performSelector:@selector(bgmethodd) withObject:nil afterDelay:refTimeIntrval];
                break;
            }
        }
        [application endBackgroundTask:self->bgTask];
        self->bgTask = UIBackgroundTaskInvalid;
    });
    NSLog(@"smh: %d,%d,%d",self.seconds, self.minutes, self.hours);
    }
}

One more thing i noticed when i do debug that applicationDidEnterBackground call at one time only (i.e when application moves in background). After that no any method call till application open again but still i got notification text and sound continoulsy. But this text and sound is not random.

Please suggest me some idea and share your knowledge that from where this notification text and sound come when no any method call in background. And is it possible to make notification random in background. Thanks in advance.

like image 226
Abha Avatar asked Apr 08 '13 08:04

Abha


1 Answers

The first notification that you schedule when the app goes in background is repeating with interval NSMinuteCalendarUnit, and therefore the app shows only that notification every minute.

In order to get random alerts and sounds, the local notification needs to execute some code in background that will generate the next random sound and alert, which is not possible.

One way to do this is to schedule 64 (max) local notifications in advance with random sounds and alerts. When the user opens the app, you can see how many notifications were fired in background, and reschedule them.

To be sure that local notifications will be fired even if the user doesn't open the application during those 64 notifications, the last notification needs to be repeating with interval NSMinuteCalendarUnit. So after the first 63 notifications, you will lose the randomness, but if the user opens the app frequently this will not be a problem.

like image 67
Vojce kushevski Avatar answered Oct 08 '22 08:10

Vojce kushevski