2

アプリがバックグラウンドに移行するとき、ユーザーの現在地の更新を取得し続ける必要があります。Apple のドキュメントで見つけたように、これは実装が許可されている長時間実行されるバックグラウンド タスクの 1 つです。また、場所の更新が通知されたときにサーバーに情報を送信するために、処理とネットワーク呼び出しを行う必要があります。私がやろうとしていることは、大まかに言えば、次のようなものです。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
   bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
      [application endBackgroundTask:bgTask];
      bgTask = UIBackgroundTaskInvalid;
   }];

   // Background task        
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      NSLog(@"Background time remaining: %f seconds (%d mins)",
     [[UIApplication sharedApplication] backgroundTimeRemaining], 
     (int)([[UIApplication sharedApplication] backgroundTimeRemaining] / 60));

      // Need to get data from database here

      // Finished
      if (bgTask != UIBackgroundTaskInvalid) {
         [application endBackgroundTask:bgTask];
         bgTask = UIBackgroundTaskInvalid;
      }

   });

   // Start location manager
   locationManager = [[CLLocationManager alloc] init];
   if ([CLLocationManager locationServicesEnabled]) {          
      locationManager.delegate = self;
      locationManager.distanceFilter = 20;
      locationManager.desiredAccuracy = kCLLocationAccuracyBest;
      [locationManager startUpdatingLocation];
   }
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
   bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
      [[UIApplication sharedApplication] endBackgroundTask:bgTask];
      bgTask = UIBackgroundTaskInvalid;
   }];

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

      // Want to perform some data processing here, including concurrent tasks 
      // and several network calls to get and send data to server

      [self locationProcessingCompleted];

   });
}

- (void)locationProcessingCompleted
{
   // Check results. If needed, some more data processing and several network 
   // calls to send data to server

   // Close background task
   if (bgTask != UIBackgroundTaskInvalid) {
      [[UIApplication sharedApplication] endBackgroundTask:bgTask];
      bgTask = UIBackgroundTaskInvalid;
   }
}

位置情報サービスに関する長期実行バックグラウンド タスクのコード例が見つかりません。それについていくつか質問があります。

a)dispatch_asyncキュー内のすべてのバックグラウンド コードを実行する必要がありますか? つまり、ロケーション マネージャーの設定を含め、すべてのコードがapplicationDidEnterBackground:非同期で実行されるのでしょうか。

b)[[UIApplication sharedApplication] backgroundTimeRemaining]非常に長い値を返しています。今回は10分くらいじゃないの?

didUpdateToLocation:c) やりたいこと: 最初の有限長のタスクを実行し、位置の更新を開始し、トリガーされるたびに他の有限長のタスクを実行します。inのlocation値を設定しました。私のアプローチは正しいですか?場所を無期限に更新し続け、更新を受信するたびに 10 分未満の限られた長さのタスクを実行できますか?UIBackgroundModesInfo.plist

この問題について助けが必要です。前もって感謝します

4

3 に答える 3

2

あなたがしなければならないのは、「必要なバックグラウンドモード」の下に「位置情報の更新のためのアプリ登録」を追加することだけです.plistファイルをテキストエディターで編集して次のコードを追加するか、xcodeを使用して必要なバックグラウンドモードを追加することができます.

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

didUpdateToLocation メソッドが呼び出されます (アプリがバックグラウンドにある場合でも)。このメソッド呼び出しに基づいて何でも実行できます...

Xcode のスナップショット

Xcode のスナップショット

于 2013-03-05T12:37:15.477 に答える
0

免責事項: 私は Cintric で働いています

また、バックグラウンドで (アプリが強制終了された後でも) ユーザーの位置を正確に追跡できるようにしたいと考えていました。特にバッテリーの消耗に焦点を当てて、問題の解決に長い時間を費やしました.

どのように解決したかについて、素晴らしいブログ投稿を投稿しました。http://www.blog.cintric.com/?p=121また、ドラッグ アンド ドロップ SDK ソリューションを無料で提供しています。1 行のコードで、バックグラウンドで常に位置を追跡し、バッテリーを 1% しか使用しないようにすることができます。さらに、クラスをデリゲートに設定して、サーバーに情報を送信できるようにすることができます (バックグラウンド タスク API を使用せずにバックグラウンドを含む)。

.framework ファイルをダウンロードしてプロジェクトにドラッグし、1 行のコードで初期化できます。 [CintricFind initWithApiKey:@"YOUR_API_KEY_HERE" andSecret:@"YOUR_SECRET_HERE"];

APIキーは無料で取得できます。ここにすべてを説明するドキュメントがあります: https://www.cintric.com/docs/ios

于 2014-10-27T00:21:11.913 に答える
0

提供されたコードに従って、applicationDidEnterBackground に LocationManager を割り当てているため、didFinishLaunchingWithOptions メソッドで LocationManager を割り当ててから、applicationDidEnterBackground メソッドで startUpdatingLocation メソッドを呼び出すことをお勧めします。

applicationWillEnterForeground メソッドで stopUpdatingLocation を呼び出す必要がある場合もあります (アプリがフォアグラウンドにあるときに位置情報の更新を受信する必要がない場合)。

ヒント: 最高の精度で GPS を長時間有効にしないでください。バッテリーがすぐに消耗します (私の経験では、3 ~ 4 時間以内)。

于 2013-03-05T12:58:56.753 に答える