保持后台活跃性

2018-05-03  本文已影响10人  Luyc_Han
//
//  ViewController.m
//  TheBackground
//
//  Created by 王木木 on 2018/4/27.
//  Copyright © 2018年 wangmumu. All rights reserved.
//

#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>

@interface ViewController ()

/**  */
@property (nonatomic,strong) AVAudioPlayer *audioPlayer;

@property (nonatomic, assign) UIBackgroundTaskIdentifier bgTask;

/**  */
@property (nonatomic,strong) NSTimer *timer;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
#ifdef HAN
    
    NSLog(@"1111");
    
#endif
    
    NSError *error;
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
    
    if (error) {
        
        NSLog(@"有错误1");
        
    }
    
    NSError *activeError;
    [[AVAudioSession sharedInstance] setActive:YES error:&activeError];
    
    if (activeError) {
        
        NSLog(@"有错误2");
        
    }
    
    NSError *audioError;
    
    self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[self getUrl] error:&audioError];
    
    [self.audioPlayer prepareToPlay];
    [self.audioPlayer setNumberOfLoops:-1];
    self.audioPlayer.volume = 1.0;
    
    if (audioError) {
        
        NSLog(@"播放器初始化失败");
        
        self.audioPlayer = nil;
        
    }
    
    [self creatPlayer];
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(breakAudioSessionEvent:) name:AVAudioSessionInterruptionNotification object:nil];
    
    
    self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
        self.bgTask = UIBackgroundTaskInvalid;
    }];
    
    //开启定时器 不断向系统请求后台任务执行的时间
    self.timer = [NSTimer scheduledTimerWithTimeInterval:25.0 target:self selector:@selector(applyForMoreTime) userInfo:nil repeats:YES];
    [self.timer fire];
    
}

- (void)applyForMoreTime {
    
    //如果系统给的剩余时间小于60秒 就终止当前的后台任务,再重新初始化一个后台任务,重新让系统分配时间,这样一直循环下去,保持APP在后台一直处于active状态。
    if ([UIApplication sharedApplication].backgroundTimeRemaining < 60) {
        
        [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
        
        self.bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            
            [[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
            
            self.bgTask = UIBackgroundTaskInvalid;
            
        }];
        
    }
    
    

}

- (void)breakAudioSessionEvent:(NSNotificationCenter *)sender {
    
    NSLog(@"来电话了");
    
    [self creatPlayer];
    
}

- (void)creatPlayer {
    
  [self.audioPlayer play];
    
}

- (NSURL *)getUrl {
    
    NSString *path = [[NSBundle mainBundle] pathForResource:@"群星-昨日重现" ofType:@"mp3"];
    
    NSURL *pathUrl = [NSURL fileURLWithPath:path];
    
    return pathUrl;
    
}

@end

image.png
上一篇 下一篇

猜你喜欢

热点阅读