Objective c 应用程序处于后台或屏幕锁定时播放声音

Objective c 应用程序处于后台或屏幕锁定时播放声音,objective-c,Objective C,我有一个计时器,可以在时间达到0时播放声音,但现在我不知道如果应用程序处于后台模式或屏幕被锁定,如何触发事件以播放声音,我在web上搜索发现的是在我的.plist文件中设置“UIBackgroundModes”,并添加“audio”作为数组成员 UIBackgroundModes Array Item0 String audio 然后在应用程序委托中添加以下代码: NSError *setCategoryErr = nil; NSError *activationErr = nil; [[A

我有一个计时器,可以在时间达到0时播放声音,但现在我不知道如果应用程序处于后台模式或屏幕被锁定,如何触发事件以播放声音,我在web上搜索发现的是在我的.plist文件中设置“
UIBackgroundModes
”,并添加“
audio
”作为数组成员

UIBackgroundModes Array
Item0 String audio
然后在应用程序委托中添加以下代码:

NSError *setCategoryErr = nil;
NSError *activationErr  = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr];
但是声音无法播放。。所以我想知道是否有可能这样做,或者我应该改变方法

编辑:

我输入:

#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>
然后播放:

[player play];

我只有一段Swift代码,但将其转换为Obj-C应该很容易

尝试将
AVPlayerItem init与URL一起使用,然后将
AVPlayerItem init与PlayerItem一起设置

let assetUrl = self.nowPlayingItem!.associatedItem!.valueForProperty(MPMediaItemPropertyAssetURL) as! NSURL
let playerItem = AVPlayerItem(URL: assetUrl)

if let player = self.player {
    player.replaceCurrentItemWithPlayerItem(playerItem)
} else {
    self.player = AVPlayer(playerItem: playerItem)
}
self.player!.play() 
对于这一行代码:

NSString *soundFilePath = [NSString stringWithFormat:@"%@/clock.mp3",
                               [[NSBundle mainBundle] resourcePath]];
您是否尝试过:

[[NSBundle mainBundle] URLForResource:@"song" withExtension:@"mp3"];

nowPlayingItem在这里是一个MPMediaItem,但只需替换
NSURL*assetUrl=[NowPlayingItemValueForProperty:MPMediaItemPropertyAsetUrl]
by
NSURL*assetUrl=[[NSBundle mainBundle]URLForResource:@“song”带扩展名:@“mp3”]

以及播放声音的代码,它看起来如何?你导入MediaPlayer框架了吗?是的,很抱歉忘记了:P编辑了我的问题,这是我用来播放声音的代码,当应用程序运行时效果很好,但如果应用程序进入后台或屏幕被锁定,则无法播放。我不太了解swift,但我会尝试转换:P Y
[[NSBundle mainBundle] URLForResource:@"song" withExtension:@"mp3"];
// Create a new player item
    NSURL *assetUrl = [nowPlayingItem valueForProperty:MPMediaItemPropertyAssetURL];
    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:assetUrl];

    // Either create a player or replace it
    if (self.player) {
        [self.player replaceCurrentItemWithPlayerItem:playerItem];
    } else {
        self.player = [AVPlayer playerWithPlayerItem:playerItem];
    }