博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转]iOS7 后台执行
阅读量:6339 次
发布时间:2019-06-22

本文共 3231 字,大约阅读时间需要 10 分钟。

[转自:]

iOS7程序后台运行

介绍

这次iOS7对程序后台运行进行了加强,但是仅仅是加强而已,要想像Android程序那样自由当然就别想了,苹果这么做主要还是出于电池使用时间考虑,但是这次的加强对大部分程序基本够用。

在介绍之前, 我们先回顾一下在iOS7之前的后台运行相关的知识。在iOS7之前(iOS4之后)主要有三类的应用程序能够后台运行:

  1. 音频播放
  2. 后台定位服务
  3. IP电话

除了这三种应用,其他程序只能是在进入后台之前向系统请求一个额外的运行时间(最长为10分钟),并在该时间内来进行后台运行操作,如保存用户信息,上传或下载数据,进行视频编码等操作。

- (void)applicationDidEnterBackground:(UIApplication *)application { static UIBackgroundTaskIdentifier task; task = [application beginBackgroundTaskWithExpirationHandler:^{ task = UIBackgroundTaskInvalid; }; //执行后台操作 [application endBackgroundTask:task]; }

这次iOS7支持了两种新的程序后台运行模式:

  • 需要定期请求数据的程序可以在系统中注册,这样程序就可以在后台被定期唤醒来下载新的数据。这种情况需要在程序的Info.plist文件中UIBackgroundModes项增加fetch类型,同时通过setMinimumBackgroundFetchInterval:方法来设置程序定期获取数据的最小时间间隔。你需要实现application: performFetchWithCompletionHandler: 代理方法并在该方法内执行下载操作。

  • 程序还可以通过后台消息推送服务来通知用户有新的内需可以下载,同时激活后台下载操作。这种需要在UIBackgroundModes项中增加remote-notification值,同时你需要实现AppDelegate方法 application:didReceiveRemoteNotification:fetchCompletionHandler:来执行你的下载操作。

不管是支持fetch或remote-notification后台运行模式的程序,都有可能被系统在合适的时候启动或从后台挂起状态移除调。在fetch模式下,系统会利用有效的信息来决定启动或激活程序的最佳时期。例如:系统可能会在网络状况良好或者设备刚解锁的时候让程序执行fetch操作。支持remote-notifiaction的程序,可以在接收到推送消息的时候被唤醒,但在用户接收到推送消息之前,程序可以通过定期获取的形式下载最新内容,并在随后的推送消息之前就已经准备好将内容展现给用户。

为了执行后台下载操作,程序应该使用新增的NSURLSession类,该类在之前的NSURLConnectoin的基础上提供了更简洁、基于任务的接口来启动并执行NSURLRequest对象。一个NSURLSession对象可以启动多个下载或上传任务,并在代理方法里面来处理来自服务器的认证请求。

实现

现在我们来实现fetch和remote-notifiaction两种后台运行。

1. 设置

在Xcode5.0里面Capabilities下可以直接通过勾选的方式选择应用需要支持的后台运行的类型(可多选哦),我们选中Background fetch和Remote notification两项。并在程序的Info.plist文件中的Required background modes中添加fetch和remote-notification两项。

Multitasking Setting

2. Background Fetch

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. [application setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; return YES; } - (void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ NSURL *url = [NSURL URLWithString:@"http://127.0.0.1:3000/update.do"]; NSURLSession *updateSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; [updateSession dataTaskWithHTTPGetRequest:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSDictionary *messageInfo = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; NSLog(@"messageInfo:%@",messageInfo); completionHandler(UIBackgroundFetchResultNewData); }]; }

首先在application:didFinishLaunchingWithOptions:中设置minimun background fetch interval类型为UIApplicationBackgroundFetchIntervalMinimum(默认为UIApplicationBackgroundFetchIntervalNever),然后实现代理方法application:performFetchWithCompletionHandler:中实现数据请求。

为了测试程序后台运行,我们可以新建一个Scheme,选中Background Fetch(Launch due to a background fetch event),然后在该Scheme下运行程序,程序并不会启动,但是你能看到它给后台发了请求。

New Scheme

Remote Notifications

类似要实现remote-notification模式,需要在原来支持push的条件下实现application:didReceiveRemoteNotification:fetchCompletionHandler:代理方法,程序在后台收到payload中包含"content-available = 1"的推送消息时,会执行该代理方法。(因为模拟器无法模拟消息推送,iPad版本的iOS7还没提供下载,所以我暂时没法亲测)。

总结

总的来说实现上没有什么太复杂的东西,关键是你怎么样将这两种新的后台运行模式应用到你的程序中。

转载于:https://www.cnblogs.com/jz319/p/4099540.html

你可能感兴趣的文章
Tomcat 配置
查看>>
挺有意思的,队列,先进先出,排队进行!
查看>>
pom-4.0.0.xml中心仓库
查看>>
C# 视频监控系列(8):服务器端——预览和可被客户端连接
查看>>
PostgreSQL在何处处理 sql查询之三十四
查看>>
怎么设计一个好的数据库
查看>>
Oracle中 存储过程 语句介绍
查看>>
[LeetCode] Trips and Users 旅行和用户
查看>>
写自己的CSS框架 Part2:跨越浏览器的reset
查看>>
pycharm开发python 在python Console中输出的程序有乱码,含有中文的输出
查看>>
EasyUI Pagination 分页的两种做法
查看>>
java中有类似C#里ref或out的功能吗?
查看>>
利用 Visual C# .NET 使 Word 自动新建文档
查看>>
Asp.net中利用ExecuteNonQuery()执行存储过程返回-1解决方案
查看>>
SproutCore:将MVC引入JavaScript
查看>>
[LintCode] 拓扑排序
查看>>
C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
查看>>
1.5. RALDRS
查看>>
foreach用法
查看>>
C#开发微信门户及应用(27)-公众号模板消息管理
查看>>