iOS系统后台机制大概可以分为5种状态
Not Running:APP没有启动,也没有后台运行。
Active:用户正在使用APP,比如说我们聊微信看网页的时候,APP就处于Active状态。
Inactive:这是一个过渡的状态,APP虽然打开了,但是用户没有跟APP有任何互动 *** 作。
Background:APP在后台运行,微信会在没有打开的时候接收消息。
Suspended:APP虽然在后台运行,但是处于休眠状态,只占用一点内存。
** 那么我需要的是Background模式。即APP在后台运行同时保持程序active的状态 **
首先去xCode里面设置。到info.plist中添加以下信息:
然后到Capabilities里面打开后台模式,并根据项目的要求勾选对应的功能。我这里只需要保持后台运行并且播放背景音乐及通知功能。所以就勾选了第一个唤蚂和最后一个
以上这两步是告诉系统我空樱这个APP支持后台模式,对应的环境为音频环境。
可是到这一步,APP还是不能长时间运行到后台。
为什么?我们思考一下。我们让程序支持了后台运行的模式。那么我们是不是还需要系统知道我们的程序要在后台运行多久呢?我们需要告诉系统我们期望APP在后台存活的时间。
首先声明一个属性
@property (nonatomic, assign) UIBackgroundTaskIdentifier bgTask
在进入后台的时候通过AppDelegate里面的方法:
-(void)applicationDidEnterBackground:(UIApplication *)application{
[ self comeToBackgroundMode]
}
-(void)comeToBackgroundMode{
//初始化一个后台任务BackgroundTask,这个后台任务的作用就是告诉系统当前斗链丛app在后台有任务处理,需要时间
UIApplication* app = [UIApplication sharedApplication]
self.bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app 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
}]
}
}
现在就可以让我们的APP一直运行在后台啦!总结下来的思路就是:通过一个后台任务(这个任务我们也不用管,它存在的意义就是和系统去请求后台运行的一定的时间),这个时间我们不知道也不用去管,我们可以通过该时间还剩下多少判断是否继续请求时间,如此循环,我们就可以不断的请求时间来保持我们的app一直运行在后台。
接下来解决音乐在后台模式(切换到后台或者锁屏状态)下停止播放的问题。
其实很简单。
//设置后台模式和锁屏模式下依然能够播放
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil]
[[AVAudioSession sharedInstance] setActive: YES error: nil]
//初始化播放器和两个音频(一个有声 一个无声)
NSURL *urlSound = [[NSURL alloc]initWithString:[[NSBundle mainBundle]pathForResource:@"pomodoSound" ofType:@"m4a"]]
playerSound = [[AVAudioPlayer alloc] initWithContentsOfURL:urlSound error:&playerError]
NSURL *urlNoSound = [[NSURL alloc]initWithString:[[NSBundle mainBundle]pathForResource:@"backSound" ofType:@"mp3"]]
playerNoSound = [[AVAudioPlayer alloc] initWithContentsOfURL:urlNoSound error:&playerError]
playerSound.numberOfLoops = -1
playerNoSound.numberOfLoops = -1
player = playerSound
[player play]
下面解释一下AVAudioSession的一些设置参数
NSString *const AVAudioSessionCategoryAmbient
静音模式或者锁屏下不再播放音乐,和其他app声音混合。
NSString *const AVAudioSessionCategorySoloAmbient
默认模式,静音模式或者锁屏下不再播放音乐,不和其他app声音混合。
NSString *const AVAudioSessionCategoryPlayback
表示对于用户切换静音模式或者锁屏 都不理睬,继续播放音乐。并且不播放来自其他app的音乐
NSString *const AVAudioSessionCategoryRecord
不播放音乐,锁屏状态继续录音
NSString *const AVAudioSessionCategoryPlayAndRecord
播放音乐,并录音
1、进入微信后,找到局银小程序。2、打开右上角的三个点。
3、点击复制链接,发巧腊高送给朋友即可。
4、不过有一点需要注意,发送链接需要复制后,进入与朋友的对话框孝尺来粘贴发送。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)