iOS学习之APP后台运行

最近在做一个后台监控流量的工具,需要APP进入后台后,仍然可以执行代码进行统计,但是iOS不像Android那样有后台服务,进入后台后,一定时间后就会被挂起。网上查了一些资料,在这里整理记录下。
苹果提供了一下几种方式:
1.Audio and AirPlay
2.Location updates
3.Voice over IP
4.Newsstand downloads
5.External accessory communication
6.Uses Bluetooth LE accessories
7.Background fetch
8.Remote notifications

要使用它需要在Capabilities的Background Modes选中相应的项。

iOS学习之APP后台运行_第1张图片
Paste_Image.png

我主要用到了2和7.
Location updates应用退到后台后,还可以得到系统定位更新,从而执行一些代码。
1.导入CoreLocation.framework,然后引用头文件
2.开始定位

-(void)startLocation{
    _locationManager = [[CLLocationManager alloc] init];
    // 定位服务是否打开
    if ([CLLocationManager locationServicesEnabled]) {
        NSLog(@"开始执行定位服务");
        _locationManager.desiredAccuracy = kCLLocationAccuracyBest;
        _locationManager.distanceFilter = 5;
        _locationManager.delegate = self;
        // 权限申请
        if (IS_OS_8_OR_LATER) {
            //[_locationManager requestWhenInUseAuthorization];
            [_locationManager requestAlwaysAuthorization];
        }
        
        [_locationManager startUpdatingLocation];
    }
}

3.在Info.plist文件中添加如下配置:
(1)NSLocationAlwaysUsageDescription
requestAlwaysAuthorization权限提示的文本信息
(2)NSLocationWhenInUseUsageDescription
requestWhenInUseAuthorization权限提示的文本信息
如果不设置这两参数,是不会有权限提示,也不会后台得到更新的消息。

iOS学习之APP后台运行_第2张图片
Paste_Image.png

iOS学习之APP后台运行_第3张图片
Paste_Image.png

4.设置实现代理CLLocationManagerDelegate

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    NSLog(@"定位更新 统计流量");
    [self startOneFlowStatistic];
}

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    NSLog(@"定位失败: %@", error);
}

Background fetch是iOS7新增的,在后台iOS在间隔时间内后台启动该应用。
1.设置间隔时间执行

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[UIApplication sharedApplication] setMinimumBackgroundFetchInterval:UIApplicationBackgroundFetchIntervalMinimum];
...
}

2.实现回调方法

-(void)application:(UIApplication *)application performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
    NSLog(@"performFetchWithCompletionHandler");
    [[FlowMonitorService shareFlowMonitorService] startOneFlowStatistic];
    completionHandler(UIBackgroundFetchResultNewData);
}

参考地址:
iOS后台运行实现总结 http://www.jianshu.com/p/d3e279de2e32
iOS开发:后台运行以及保持程序在后台长时间运行 http://www.jianshu.com/p/174fd2673897
iOS开发拓展篇—CoreLocation定位服务http://www.cnblogs.com/wendingding/p/3901230.html
iOS 7 SDK: 如何使用后台获取(Background Fetch) http://www.cocoachina.com/industry/20131114/7350.html

你可能感兴趣的:(iOS学习之APP后台运行)