8

私のアプリはAppleによって3回拒否されましたが、すべて同じ拒否の手紙があります。

アプリはバックグラウンドモードを使用していますが、そのモードを永続的に実行する必要がある機能が含まれていないことがわかりました。この動作は、AppStoreレビューガイドラインに準拠していません。

アプリが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 に答える