使用System Sound Services后台播放声音
使用System Sound Services后台播放声音
RDeveloper 发表于1年前
使用System Sound Services后台播放声音
  • 发表于 1年前
  • 阅读 16
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

最近在做运动相关的应用,需要在应用退到后台的时候播放声音,比如你已经跑了多少公里了,GPS信号不好,目标已达成等。

刚开始使用了 AVAudioPlayer,实现了后台播放的功能,但发现一个比较致命的问题:当其他应用也播放声音的时候就会被打断!

后来研究了一下,使用System Sound Services可以解决这个问题,代码如下:

#pragma mark - System Sound Services
 
 //播放多个文件
- (void)playWithWithFiles:(NSArray *)files
{
    if (![files isValidArray] || files.count <= 0) {
        return;
    }
 
    [self stop];
 
    [self.audioFiles removeAllObjects];
    [self.audioFiles addObjectsFromArray:files];
    [self playAudio:files.firstObject];
}
 
 //播放单个文件
- (void)playAudio:(NSString *)filePath
{
    AudioServicesDisposeSystemSoundID(self.currentSoundID);
 
    NSURL *fileURL = [NSURL fileURLWithPath:filePath];
    if (fileURL != nil) {
        SystemSoundID theSoundID;
        OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &theSoundID);
        if (error == kAudioServicesNoError) {
            self.currentSoundID = theSoundID;
            AudioServicesAddSystemSoundCompletion(theSoundID, NULL, NULL, (void *)completionCallback, NULL);
            AudioServicesPlaySystemSound(theSoundID);
        }
        else {
            NSLog(@"Failed to create sound ");
        }
    }
}
 
 //停止播放当前声音
- (void)stop
{
    [self.audioFiles removeAllObjects];
    AudioServicesDisposeSystemSoundID(self.currentSoundID);
}
 
 //播放完成后回调
void completionCallback(SystemSoundID mySSID)
{
    AudioServicesDisposeSystemSoundID(mySSID);
 
    if ([VoiveManager sharedInstance].audioFiles.count > 0) {
        [[VoiveManager sharedInstance].audioFiles removeObjectAtIndex:0];
    }
 
    if ([VoiveManager sharedInstance].audioFiles.count > 0) {
        [[VoiveManager sharedInstance] playAudio:[VoiveManager sharedInstance].audioFiles.firstObject];
    }
}​​ 

当然,使用System Sound Services也有它的限制:

  1. 只能播放一些很小的提示或者警告的声音
  2. 声音长度不能大于30秒
  3. 不能控制进度
  4. 格式支持比较少
标签: iOS Objective-C
共有 人打赏支持
粉丝 5
博文 26
码字总数 8379
×
RDeveloper
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: