Background Modes Tutorial: Getting Started
iOS后台模式教程 (一)
使用场景
在iOS7之前的系统中,当应用被挂起,拥有连续的10分钟时间来处理之前的任务,然后才会被系统终止。
所以,后台模式有一些特殊的使用场景。例如,更新位置,播放视频音频,和更新服务器请求。
开始
第一步设置工程中的Capabilities
标签栏,打开Background Modes
服务。
出现的Modes
选项有
- Audio,AirPlay and Picture in Picture 视频音频播放
- Location updates 位置更新
- Voice over IP IP电话
- Newsstand downloads 杂志下载
- External accessory communication 外部附件通信,包括App Watch
- Uses Bluetooth LE accessories 蓝牙LE配件
- Acts as a Bluetooth LE accessory 作为蓝牙LE配件
- Background fetch 后台抓取服务
- Remote notifications 远程通知
这里介绍几个模式的用法。
播放音频
下面这段代码加入viewDidLoad中,程序开始时会按顺序播放两个mp3文件。在勾选Audio,AirPlay and Picture in Picture
后,挂起程序时,音乐还是会继续播放 。
引用
#import <AVFoundation/AVFoundation.h>
参数
@property (nonatomic, strong) AVQueuePlayer *player;
viewDidLoad
NSError *sessionError = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&sessionError];
NSArray *queue = @[
[AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"music" withExtension:@"mp3"]],
[AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"pop" withExtension:@"mp3"]]];
self.player = [[AVQueuePlayer alloc] initWithItems:queue];
self.player.actionAtItemEnd = AVPlayerActionAtItemEndAdvance;
[self.player play];
位置服务
参数
@property (nonatomic, strong) CLLocationManager *locationManager;
@property (nonatomic, strong) NSMutableArray *locations;
初始化LocationManager
self.locations = [[NSMutableArray alloc] init];
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.delegate = self;
启动位置更新服务
[self.locationManager startUpdatingLocation];
记录新位置
- (void)locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
// Add another annotation to the map.
if (UIApplication.sharedApplication.applicationState == UIApplicationStateActive)
{
//前台运行
else
{
//后台运行
NSLog(@"App is backgrounded. New location is %@", newLocation);
}
}
代码解析
根据 UIApplication.sharedApplication.applicationState == UIApplicationStateActive
可以判断回调过程中,程序是否挂起。记住要勾选Location updates
,当你在制作一个跑步或骑车软件时,需要用到这项功能。
一般性有限长度任务
这个宽泛的功能包括上传或者下载任务等。
@property (nonatomic) UIBackgroundTaskIdentifier backgroundTask;
self.backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
// NSLog(@"Background handler called. Not running background tasks anymore.");
[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
self.backgroundTask = UIBackgroundTaskInvalid;
}];
您也可以在任务完成的时候,主动调用[[UIApplication sharedApplication] endBackgroundTask:self.backgroundTask];
终止任务。
程序会在后台运行,但并不是无限时间。
网友评论