8

我的应用被 Apple 拒绝了 3 次,都带有相同的拒绝信,即:

我们发现您的应用使用后台模式,但不包含需要该模式持续运行的功能。此行为不符合 App Store 审核指南。

我们注意到您的应用在 Info.plist 的 UIBackgroundModes 键中声明支持位置,但不包括需要持久位置的功能。

在应用程序处于后台时添加需要位置更新的功能或从 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 会大大缩短电池寿命。出于这个原因,MY_APP_NAME 在后台运行,只是监听重要的位置变化。

我在这里有什么遗漏吗?

4

3 回答 3

7

这个问题很老,已经回答了,但是如果您使用APIUIBackgroundModes收集位置,则不需要密钥startMonitoringSignificantLocationChanges

于 2012-10-04T13:53:01.677 回答
4

在 locationManager:didUpdateToLocation:fromLocation: 或 updateMyLocationToServer: 您应该检查应用程序是否处于后台状态,例如。

[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;
}

这样应用程序应该完全执行此任务。

于 2012-07-03T07:45:13.887 回答
1

startMonitoringSignificantLocationChanges 不需要后台模式注册。只有连续的位置变化才能做到。

于 2014-06-19T11:18:09.077 回答