Geolocation 如何正确使用后台位置-应用程序被拒绝3次
我的应用程序被苹果拒绝了三次,都带有相同的拒绝信,即: 我们发现你的应用程序使用后台模式,但不包括 需要该模式持续运行的功能。这 行为不符合应用商店审查指南 我们注意到您的应用程序在中声明了对位置的支持 UIBackgroundModes输入您的Info.plist,但不包括功能 这需要持久的位置 添加需要位置更新的功能是合适的 当应用程序处于后台时,或删除“位置”设置 从UIBackgroundModes键 如果选择添加使用位置背景模式的要素, 请将以下电池使用免责声明包含在您的 应用说明: “继续使用在后台运行的GPS可以显著降低 减少电池寿命。” 有关背景模式的信息,请参阅本节 iOS参考库中的“在后台执行代码” 现在,据我所知,我正在后台运行并“做一些事情”。。。 在我的AppDelegate中,我在didFinishLaunchingWithOptions中有以下代码:Geolocation 如何正确使用后台位置-应用程序被拒绝3次,geolocation,app-store,appstore-approval,Geolocation,App Store,Appstore Approval,我的应用程序被苹果拒绝了三次,都带有相同的拒绝信,即: 我们发现你的应用程序使用后台模式,但不包括 需要该模式持续运行的功能。这 行为不符合应用商店审查指南 我们注意到您的应用程序在中声明了对位置的支持 UIBackgroundModes输入您的Info.plist,但不包括功能 这需要持久的位置 添加需要位置更新的功能是合适的 当应用程序处于后台时,或删除“位置”设置 从UIBackgroundModes键 如果选择添加使用位置背景模式的要素, 请将以下电池使用免责声明包含在您的 应用说明:
if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsLocationKey] &&
([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]))
{
id locationInBackground = [launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey];
if ([locationInBackground isKindOfClass:[CLLocation class]])
{
[self updateMyLocationToServer:locationInBackground];
}
else
{
//Keep updating location if significant changes
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
self.bgLocationManager = locationManager;
self.bgLocationManager.delegate = self;
self.bgLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
[bgLocationManager startMonitoringSignificantLocationChanges];
}
}
AppDelegate还启动一个位置管理器并使自己成为代理。
然后,我有以下用于在后台处理位置更新的代码:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
[self updateMyLocationToServer:newLocation];
}
-(void)updateMyLocationToServer:(CLLocation*)myNewLocation
{
// NSLog(@"Updating Location from the background");
NSString *fbID = [NSString stringWithString:[facebookDetails objectForKey:@"fbID"]];
NSString *firstName = [NSString stringWithString:[facebookDetails objectForKey:@"firstName"]];
NSString *lastName = [NSString stringWithString:[facebookDetails objectForKey:@"lastName"]];
NSString *urlString = [NSString stringWithFormat:@"MY_SERVER_API", fbID, myNewLocation.coordinate.latitude, myNewLocation.coordinate.longitude, firstName, lastName];
NSURL *url = [NSURL URLWithString:urlString];
__block ASIHTTPRequest *newRequest = [ASIHTTPRequest requestWithURL:url];
[newRequest setCompletionBlock:^{
}];
[newRequest setFailedBlock:^{
}];
// [newRequest setDelegate:self];
[newRequest startAsynchronous];
}
我还在我的应用程序描述页面中添加了免责声明:
在后台大量使用GPS会显著缩短电池寿命。出于这个原因,我的应用程序名称在后台运行,只是监听重要的位置更改
这里有什么我遗漏的吗?在locationManager:didUpdateToLocation:fromLocation:或UpdateMyLocationServer:中,您应该通过例如检查应用程序是否处于后台状态
[UIApplication sharedApplication].applicationState == UIApplicationStateBackground
然后,如果你的应用程序处于后台模式,你应该使用例如
backgroundTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:
^{
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
}];
/*Write Your internet request code here*/
if (bgTask != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:backgroundTask];
bgTask = UIBackgroundTaskInvalid;
}
这样应用程序就可以完全执行此任务。这个问题很老,已经回答了,但是如果您使用
startMonitoringSignificantLocationChanges
API来收集位置,则不需要UIBackgroundModes
键。m不确定。我的意思是,注册位置更新还不够好吗?然后,当有一个新位置时,我的应用程序被唤醒进入后台活动状态,然后我有机会做一些事情,比如将我的新位置记录到我的服务器上。这就是我所想的…听起来他们对你在后台访问GPS没有问题,但或多或少对你的访问频率有问题。尝试更改您的应用程序以减少位置检查的频率,或者添加他们建议的电池免责声明,看看他们是否批准。很高兴您在@niraj取得了进展(:我收到了如上所述的相同拒绝,但当我取出UIBackground模式时,我的startMonitoringSignificantLocationChanges从未被调用,我看到系统栏中的导航箭头消失了。有什么想法吗?我建议你提出一个新问题,包括你正在做的所有细节和一些代码示例。范围太广,无法回答500个字符的评论。如果你在这里发布你的问题链接作为评论,我会看一看。它应该对你有用。它对我有用。尝试在过期处理程序中结束BackgroundTask是没有意义的,它已经通过过期结束了。听@malhal的评论,风险自负!来自Apple docs:你应该使用这只手ler清理并标记后台任务的结束。如果无法明确结束任务,将导致应用程序终止。为什么您再次提供完全相同的答案(),请参考您的答案,不要只是直接抄袭。其他答案仍有评论。这不是一个真正的答案,它甚至不能回答问题-1