iOS让App后台运行

作者: 此心不改 | 来源:发表于2016-07-11 11:30 被阅读7289次

一般来说,如果不进行后台申请,在iOS系统上,当应用退到后台后,只有5s的时间去执行代码,之后将进入挂起状态。只有像音频播放、定位、newsstand、VoIP等功能才能持续在后台运行。但是开发其它应用是我们可以通过申请后台,来获得3分钟的后台执行代码时间(iOS7以前是10分钟)。

最近,我搜集了一些关于iOS程序后台运行的方法,在此整理一下。本篇文章,我会贴出,后台运行3分钟和无限后台的方法。

在此之前,�你得了解iOS应用程序的生命周期:

Not running 未运行 程序没启动
Inactive 未激活 程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态
Active 激活 程序在前台运行而且接收到了事件。这也是前台的一个正常的模式
Backgroud 后台 程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态
Suspended 挂起 程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。
iOS应用程序生命周期(前后台切换,应用的各种状态)详解

一般App进入后台之后,超过了后台运行时间,便进入了挂起状态,无法执行代码,但是内存并没有清除。

主要用到2个方法:
beginBackgroundTaskWithExpirationHandler://申请后台,该方法只有在App处于激活时调用才有效。 endBackgroundTask://注销后台

后台执行3分钟方法:

#import "AppDelegate.h"

@interface AppDelegate (){
    NSInteger count;
}
@property(strong, nonatomic)NSTimer *mTimer;
@property(assign, nonatomic)UIBackgroundTaskIdentifier backIden;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    count=0;
    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    _mTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countAction) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:_mTimer forMode:NSRunLoopCommonModes];
    [self beginTask];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"进入前台");
    [self endBack];
}

//计时
-(void)countAction{
    NSLog(@"%li",count++);
}

//申请后台
-(void)beginTask
{
    NSLog(@"begin=============");
    _backIden = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        //在时间到之前会进入这个block,一般是iOS7及以上是3分钟。按照规范,在这里要手动结束后台,你不写也是会结束的(据说会crash)
        NSLog(@"将要挂起=============");
        [self endBack];
    }];
}

//注销后台
-(void)endBack
{
    NSLog(@"end=============");
    [[UIApplication sharedApplication] endBackgroundTask:_backIden];
    _backIden = UIBackgroundTaskInvalid;
}

@end

无限后台的方法,慎用!因为这个需要申请后台播放音频的权限。如果你的应用不是相关应用,AppStore审核可能不会通过。

好了,看方法!
先在info.plist文件里添加如此一条记录:

AppDelegate.m文件

#import "AppDelegate.h"

@interface AppDelegate (){
    NSInteger count;
}
@property(strong, nonatomic)NSTimer *mTimer;
@property(assign, nonatomic)UIBackgroundTaskIdentifier backIden;

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    count=0;
    return YES;
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    _mTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(countAction) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:_mTimer forMode:NSRunLoopCommonModes];
    [self beginTask];
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"进入前台");
    [self endBack];
}

//计时
-(void)countAction{
    NSLog(@"%li",count++);
}

//申请后台
-(void)beginTask
{
    NSLog(@"begin=============");
    _backIden = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
     
        NSLog(@"将要挂起=============");
        [self endBack];
    }];
}

//注销后台
-(void)endBack
{
    NSLog(@"end=============");
    [[UIApplication sharedApplication] endBackgroundTask:_backIden];
    _backIden = UIBackgroundTaskInvalid;
}

@end

ViewController.m文件

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

@interface ViewController ()

@property(strong, nonatomic)AVAudioPlayer *mPlayer;

@property(assign, nonatomic)CGFloat mCount;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    _mCount = 0;
    
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(countTime) userInfo:nil repeats:YES];
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

-(void)countTime{
    _mCount+=10;
    NSLog(@"%f",_mCount);
    
    if ([[UIApplication sharedApplication] backgroundTimeRemaining] < 60.) {//当剩余时间小于60时,开如播放音乐,并用这个假前台状态再次申请后台
        NSLog(@"播放%@",[NSThread currentThread]);
        [self playMusic];
        //申请后台
        [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
            NSLog(@"我要挂起了");
        }];
    }
}

-(void)playMusic{
    //1.音频文件的url路径,实际开发中,用无声音乐
    NSURL *url=[[NSBundle mainBundle]URLForResource:@"欢沁.mp3" withExtension:Nil];
    
    //2.创建播放器(注意:一个AVAudioPlayer只能播放一个url)
    _mPlayer=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];
    
    //3.缓冲
    [_mPlayer prepareToPlay];
    
    //4.播放
    [_mPlayer play];
}

@end

好了,就这些,不懂的私信我!如用错误,请指教!

