UILocalNotifications воспроизводит пользовательский звук - PullRequest
9 голосов
/ 18 августа 2011

Я реализовал локальное уведомление в своем приложении, но мне просто интересно, есть ли способ воспроизвести звук, который не является частью основного пакета приложения для iPhone. В основном в моем приложении я хочу, чтобы пользователь записывал звук, воспроизводимый при генерировании локального уведомления, вместо воспроизведения предварительно записанного звука или звука по умолчанию. Насколько я знаю, это может быть осуществимо, потому что я видел 2-3 приложения в магазине приложений, которые делают то же самое, что я хочу сделать

- (void)alertSelector:(NSString *)AlertTitle WithFiringTime:(NSDate *)date
{ 

UILocalNotification *localNotification = [[[UILocalNotification alloc] init] autorelease];
   [localNotification setFireDate:date];
   [localNotification setTimeZone:[NSTimeZone defaultTimeZone]];
   NSDictionary *data = [NSDictionary dictionaryWithObject:date forKey:@"payload"];       
   [localNotification setUserInfo:data];[localNotification setAlertBody:AlertTitle];   
   [localNotification setAlertAction:@"View"]; [localNotification setHasAction:YES]; 
   localNotification.soundName=@"voice.aif"; 

   if (!localNotification)
          return;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification]; 
}

Ответы [ 6 ]

3 голосов
/ 03 февраля 2012

Полагаю, ваш звук не отформатирован для воспроизведения в ОС. Убедитесь, что ваш звук отформатирован в формате IMA4. Кроме того, убедитесь, что ваш файл находится в вашем комплекте приложений, и вы должны быть в порядке.

Для получения дополнительной справки и аналогичного вопроса см. Этот вопрос SO.

Выбор пользовательского звука для локальных уведомлений

Вот ссылка на Руководство Apple по локальным и push-уведомлениям . Подробно объясняются звуки и используемые по умолчанию звуки.

0 голосов
/ 22 марта 2017

Что ж, у меня возникла та же проблема. Похоже, что раньше это не поддерживалось или невозможно воспроизвести пользовательский звук для локальных уведомлений, которые не включены в комплект приложений. Но позже это поддерживается, и вы можете назначить пользовательские звуки из контейнера приложения, в частности, в каталоге Library / Sounds. И это сработало со мной. вы можете либо загрузить звуки с сервера в этот каталог, либо протестировать его, скопировав файл .caf (Apple сказал, что другие расширения могут работать) из комплекта в каталог Library / sounds, а затем удалить ссылку на файл из комплекта, чтобы убедиться, что если звуки воспроизводятся, это из каталога вне пакета. Все это работает очень хорошо, главная проблема для меня, если пользователь принудительно цитирует приложение, оно перестает работать для локальных уведомлений, пока оно все еще работает с уведомлениями push-комплектов, я планирую локальное, хотя, когда приходит push-комплект push-уведомлений. Вот код для тестирования воспроизведения звука из каталога:

 func copyFileToDirectoryFromBundle()
{
    // get reference to library directory
    let LibraryDirectoryPaths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.LibraryDirectory, NSSearchPathDomainMask.UserDomainMask, true)

    // see what is in there 
    for path in LibraryDirectoryPaths
    {
        print("di=\(path)")
    }

    // prepare for sound directory
    let libraryDirectoryPath: AnyObject = LibraryDirectoryPaths[0]
    let soundsDirectoryPath = libraryDirectoryPath.stringByAppendingPathComponent("Sounds")

    // create sounds directory under library if not there already
    if !NSFileManager.defaultManager().fileExistsAtPath(soundsDirectoryPath)
    {
    do {
        try NSFileManager.defaultManager().createDirectoryAtPath(soundsDirectoryPath, withIntermediateDirectories: false, attributes: nil)
        print("sounds library created,,,")
    } catch let error as NSError {
        print("creating sounds directory error = \(error.localizedDescription)");
    }
    }
    else
    {
        print("Sounds directory is there already under Library")
    }

    do {
        // sounds directory should have been added under library
        let directoryContents = try NSFileManager.defaultManager().contentsOfDirectoryAtURL( NSURL(string: libraryDirectoryPath as! String)!, includingPropertiesForKeys: nil, options: [])
        print("Library directs=\(directoryContents)")


        // prepare for adding subdirectory with file name from bundle
        // here is where you should save files if downloaded from server 
        // here im just moving one from bundle 

        let subDirectoryPath = directoryContents.last!

        if let pathFromBundle = NSBundle.mainBundle().pathForResource("notification", ofType:"caf") {
            let myFilePathUnderSounds = "\(subDirectoryPath.path!)\("/notification.caf")"
            if !NSFileManager.defaultManager().fileExistsAtPath(myFilePathUnderSounds)
            {
            do {
                print("bundle path=\(pathFromBundle)and datacontainer path=\(subDirectoryPath.path!)")
                try NSFileManager.defaultManager().copyItemAtPath(pathFromBundle, toPath:myFilePathUnderSounds )
                print("item copied")
            } catch let error as NSError {
                print(error.localizedDescription);
            }
            }
            else
            {
                print("Your file from bundle path = \(pathFromBundle) is already there under Sounds")
            }
        }
        else
        {
            print("Item not found in bundle")
        }

        // see item there after you add it
        let subDirectories = try NSFileManager.defaultManager().contentsOfDirectoryAtURL( subDirectoryPath, includingPropertiesForKeys: nil, options: [])

        print("files under sounds")
        for fileDirectory in subDirectories
        {
            print(fileDirectory)
        }

    } catch let error as NSError {
        print(error.localizedDescription)
    }

}

