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