Я хочу разработать приложение alarm в iOS. До сих пор я создал базовый пользовательский интерфейс, где пользователь может выбрать время срабатывания будильника. Код планирует на это время одно локальное уведомление, используя следующий код:
UNMutableNotificationContent *content = [UNMutableNotificationContent new];
content.title = @"Helloooooo...";
content.body = @"Time to wake up!";
content.sound = [UNNotificationSound defaultSound];
//create trigger
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:triggerDate repeats:NO];
NSString *identifier = @"test";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier
content:content trigger:trigger];
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"Something went wrong: %@",error);
}
}];
Теперь, , когда сработает это уведомление, я хочу воспроизвести музыку (например, сигнал будильника) . После долгих исследований я понял, что нет обратных вызовов для события, инициируемого уведомлением, когда приложение находится в фоновом режиме.
Другой подход, который я попробовал, в котором код пытается вызвать метод playAlarmTone
после определенного таймера:
UIApplication *app = [UIApplication sharedApplication];
//create new uiBackgroundTask
__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
//and create new timer with async call:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//run function methodRunAfterBackground
NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:lroundf(secondsBetween)
target:self
selector:@selector(playAlarmTone)
userInfo:nil
repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] run];
});
Но при таком подходе музыка не воспроизводится, если будильник установлен более чем на 15 минут от текущего времени.
У меня есть следующие вопросы:
- Каковы методы / хаки для запуска конкретной задачи после интервала времени "х" минут?
- Как лучше всего реализовать будильник в iOS?
Буду признателен за любые предложения и мысли на эту тему.
EDIT :
Я нашел приложение для будильника в App Store, которое может воспроизводить тревожную музыку в течение бесконечного времени при срабатывании будильника. Как это приложение может определить, когда запустить музыку будильника?