iOS后台模式教程 (一)

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]; 终止任务。
程序会在后台运行,但并不是无限时间。


代码与哲学
独立游戏开发者

独立游戏开发者

2.1k 声望
81 粉丝
0 条评论
推荐阅读
interface和setter,getter
ObjC的@interface设计,跟Java和C#真的很像,但又略有不同,相比之下Java和C#则像是一个模子刻出来的。ObjC的特点十分明显,首先是一般不用写@private和@public来区分私有变量,大部分ObjC开发者甚至都不知道还有...

秋刀生鱼片阅读 1.9k

网易云音乐开源全链路埋点方案-曙光埋点(dawn)
网易云音乐开源了曙光埋点 dawn,一个跨多端的全链路埋点解决方案,旨在构造一个完美的数据理想国。曙光埋点创造性的提出了埋点虚拟树(VTree),并在此基础上实现了诸多能力,解决大前端侧埋点困难、精度差、不...

云音乐技术团队3阅读 2.5k

封面图
深度剖析 Runtime
做很多需求或者是技术细节验证的时候会用到 Runtime 技术,用了挺久的了,本文就写一些场景和源码分析相关的文章。先问几个小问题:class_rw_t的结构是数组,数组里面的元素是数组,那它是二维数组吗?为什么16字...

杭城小刘4阅读 1.1k

封面图
Mac下编译WebRTC(Mac和iOS版本)
随着新冠疫情的影响,这两年音视频的需求呈爆发式增长。在音视频领域中,WebRTC可以说是一个绕不开宝库,包括了音视频采集、编解码、传输、渲染的全过程。本文主要记录下在Mac平台上编译WebRTC Mac和iOS版本的全...

吴尼玛阅读 3.8k

抢鲜解读:Flutter 3.7更新啦
新年伊始,由 Flutter 3.7 正式版来「打头阵」!我们与整个 Flutter 社区们继续在 Flutter 3.7 中优化了框架,包括创建自定义菜单栏和层叠式菜单、更好的国际化工具支持、新的调试工具以及其他功能和特性等。

慕课网阅读 2.5k

封面图
OpenTranslator:一款基于ChatGPT API的翻译神器
这是一款使用 ChatGPT API 进行划词翻译和文本润色的浏览器插件。借助了 ChatGPT 强大的翻译能力,它将帮助您更流畅地阅读外语和编辑外语。

听蝉阅读 2.5k

Flutter中如何取消任务
在开发过程中,取消需求是很常见的,但很容易被忽略。然而,取消需求的好处也很大。例如,在页面中会发送很多请求。如果页面被切走并处于不可见状态,就需要取消未完成的请求任务。如果未及时取消,则可能会导致...

听蝉阅读 2.4k

独立游戏开发者

2.1k 声望
81 粉丝
宣传栏