Создание приложения для будильника в iOS - PullRequest
0 голосов
/ 20 марта 2019

Я хочу разработать приложение 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 минут от текущего времени.

У меня есть следующие вопросы:

  1. Каковы методы / хаки для запуска конкретной задачи после интервала времени "х" минут?
  2. Как лучше всего реализовать будильник в iOS?

Буду признателен за любые предложения и мысли на эту тему.

EDIT : Я нашел приложение для будильника в App Store, которое может воспроизводить тревожную музыку в течение бесконечного времени при срабатывании будильника. Как это приложение может определить, когда запустить музыку будильника?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Вы должны указать название музыки, установив для свойства sound значение content.
Так что вместо:
content.sound = [UNNotificationSound defaultSound];

Вы должны установить:
content.sound = [UNNotificationSound soundNamed:@"yourSoundName.mp3"];

Кроме того, убедитесь, что длина вашей музыки не превышает 30 секунд.

0 голосов
/ 25 марта 2019

Вы уже рассматривали возможность использования запланированного времени NSTimer с интервалом времени? Это может быть использовано для выполнения действия через определенный промежуток времени в соответствии с вашими потребностями. Кроме того, проверьте эту статью http://andrewmarinov.com/building-an-alarm-app-on-ios/ от Андрея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...