I'm developing an app which is running in background. Sometimes I need to tell the user that something is happenning so I play a sound a certain number of times. To do that I made a timer but the problem is that It cannot exceed 10s of the total delayed time, after that, there are no more sounds (but the app is still running). I've checked this behavior in foreground mode and it works perfectly.
This is my code when I need to inform the user:
AudioServicesPlaySystemSound(alarma);
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
numAlarm = 1;
NSTimeInterval delay_in_seconds = 2.0;
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW,delay_in_seconds*NSEC_PER_SEC);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_after(delay,queue,^{
[self fiBGTemps:ALARM];
});
and the "fiBGTemps" is something like this,
- (void)fiBGTemps:(int)sender
{
switch (sender){
case TEMP_SCAN:
(…)
break;
case ALARM:
if (numAlarm>0 && numAlarm<NUM_ALARM)
{
AudioServicesPlaySystemSound(alarma);
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
NSTimeInterval delay_in_seconds = 2;
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW,delay_in_seconds*NSEC_PER_SEC);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_after(delay,queue,^{
[self fiBGTemps:ALARM];
});
numAlarm++;
}
break;
}
}
Is that behavior normal? Am I missing something?
Thanks
Kanick
I suspect that chaining asynch blocks to play sounds at regular intervals is a bit of an overkill. Perhaps something simpler along the following lines would be easier to understand and maintain:
Problem solved.
This is what happens. When an app is running in background and and it is executed a task, this task is running in background as well but the system allows only a certain amount of time (10s apron.) in order to safe battery. So it is only for a specific tasks (localization, download, etc.).
I my case I need a little more time so the solution is to define the task as a UIBackgroundTask in such a way that will be the task who notify the system when it is completed and thus can be terminated.
this is the code where it is called the task:
And here you can see the discussion on the Apple Forums where they explain this better than me.
AppleForums discussion
I hope this helps.
Kanick
You can try with re-setting the delay value after it exceed 10s of the total delayed time or may be after it has played sound for certain amount of time.