Если вы хотите, чтобы элементы были только в разделе "музыка" (не подкасты или рингтоны), примерно так должно работать:
MPMediaQuery * query = [MPMediaQuery songsQuery];
NSArray * items = [query items];
NSPredicate * predicate = [NSPredicate predicateWithBlock:
^(id evaluatedObject, NSDictionary *bindings){
MPMediaItem * item = evaluatedObject;
NSNumber * duration = [item valueForProperty:MPMediaItemPropertyPlaybackDuration];
return [duration doubleValue] < 30;
}];
NSArray * filteredItems = [items filteredArrayUsingPredicate:predicate];
К сожалению, MPMediaPropertyPredicate
не позволяет нам фильтровать по «длительности менее 30 секунд» (типы сравнения: «EqualTo» и «Contains»), поэтому мы делаем это вручную выше.
Затем вам нужно экспортировать нужную дорожку, используя AVAssetExportSession
. Возможно, вам потребуется преобразовать его в один из поддерживаемых форматов в Руководство по программированию локальных и push-уведомлений . Я также предлагаю использовать фиксированное имя файла, чтобы было легче отслеживать созданные вами файлы.
Наконец, вы не можете писать в свой пакет приложений, поскольку это делает подпись кода недействительной (очевидно, вы раньше могли; возможно, подпись проверяется только во время установки). Тем не менее, вы могли бы иметь возможность использовать относительный путь, например ../Library/Application Support/MyApp/MySound.mp4
.
Обратите внимание, что это не гарантированно работает и может не пройти проверку приложения! В частности,
- Нет гарантии, что путь начнется с
../Library
. Алгоритм генерации относительных путей выходит за рамки этого ответа. (Абсолютный путь, вероятно, не будет работать, поскольку он не работает с -[NSString stringByAppendingPathComponent:]
.)
- Нет гарантии, что
UILocalNotification.soundName
примет путь; в документации просто говорится, что он принимает «имя файла (включая расширение) звукового ресурса в основном комплекте приложения».