Swift - 后台获取数据(Background Fetch)的实现

前面讲了如何让程序申请后台短时运行。但这个额外延长的时间毕竟有限。所以从iOS7起又引入两种在后台运行任务的方式:后台获取和后台通知。

1,后台获取介绍

后台获取(Background Fetch)是为了那些需要定期更新的应用程序设计的,比如天气应用,新闻客户端,社交网络应用程序等。在启动后台获取之后,应用程序可以在后台被唤醒,在后台获取最新信息,以便在用户将应用程序转到前台时能够立即显示这些信息。

2,后台获取功能开启

首先在选中项目,在Capabilities(功能)选项卡,启用Background Modes(后台模式)中的Background Fetch(后台获取)

3,后台获取时间间隔设置

(1)开启后台获取功能后,还需要在代码中使用setMinimumBackgroundFetchInterval()方法设置最短唤醒程序的时间间隔(秒)。但具体什么时候程序会被唤醒获取数据,就不可控了。这个由系统自己决定。

(2)如果想要告诉尽可能频繁调用,就直接设成UIApplicationBackgroundFetchIntervalMinimum。

4,使用样例

程序挂起后,自动从后台获取北京时间,获取后使用本地通知提醒用户。

(注意:后台获取执行后要调用completionHandler,告诉系统获取数据是否成功)

  


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

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)真机调试,如果没有连着电脑有时候等了一天才发生后台获取。连着电脑可能等个几分钟就能获取。

http://www.hangge.com/blog/cache/detail_815.html

时间: 2024-10-07 05:06:47

Swift - 后台获取数据(Background Fetch)的实现的相关文章

ajax从asp后台获取数据

1.前台 $.ajax({ //url: "demo/data/taskTree.txt", url: "GanttChart.aspx?taskList=1" , cache: false, success: function (text) { var data = mini.decode(text); gantt.loadTasks(data); gantt.unmask(); //折叠全部 //gantt.collapseAll(); } }); 2.后台 ?

jsTree通过AJAX从后台获取数据

页面代码: <div id="MenuTree"></div> javascript代码: $(document).ready(function ($) { InitMenuTree(); }); function InitMenuTree() { $('#MenuTree').data('jstree', false); $.getJSON('@Url.Action("GetMenuTree", "AdminMenu")

在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效??

在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效?? 是因为swiper提前初始化了,那时候数据还没有完全出来.这里有两种解决办法 1. 使用vue提供的$nextTick()方法 当Vue构造器里的data值被修改完成后会调用这个方法,也相当于一个钩子函数吧,和构造器里的updated生命周期很像. 在数据初始化完毕之后,再初始化swiper就不会出现问题了 this.$nextTick(function () { var swiper = new Swiper(

下拉插件 (带搜索) Bootstrap-select 从后台获取数据填充到select的 option中 用法详解

今天收到了客户的需求,要求在新增停车场ID的时候要从数据库查出来对应的停车场名称然后显示在界面上.保存的时候按照停车场ID进行保存. 自己首先把后台的部分写完了,测试了接口数据.成功的拿到了ajax数据. 接下来,自己用了select下拉标签和js函数进行填充后台传过来的数据. 经过自己的不断百度和参考别人的博客,试了很多次终于成功的调试出了想要的结果. 特来博客记录一下,也分享一下开心的心情. (一)首先引入样式和JS文件 样式文件和JS下载放到本地最好,因为放到本地自己可以修改一些东西. 在

vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据

在vue项目中组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的话,有必要考虑引入vuex来管理这些凌乱的状态,今天这边博文用来记录这一整个的过程,后台api接口是使用webpack-server模拟的接口,这个前面的文章中有提到,需要的可以去翻阅. 整个的流程是在组件的created中提交dispatch,然后通过action调用一个封装好的axios然后再触发mutation来提交状态改变state中的数据,然后在组件的计算属性中获取state的数据并渲染在页面上 首先新需要在项

aceAdmin fuelux tree 从后台获取数据,并设置节点ID等属性

如题,从后台封装数据,有两种方式渲染节点的数据: 1.全部节点加载 2.根据父节点加载子节点 首先,先介绍下第一种渲染方式: 后台返回数据格式(所有的附加属性,都可放在additionalParameters下): 前端页面html: <div class="widget-body"> <div class="widget-main padding-8"> <div id="treeview" class="

后台获取数据实现实时折线图

折线图用的是echarts的折线图.框架用的ssm,连接oracle数据库,将数据实时显示在折线图上. <div id="main" style="width: 95%; height: 60%; margin: auto;"></div> <script> function showEcharts() { require( [ 'echarts', 'echarts/chart/line' ], function(ec) { /

从后台获取数据导出excel文件

做oa系统的都会有这个要求:根据数据导入excel文件.只需要点击一下,你所需要的数据就直接生成一个excel文件了,是不是很方便? 是的没错,很方便,但是对于我们来说是一件很痛苦的事情,所以说一下我的经历.因为是第一次写excel文件导出,所以代码可能写的很烂,不喜勿喷. 有什么意见也可以直接留言哦,希望与大家一起交流 第一步,先在pom.xml文件依赖jar包: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> &

160422、Highcharts后台获取数据

而我这次做的是趋势图,涉及到动态刷新,做的过程还是花了一番功夫的,也补充和巩固了一点js的知识,为了纪念,把过程记录一下: 首先,是引入HIghcharts绘图相关的js文件和jQuery.js. 接下来,把HIghcharts动态刷新的格式拷贝并作修改: $(function(){ $(document).ready(function() { Highcharts.setOptions({ global: { useUTC: false//是否使用世界标准时间 } }); var chart;