相关文章

  • iOS让App后台运行

    一般来说,如果不进行后台申请,在iOS系统上,当应用退到后台后,只有5s的时间去执行代码,之后将进入挂起状态。只有...

  • iOS 后台刷新

    [TOC] iOS 后台刷新 首先大概介绍下iOS的APP运行状态简介和后台运行的一些基础知识 1. App运行状...

  • iOS 点击推送跳转详情页

    系统 API :iOS < 7、 7 <= iOS < 10、 iOS >= 10app 状态:后台运行、 前台...

  • iOS 后台持续定位

    前言 前文讲到程序推到后台的运行情况iOS 对APP推到后台运行时长的探究,主要还是想做个后台定位,希望APP在按...

  • iOS App 后台 Crash 调查

    Apple 一直在逐步放大 App 后台运行的权限,到今天为止,已知的 iOS App 后台运行场景有: Back...

  • iOS让App后台运行方法小结

    一般App进入后台之后,超过了后台运行时间,便进入了挂起状态,无法执行代码,但是内存并没有清除。主要用到2个方法:...

  • Paper Collection - Background Ta

    1.IOS后台运行机制详解(一)2.IOS后台运行机制详解(二)3.IOS后台运行 之 后台播放音乐4.转载:IO...

  • iOS 短信验证码倒计时按钮

    级别: ★★☆☆☆标签:「iOS 验证码后台倒计时」「NSTimer后台运行」「iOS 定时器后台运行」作者: ...

  • iOS后台模式借助位置更新实现

    需求:iOS系统下使我们的app在后台下(点击Home键进入后台)仍能继续运行任务. 阅读前提: 了解后台任务机制...

  • iOS 后台运行VoIP 类APP

    转载文章来自: http://www.cnblogs.com/jhzhu/p/3416305.html苹果官方原文...

网友评论

  • PGOne爱吃饺子:大佬 大佬 在不在啊 私信你了 回复我啊
  • ChenL:_mTimer 在进入前台的时候没有销毁,可能会出现内存泄漏问题
  • 面试小集:播放音频不是必须的吧?
  • 棍武中原:已收藏。楼主,么么哒
  • 红街咖啡:貌似不管用啊,我有个按钮点击结束发个通知让他结束,结果进入后台顶部还有红色显示,没有结束后台啊
  • d6b305902a5e:老哥,在吗??有关音乐后台运行的问题,需要请教下。我按照,你说的这个无限后台运行的方法。进入后台以后,音乐并没有继续播放3秒左右就停了。但是呢,你的代码里面不是有个 NSLog(@"%li",count++);然后,这个count当打印输入到175左右,就可以播放音乐了。希望能得到老哥的帮助。
  • 96e4766b589a:斗鱼好像加了这功能,感觉蛮不错的,看直播什么的,可以就听听声音,方便干其他的,蛮不错的
  • leftwater:请问 类似安卓的 app被kill掉了 能起个对一个的服务一直在run吗? apple有通用的许可的bean吗
  • 翻滚的炒勺2013:定位服务楼主研究了吗
  • 卖女孩的小match:楼主,今天试了你的方法,我现在需要这个,可是就能坚持三分钟啊. 现在是iOS10
    卖女孩的小match:@此心不改 在模拟器上可以坚持很久,但是真机上只能三分钟
    卖女孩的小match:@此心不改 对啊 ,我播放了一个无声的mp3格式的音乐,可是就能坚持三分钟.现在很需要这个,博主大大可以帮我想想问题出在哪了么
    此心不改:@张仙苼 后台播放音乐的你试了吗?
  • 竹_屋_听_雨:后台 不用音频 可以做到么?另外 后台音频的时候 打电话会不会影响到后台运行的稳定性?
    此心不改:@Charlie_ 目前我只用音频试过,其它方法楼下提到了,可不可以我也不清楚,后续我试过了,会将方法贴出来。至于使用音频,从性能方面来看,跟你后台听音乐,做其他事是一样的。
  • 许还真:貌似TCP能做到后台长连接,如果是其他的话,是需要后台设置mode音频模式的。 还有蓝牙也是可以的。 ios后台运行,感觉挺麻烦,特别是音频,你要考虑到打断、电话、短信、siri之类。
    :grin:
  • blackJokerZ:刚好要用到,Mark
    此心不改:@blackJokerZhou 希望能帮到你
  • 3bc5c2fd4c22:已收藏
    3bc5c2fd4c22:@Charlie_ 哈哈哈哈
    竹_屋_听_雨:@瓦斯要爆炸啦 头像太屌啦
  • 7emini:收藏
  • visual_:辛苦。

本文标题:iOS让App后台运行

本文链接:https://www.haomeiwen.com/subject/srtjjttx.html