音频未在后台模式下播放

时间:2015-01-12 12:20:38

标签: ios objective-c nstimer avaudioplayer

当我的应用进入后台模式时,我想在5 seconds之后播放“音频”。 NSTimer已正确触发。我在5秒后得到NSLog(@"repeat");。但是,有些音频没有播放。我在目标中启用背景模式。我尝试了许多其他解决方案,在stackoverflow中找到,但没有运气。任何人都可以为我提供正确的解决方案。

在我的appdelegate.h文件中:

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>
{
    NSTimer* timer;
}

@property (strong, nonatomic) UIWindow *window;

@property (nonatomic, strong) NSString *musicName;
@property (nonatomic, strong) AVAudioPlayer *audioPlayer;

在我的appdelegate.m文件中:

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

@synthesize
musicName,
audioPlayer;

-(void) playAlarmSound
{
    musicName = @"note3BreakOf.mp3";
    // Construct URL to sound file
    NSString *path = [NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] resourcePath], musicName];
    NSURL *soundUrl = [NSURL fileURLWithPath:path];

    // Create audio player object and initialize with URL to sound
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundUrl error:nil];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self playAlarmSound];
    return YES;
}

-(void)methodRunAfterBackground
{
    [audioPlayer play];
    [timer invalidate];
    NSLog(@"repeat");
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplication *app = [UIApplication sharedApplication];

    //create new uiBackgroundTask
    __block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
        bgTask = UIBackgroundTaskInvalid;
    }];

    //and create new timer with async call:
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //run function methodRunAfterBackground
        timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(methodRunAfterBackground) userInfo:nil repeats:NO];
        [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
        [[NSRunLoop currentRunLoop] run];
    });
}

3 个答案:

答案 0 :(得分:1)

你需要添加&#34; playsAudio&#34;你的plist和设置

  • AVAudioSession sharedInstance类别:AVAudioSessionCategoryPlayback
  • AVAudioSession sharedInstance setActive:是
  • UIApplication sharedApplication beginReceivingRemoteControlEvents

似乎有些可能已被弃用,请查看here

在Objective-C中:

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

答案 1 :(得分:1)

  

当我的应用进入后台模式时,我希望在5秒后播放“音频”

嗯,你不能。如果您的应用主动当时播放音频 它会进入后台,那么当它进入后台时,它会被暂停 - 无论您的背景设置如何。你的计时器停止,应用程序就会休眠。

(很多人通过在应用程序进入后台时播放“静音”曲目来解决此问题,以便应用 在那时播放某些内容,并且可以在后台运行。)< / p>

答案 2 :(得分:0)

您可以通过使应用程序处于活动状态来执行此操作。我在我的应用程序中这样做。我正在使用位置管理器api使应用程序在后台运行。然后在计时器的帮助下开始在后台播放音频。您可以使用此链接https://github.com/voyage11/Location在后台激活该应用。希望这会有所帮助。