0

我正在尝试访问 iPod 音乐库,然后在我的应用程序处于后台时创建本地通知。我想在本地通知中播放选定的声音。我的问题是 Apple 只允许那些少于 30 秒的文件。长度。

那么有没有办法只列出那些长度小于 30 秒的声音?

如果我得到这个列表,那么我需要将选定的媒体文件复制到我的资源包中。然后我可以将它发送到我的本地通知。直到和除非有任何方法可以将媒体项目直接发送到本地通知。

感谢大家的帮助。。

4

1 回答 1

0

假设您只想要“音乐”下的项目(而不是播客或铃声),这样的事情应该可以工作:

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,我们不能通过“duration less than 30 seconds”(比较类型是“EqualTo”和“Contains”)进行过滤,所以我们在上面手动进行。

然后您需要使用导出所需的曲目AVAssetExportSession。您可能需要将其转换为Local and Push Notification Programming Guide中支持的格式之一。我还建议使用固定的文件名,以便更轻松地跟踪您创建的文件。

最后,您不能写入您的应用程序包,因为这会使代码签名无效(显然您曾经能够这样做;也许签名仅在安装时检查)。但是,您也许可以使用相对路径,例如../Library/Application Support/MyApp/MySound.mp4.

请注意,这不能保证有效,并且可能无法通过应用审核!尤其,

  • 不能保证路径将以../Library. 生成相对路径的算法超出了这个答案的范围。(绝对路径可能不起作用,因为它不适用于-[NSString stringByAppendingPathComponent:].)
  • 不能保证UILocalNotification.soundName会接受路径;文档只是说它接受“应用程序主包中声音资源的文件名(包括扩展名)”。
于 2013-04-09T13:57:25.793 回答