Убедившись, что файл .caf находится в каталоге Library / Sounds. Все, что вам нужно сделать, это просто назначить имя файла с расширением для свойства soundName локального уведомления, например, если файл находится в комплекте.

0 голосов
/ 17 ноября 2015

Убедитесь, что ваш звуковой файл добавлен в список «Копировать ресурсы комплекта» в «Параметры проекта» -> («Цель» -> «Фазы сборки»)Это исправило проблему для меня.Сначала я получил только звук по умолчанию, хотя я указал произвольное имя файла (и файл был добавлен в проект).Но после того, как я вручную добавил файл в этот список, он начал работать.

Я использовал системный звук с моего Mac для тестирования.Я преобразовал его с помощью этой команды в консоли:

afconvert /System/Library/Sounds/Basso.aiff ~/Downloads/alert2.caf -d ima4 -f caff -v
0 голосов
/ 21 августа 2015
notif.soundName = @"sound.caf";

Это должно работать. Убедитесь, что звук на самом деле находится в комплекте вашего приложения, в правильном формате (линейный PCM или IMA4 - почти везде, где объясняется, как конвертировать звуки для iOS, будет указано, как это сделать), и он составляет менее 30 секунд.

Вы можете конвертировать из wav и mp3 с помощью терминала:

afconvert -f caff -d LEI16@44100 -c 1 in.wav sound.caf

«in.wav» - это входной звук, который вы хотите преобразовать, а «sound.caf» - выходной файл, перейдите в каталог, в который вы хотите поместить выходной файл

0 голосов
/ 10 февраля 2012

вы чистите старые уведомления?

UIApplication* app = [UIApplication sharedApplication];
NSArray*  oldNotifications = [app scheduledLocalNotifications];
if ([oldNotifications count] > 0) {
    [app cancelAllLocalNotifications];
}

В противном случае вы можете удалить приложение с телефона (возможно, потребуется перезагрузка), чтобы оно работало: -)

кроме того, код, упомянутый выше, должен быть правильным.и этой строки localNotification.soundName=@"voice.aif"; должно быть достаточно для воспроизведения пользовательских звуков.но если вы сначала протестировали уведомление без добавления звукового файла, звуковой файл по умолчанию (UILocalNotificationDefaultSoundName) регистрируется!и для повторной регистрации вы должны отменить предыдущее уведомление (cancelAllLocalNotifications) или удалить приложение, чтобы иметь возможность «повторно» зарегистрировать свое уведомление,

, кроме того, Apple Doc говорит:

Звуки продолжительностью более 30 секунд не поддерживаются.Если вы укажете файл со звуком, который будет воспроизводиться более 30 секунд, вместо него будет воспроизводиться звук по умолчанию.

надеюсь, что теперь это поможет: -)

0 голосов
/ 18 августа 2011

Из описания объекта soundName -

Для этого свойства укажите имя файла (включая расширение) звуковой ресурс в основном комплекте приложения или UILocalNotificationDefaultSoundName для запроса системы по умолчанию звук.

Не похоже, что можно использовать звуки, кроме присутствующих в комплекте. Вы уверены, что приложения используют локальные уведомления со своими пользовательскими звуками? Может быть, они воспроизводят звуки с предупреждениями или что-то в этом роде.

НТН,

Акшай

...