Geolocation 如何正确使用后台位置-应用程序被拒绝3次

Geolocation 如何正确使用后台位置-应用程序被拒绝3次,geolocation,app-store,appstore-approval,Geolocation,App Store,Appstore Approval,我的应用程序被苹果拒绝了三次,都带有相同的拒绝信,即: 我们发现你的应用程序使用后台模式,但不包括 需要该模式持续运行的功能。这 行为不符合应用商店审查指南 我们注意到您的应用程序在中声明了对位置的支持 UIBackgroundModes输入您的Info.plist,但不包括功能 这需要持久的位置 添加需要位置更新的功能是合适的 当应用程序处于后台时,或删除“位置”设置 从UIBackgroundModes键 如果选择添加使用位置背景模式的要素, 请将以下电池使用免责声明包含在您的 应用说明:

我的应用程序被苹果拒绝了三次,都带有相同的拒绝信,即:

我们发现你的应用程序使用后台模式,但不包括 需要该模式持续运行的功能。这 行为不符合应用商店审查指南

我们注意到您的应用程序在中声明了对位置的支持 UIBackgroundModes输入您的Info.plist,但不包括功能 这需要持久的位置

添加需要位置更新的功能是合适的 当应用程序处于后台时,或删除“位置”设置 从UIBackgroundModes键

如果选择添加使用位置背景模式的要素, 请将以下电池使用免责声明包含在您的 应用说明:

“继续使用在后台运行的GPS可以显著降低 减少电池寿命。”

有关背景模式的信息,请参阅本节 iOS参考库中的“在后台执行代码”

现在,据我所知,我正在后台运行并“做一些事情”。。。 在我的AppDelegate中,我在didFinishLaunchingWithOptions中有以下代码:

    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
键。后台模式不是指用户退出应用程序后仍在运行的模式吗?@TheppDeveloper感谢您告诉我。我对StackOverflow还不太熟悉,所以我不知道这个系统。@cgull I
m不确定。我的意思是,注册位置更新还不够好吗?然后,当有一个新位置时,我的应用程序被唤醒进入后台活动状态,然后我有机会做一些事情,比如将我的新位置记录到我的服务器上。这就是我所想的…听起来他们对你在后台访问GPS没有问题,但或多或少对你的访问频率有问题。尝试更改您的应用程序以减少位置检查的频率,或者添加他们建议的电池免责声明,看看他们是否批准。很高兴您在@niraj取得了进展(:我收到了如上所述的相同拒绝,但当我取出UIBackground模式时,我的startMonitoringSignificantLocationChanges从未被调用,我看到系统栏中的导航箭头消失了。有什么想法吗?我建议你提出一个新问题,包括你正在做的所有细节和一些代码示例。范围太广,无法回答500个字符的评论。如果你在这里发布你的问题链接作为评论,我会看一看。它应该对你有用。它对我有用。尝试在过期处理程序中结束BackgroundTask是没有意义的,它已经通过过期结束了。听@malhal的评论,风险自负!来自Apple docs:你应该使用这只手ler清理并标记后台任务的结束。如果无法明确结束任务,将导致应用程序终止。为什么您再次提供完全相同的答案(),请参考您的答案,不要只是直接抄袭。其他答案仍有评论。这不是一个真正的答案,它甚至不能回答问题-1