AVAudioPlayer 将应用程序保持在加载屏幕中

Posted

技术标签:

【中文标题】AVAudioPlayer 将应用程序保持在加载屏幕中【英文标题】:AVAudioPlayer keeping app in loading screen 【发布时间】:2014-12-12 02:39:14 【问题描述】:

当我在第一个场景中使用此代码播放音乐时,应用程序会显示加载屏幕,但随后会停留在那里并且不会进入我的主菜单或其他任何内容。有什么建议吗?

        NSError *error;
    NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"POL-parallel-fields-short" withExtension:@"mp3"];
    AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];
    [player setVolume:0.1];
    player.numberOfLoops = -1;
    [player prepareToPlay];

    SKAction*   playAction = [SKAction runBlock:^
        [player play];
        ];
    SKAction *playMusic = [SKAction repeatActionForever:playAction];

    [self runAction:playMusic];

【问题讨论】:

当您切换场景时,所有动作都会自动停止。你应该再玩一次,我的建议是使用实例方法。 @Valar Morghulis 在对他的另一个问题发表评论后,我理解他所指的加载屏幕是应用程序启动屏幕,而不是他创建的自定义加载屏幕,因此,没有画面切换。 @Nicholas Whitley 正如我在您的另一篇文章中所评论的那样 - 我在某个地方读到有人抱怨类似问题,他发现他不小心创建了一个无限循环,导致应用程序无法运行执行实际运行应用程序其余部分的代码。在您根据我在另一篇文章中的回答进行修改后是否也会发生这种情况? 【参考方案1】:

我建议创建 MusicHelper 实例。

//MusicHelper.m

@interface MusicHelper()
@property (nonatomic) AVAudioPlayer * backgroundMusicPlayer;
@end

@implementation MusicHelper

+ (instancetype)sharedInstance 
    static dispatch_once_t pred;
    static MusicHelper * _sharedInstance;
    dispatch_once(&pred, ^ _sharedInstance = [[self alloc] init]; );
    return _sharedInstance;


- (void)playBackgroundMusic:(NSString *)filename 
    NSError *error;
    NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];
    self.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error];
    self.backgroundMusicPlayer.numberOfLoops = -1;
    [self.backgroundMusicPlayer prepareToPlay];
    [self.backgroundMusicPlayer play];


- (void)pauseBackgroundMusic

    [self.backgroundMusicPlayer pause];


@end

//MusicHelper.h

#import <Foundation/Foundation.h>
@import AVFoundation;

@interface MusicHelper : NSObject

+ (instancetype)sharedInstance;
- (void)playBackgroundMusic:(NSString *)filename;
- (void)pauseBackgroundMusic;

@end

你可以在任何场景中这样调用。

[[MusicHelper sharedInstance] playBackgroundMusic:@"yourMusic.mp3"]; //Play
[[MusicHelper sharedInstance] pauseBackgroundMusic]; //Stop

【讨论】:

以上是关于AVAudioPlayer 将应用程序保持在加载屏幕中的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioPlayer 是从磁盘流式传输文件,还是一次将其全部加载到内存中?

Python - Windows - 将程序保持在另一个全屏应用程序之上

给定现有路径的 AVAudioPlayer 大量加载音频

AVAudioPlayer 阻塞和 iOS 5 问题

AVAudioPlayer 和按钮按下

将 MPMediaItems 与 AVAudioPlayer 一起使用