3

iOS 5 用の位置情報ベースのアプリケーションを作成しています。アプリケーションは、CLLocationManager位置情報の更新を受信するために を使用しています。

アプリケーションが開始されると、LocationManager が作成され、呼び出し[self.locationManager startUpdatingLocation];が行われ、灰色の場所の矢印がステータスバーに表示されます。

アプリケーションがバックグラウンドに入るとき、私は呼び出しています

[self.locationManager stopUpdatingLocation]; 
[self.locationManager startMonitoringSignificantLocationChanges];

アプリがバックグラウンドにある間に重要な場所の変更を受け取りたいだけです。灰色の位置矢印は引き続き表示されます。

また、呼び出しているアプリケーションに終了ボタンがあります

[self.locationManager stopUpdatingLocation];
exit(0);

ユーザーが Exit-Button を押すと、アプリケーションが終了し、灰色の場所ボタンがステータスバーから消えます。今まですべて順調です。

ユーザーが Fast App Switcher を使用してアプリケーションを終了すると、アプリケーションが実行されていないにもかかわらず、ステータス バーに灰色の場所の矢印が表示されたままになるため、問題が発生します。ユーザーが iPhone からアプリケーションを削除すると、灰色の場所の矢印が最初に消えます。

質問は次のとおりです。

  • ユーザーが Fast App Switcher を使用してアプリケーションを終了し、灰色の矢印がまだステータス バーに表示されている場合、これは位置情報の更新がまだ実行されていることを意味しますか?それとも、アプリケーションが過去 24 時間以内に位置情報サービスを使用したことを意味しますか? 答えは最初のものだと思います。場所の更新はまだ実行されています!

  • アプリケーションはバックグラウンドで実行する必要があるため、アプリケーションがバックグラウンドに入ったときに LocationManager を停止できません。applicationWillTerminate:ユーザーが Fast App Switcher を使用してアプリケーションを強制終了しても呼び出されません。アプリケーションが Fast App Switcher を使用して終了されたとき、または OS によって終了されたときに、イベントを受け取る方法はありますか????

  • Fast App Switcher を使用してアプリケーションを強制終了すると、ステータス バーの灰色の矢印が消える他のアプリケーションを見たことがあります。これらのアプリケーションはどのようにこれを達成しますか???

4

2 に答える 2

3
  1. アプリがフォアグラウンドにない場合は、重要な場所の更新を利用できます。
  2. 私はこのようなことをしたと思いますが、あなたの場合はどうなるかわかりません。
    バックグラウンド タスク用にアプリを登録し、その場合にテスト目的で何かを行うだけで、アプリの高速切り替えを介してアプリを強制終了すると、デリゲート メソッドapplicationWillTerminate:が常に呼び出されます。


_ _ _ _ _ _ _ _編集済み_ _ _ _ _ _ _ _ _この変数をAppDelegate.h
に追加するだけです

UIBackgroundTaskIdentifier bgTask;

このようなデリゲートメソッドを作成し、アプリを強制終了します

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        UIApplication *app = [UIApplication sharedApplication];
        if ([app respondsToSelector:@selector(beginBackgroundTaskWithExpirationHandler:)]) {
            bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
                // Synchronize the cleanup call on the main thread in case
                // the task actually finishes at around the same time.
                dispatch_async(dispatch_get_main_queue(), ^{
                    if (bgTask != UIBackgroundTaskInvalid)
                    {
                        [app endBackgroundTask:bgTask];
                        bgTask = UIBackgroundTaskInvalid;
                    }
                });
            }];
        }
    }

- (void)applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"is terminated");
}


_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

于 2012-01-31T09:43:14.937 に答える
3

「設定 - >一般 - >リセット - >場所の警告をリセット」で「場所の警告」を復元してみてください。「startupdatinglocation」を使用するとうまくいきました。

于 2012-06-10T08:54:11.270 に答える