我试图让我的应用程序在后台运行超过10分钟,根据这个和我的好在下面。 (我想使用长时间运行来跟踪位置,我的代码只是使用计数器进行测试) 任何人都可以帮助指出问题所在?
实施长时间运行的后台任务
对于需要执行更多执行时间的任务,您必须这样做 请求特定权限,以便在后台运行它们 他们被停职了。在iOS中,只允许使用特定的应用类型 在后台运行:
在后台播放用户可听内容的应用, 比如音乐播放器应用
随时向用户通知其位置的应用,例如 导航应用
支持互联网协议语音(VoIP)的应用
需要下载和处理新内容的报亭应用程序 从外部配件接收定期更新
实施这些服务的应用必须声明他们的服务 支持和使用系统框架来实现相关方面 那些服务。声明服务可以让系统知道哪个 您使用的服务,但在某些情况下,它是系统框架 实际上会阻止您的申请被暂停。
- (void)viewDidLoad {
[super viewDidLoad];
counterTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{
}];
count=0;
theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(countUp)
userInfo:nil
repeats:YES];
}
- (void)countUp {
{
count++;
NSString *currentCount;
currentCount=[[NSString alloc] initWithFormat:@"%ld",count];
theCount.text=currentCount;
[currentCount release];
}
}
另一个问题:我可以永远在后台运行iOS应用程序吗?
----编辑代码添加位置,仍然没有运行超过10分钟,对我做错了什么帮助?
- (void)viewDidLoad {
[super viewDidLoad];
count=0;
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
counterTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:^{
// If you're worried about exceeding 10 minutes, handle it here
[locationManager startUpdatingLocation];
}];
theTimer=[NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(countUp)
userInfo:nil
repeats:YES];
}
(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
NSLog(@"OldLocation %f %f", oldLocation.coordinate.latitude, oldLocation.coordinate.longitude); NSLog(@"NewLocation %f %f", newLocation.coordinate.latitude, newLocation.coordinate.longitude);
count++; NSString *currentCount;
currentCount=[[NSString alloc] initWithFormat:@"%ld",count];
theCount.text=currentCount; [currentCount release];
}
(void)countUp { [locationManager startUpdatingLocation];
{ count++; NSString *currentCount;
currentCount=[[NSString alloc] initWithFormat:@"%ld",count];
theCount.text=currentCount;
[currentCount release]; } }
答案 0 :(得分:4)
因此,您的应用使用了位置服务。那么请阅读Location Awareness Programming Guide。
您需要对Info.plist进行一些更改:
location-services
添加到UIRequiredDeviceCapabilities
gps
添加到UIRequiredDeviceCapabilities
location
添加到UIBackgroundModes
。然后,您的位置经理将提供超过10分钟限制的位置。 NSLocationUsageDescription
(也可以本地化)在后台获取位置事件
如果您的应用需要提供位置更新,无论该应用是否在 前景或背景,这样做有多种选择。该 首选选项是使用重要的位置更改服务 在适当的时间唤醒您的应用以处理新事件。但是,如果 您的应用需要使用标准位置服务,您可以声明 您的应用需要后台位置服务。
应用程序应仅在缺席时请求后台位置服务 这些服务会削弱其运作能力。此外, 任何请求后台位置服务的应用都应该使用它们 服务为用户提供切实的利益。例如,a 转弯导航应用程序可能是背景的候选人 位置服务,因为它需要跟踪用户的位置和 报告何时进行下一轮。
答案 1 :(得分:1)
有关详细信息,请参阅phix23的答案(和文档),但在此我想解释一下您可能会发生什么。
这些都是您引用的文档中的所有内容。
任何应用程序都可以在后台运行长达十分钟。这就是beginBackgroundTaskWithExpirationHandler:
方法的作用。无论你设置哪个标志和选项,都可以使用该方法。
对于需要跟踪位置的应用,您可以使用CLLocationManager
。只要您愿意,这不允许您的应用在后台运行。相反,它会在有趣的事情发生时通知您 - 这就是委托的用途。因此,您不能保证每隔十分钟就会调用countUp
方法,但当用户将手机移动一定距离时,可以让操作系统调用它。
答案 2 :(得分:1)
通过在applicationDidEnterBackground
方法中添加以下内容,它似乎可以永久执行:
[app beginBackgroundTaskWithExpirationHandler:^{}];
然后,您在willEnterForeground
。
我最近在iOS 6中取得了成功,但我不确定它是否会被批准用于商店。
答案 3 :(得分:0)
顺便说一下,在你的plist中你也可以设置Required background modes
然后在第0项App registers for location updates