美文网首页iOS_Skill_Collect
iOS让App后台运行方法小结

iOS让App后台运行方法小结

作者: H_A_N | 来源:发表于2017-09-16 15:54 被阅读892次

一般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文件里添加如此一条记录:

343943d3f4c2.png

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后台运行方法小结

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

  • iOS让App后台运行

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

  • iOS 后台刷新

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

  • 【IOS】APP推送通知处理

    1.APP后台挂起状态 2.APP前台运行中 收到推送 方法①是ios7新加入的方法,并且如果实现了方法①那么方法...

  • iOS 点击推送跳转详情页

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

  • iOS 后台持续定位

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

  • iOS App 后台 Crash 调查

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

  • iOS 7,8,9 推送通知

    iOS app Push 使用Houston在本地调试远程通知 参考iOS推送小结 Ruby的运行 houst...

  • iOS 后台运行方法

    应用可以调用UIApplication的beginBackgroundTaskWithExpirationHand...

  • 待总结:判断APP处于前台还是后台的方案

    判断App位于前台或者后台的6种方法 android 如何判断app 运行在后台

网友评论

    本文标题:iOS让App后台运行方法小结

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