最近在做一个后台监控流量的工具,需要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选中相应的项。
我主要用到了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权限提示的文本信息
如果不设置这两参数,是不会有权限提示,也不会后台得到更新的消息。
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