2

私は地域監視を備えたアプリを持っていますが、ユーザーが指定された地域に入ったときにGPSを使用するために「startUpdatingLocation」を呼び出します。

  - (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region {
   [manager startUpdatingLocation]; 
}



-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
locationManager =manager;

     CLLocation *location1 = locationManager.location;
     CLLocation *location2 = [[CLLocation alloc] initWithLatitude:obj.latitude longitude:obj.longitude];
    float betweenDistance=[location1 distanceFromLocation:location2];


    if((betweenDistance/1000)<=0.350000){
            // Fires an UIAlert
     }

}

ほとんどの場合、これは正常に機能します。たとえば、ユーザーが地域の外にいて「ホームボタン」を押し、地域に入った後に機能「didEnterRegion」を起動すると、GPS が数分間動作し始めて表示されます。アラート、それが正しい方法です。

ただし、アプリが開いているときにユーザーが地域に入ると、関数「didEnterRegion」が起動され、GPS が開始されますが、ユーザーがその瞬間に「ホームボタン」を押すと、GPS が停止し、アラートは表示されません。

ユーザーがホームボタンを押してから数分間だけ GPS を使用し、過剰なモードで使用したくないため、info.plist で「必要なバックグラウンド モード」のオプションを有効にしたくありません。

何か案は?

4

1 に答える 1

2

アプリケーション デリゲートがメッセージ applicationWillResignActive: を受け取ったら、次のようなリクエストを作成して、OS がアプリを実行し続けるようにリクエストできます。

UIBackgroundTaskIdentifier taskID = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
    // do you cleanup in here if your background task gets terminated by the system
}];

その後、イベント ループが実行され続け、通常どおりイベントを受け取り続けます (ただし、アプリのウィンドウが表示されないため、明らかにタッチ イベントやその他のウィンドウ関連のイベントは受け取りません)。

実行し続ける必要がなくなったら、次のようにリクエストをリリースできます

[[UIApplication sharedApplication] endBackgroundTask:taskID];

すべてを機能させるには、アプリのデリゲートにフラグを追加して、より多くの時間を必要とする作業を行っていることを知らせます。次に、デリゲートが applicationWillResignActive: メッセージを受け取ると、そのフラグを確認し、フラグが設定されている場合は、実行を継続するためにバックグラウンド時間を要求できます。

于 2013-02-04T03:03:36.583 に答える