Swift - 后台获取数据(Background Fetch)的实现
2016-03-17 09:12
543 查看
原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_815.html
前面讲了如何让程序申请后台短时运行。但这个额外延长的时间毕竟有限。所以从iOS7起又引入两种在后台运行任务的方式:后台获取和后台通知。
1,后台获取介绍
后台获取(Background Fetch)是为了那些需要定期更新的应用程序设计的,比如天气应用,新闻客户端,社交网络应用程序等。在启动后台获取之后,应用程序可以在后台被唤醒,在后台获取最新信息,以便在用户将应用程序转到前台时能够立即显示这些信息。
2,后台获取功能开启
首先在选中项目,在Capabilities(功能)选项卡,启用Background Modes(后台模式)中的Background Fetch(后台获取)
3,后台获取时间间隔设置
(1)开启后台获取功能后,还需要在代码中使用setMinimumBackgroundFetchInterval()方法设置最短唤醒程序的时间间隔(秒)。但具体什么时候程序会被唤醒获取数据,就不可控了。这个由系统自己决定。
(2)如果想要告诉尽可能频繁调用,就直接设成UIApplicationBackgroundFetchIntervalMinimum。
4,使用样例
程序挂起后,自动从后台获取北京时间,获取后使用本地通知提醒用户。
(注意:后台获取执行后要调用completionHandler,告诉系统获取数据是否成功)
5,后台获取测试
(1)模拟器测试的话,只要选择Xcode 菜单栏的 Debug下的 Simulate Background Fetch即可
(2)真机调试,如果没有连着电脑有时候等了一天才发生后台获取。连着电脑可能等个几分钟就能获取。
前面讲了如何让程序申请后台短时运行。但这个额外延长的时间毕竟有限。所以从iOS7起又引入两种在后台运行任务的方式:后台获取和后台通知。
1,后台获取介绍
后台获取(Background Fetch)是为了那些需要定期更新的应用程序设计的,比如天气应用,新闻客户端,社交网络应用程序等。在启动后台获取之后,应用程序可以在后台被唤醒,在后台获取最新信息,以便在用户将应用程序转到前台时能够立即显示这些信息。
2,后台获取功能开启
首先在选中项目,在Capabilities(功能)选项卡,启用Background Modes(后台模式)中的Background Fetch(后台获取)
3,后台获取时间间隔设置
(1)开启后台获取功能后,还需要在代码中使用setMinimumBackgroundFetchInterval()方法设置最短唤醒程序的时间间隔(秒)。但具体什么时候程序会被唤醒获取数据,就不可控了。这个由系统自己决定。
(2)如果想要告诉尽可能频繁调用,就直接设成UIApplicationBackgroundFetchIntervalMinimum。
4,使用样例
程序挂起后,自动从后台获取北京时间,获取后使用本地通知提醒用户。
(注意:后台获取执行后要调用completionHandler,告诉系统获取数据是否成功)
import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { //开启通知 let settings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories: nil) application.registerUserNotificationSettings(settings) return true } func applicationWillResignActive(application: UIApplication) { } func applicationDidEnterBackground(application: UIApplication) { //虽然定义了后台获取的最短时间,但iOS会自行以它认定的最佳时间来唤醒程序,这个我们无法控制 //UIApplicationBackgroundFetchIntervalMinimum 尽可能频繁的调用我们的Fetch方法 application.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum) } func applicationWillEnterForeground(application: UIApplication) { } func applicationDidBecomeActive(application: UIApplication) { } func applicationWillTerminate(application: UIApplication) { } //后台获取数据 func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { //创建NSURL对象 let url:NSURL! = NSURL(string:"http://api.k780.com:88/?app=life.time&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json") //创建请求对象 let request:NSURLRequest = NSURLRequest(URL: url) let session = NSURLSession.sharedSession() let dataTask = session.dataTaskWithRequest(request, completionHandler: {(data, response, error) -> Void in if error != nil{ print(error?.code) print(error?.description) //让OS知道获取数据失败 completionHandler(UIBackgroundFetchResult.Failed) }else{ let str = NSString(data: data!, encoding: NSUTF8StringEncoding) print(str) //清除所有本地推送 //UIApplication.sharedApplication().cancelAllLocalNotifications() //创建UILocalNotification来进行本地消息通知 let localNotification = UILocalNotification() //推送时间(立刻推送) localNotification.fireDate = NSDate(timeIntervalSinceNow: 0) //时区 localNotification.timeZone = NSTimeZone.defaultTimeZone() //推送内容 localNotification.alertBody = "获取时间成功:\(str)" //声音 localNotification.soundName = UILocalNotificationDefaultSoundName UIApplication.sharedApplication().scheduleLocalNotification(localNotification) //让OS知道已经获取到新数据 completionHandler(UIBackgroundFetchResult.NewData) //completionHandler(UIBackgroundFetchResult.NoData) } }) as NSURLSessionTask //使用resume方法启动任务 dataTask.resume() } }
5,后台获取测试
(1)模拟器测试的话,只要选择Xcode 菜单栏的 Debug下的 Simulate Background Fetch即可
(2)真机调试,如果没有连着电脑有时候等了一天才发生后台获取。连着电脑可能等个几分钟就能获取。
相关文章推荐
- 我眼中的swift
- Swift中自定义Log
- 使用XcodeColors 来显示XCGLogger,进行swift 的logger定制
- Swift开发第六篇——操作运算符也可以重载& func 的参数修饰
- swift内存泄露,与OC的混合
- Swift2.x 中类的计算属性set方法不能访问自身值
- swift2.x不能使用函数重载的问题
- Swift 2.0 自定义cell和不同风格的cell
- Swift - 让程序挂起后,能在后台继续运行任务
- Swift - 委托(delegate)的介绍,及使用样例
- Swift - 闭包的介绍及用法
- IOS开发系列之Swift_UI_TextFIeld
- Swift - 产生不重复数字的随机数生成器
- Swift - 给图片添加文字水印(图片上写文字,并可设置位置和样式)
- Swift - 使用CGBlendMode改变UIImage颜色
- Swift - final关键字的介绍,以及使用场景
- Swift 学习之二十一:?和 !(详解)
- Swift - 实现单例模式
- Swift - 正则表达式的几种使用方式
- Swift - UISearchController初步学习