アプリケーションが強制終了されたときに正確な位置更新を取得するにはどうすればよいですか?

Mehul Solanki

私は、ユーザーが多数の場所を保存できる場所ベースのアプリケーションを開発しています。ユーザーがその保存された場所の近くを通過すると、アプリケーションはローカル通知によってユーザーに通知します。

この機能を実現するために、次のコードを使用しました。


-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusDenied){

         [self showAlertWithTitle:@"" andMessage:@"The app doesn't work without the Background App Refresh enabled. To turn it on, go to Settings > General > Background App Refresh."];
  }else if([[UIApplication sharedApplication] backgroundRefreshStatus] == UIBackgroundRefreshStatusRestricted){

    [self showAlertWithTitle:@"" andMessage:@"The functions of this app are limited because the Background App Refresh is disable."];
  } else {
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey]) {

        // This "afterResume" flag is just to show that he receiving location updates
        self.shareModel.afterResume = YES;

        self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
        self.shareModel.anotherLocationManager.delegate = self;
        self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; //kCLLocationAccuracyBestForNavigation
        self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
        [self.shareModel.anotherLocationManager startUpdatingLocation];
                 self.shareModel.anotherLocationManager.pausesLocationUpdatesAutomatically = YES;


        if(IS_OS_8_OR_LATER) {
            if ([self.shareModel.anotherLocationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
                [self.shareModel.anotherLocationManager requestWhenInUseAuthorization];
            }
            [self.shareModel.anotherLocationManager requestAlwaysAuthorization];
        }

        [self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
    }
  }
}

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

CLLocation *currentLocation = [locations lastObject];

latitudeTemp = currentLocation.coordinate.latitude;
longitudeTemp = currentLocation.coordinate.longitude;

[self locationChangeLogic];    

//If the timer still valid, return it (Will not run the code below)
if (self.shareModel.timer)
    return;

self.shareModel.bgTask = [BackgroundTaskManager sharedBackgroundTaskManager];
[self.shareModel.bgTask beginNewBackgroundTask];

//Restart the locationMaanger after 30 Seconds
self.shareModel.timer = [NSTimer scheduledTimerWithTimeInterval:30
                                                         target:self
                                                       selector:@selector (restartLocationUpdates)
                                                       userInfo:nil
                                                        repeats:YES];

//Will only stop the locationManager after 10 seconds, so that we can get some accurate locations
//The location manager will only operate for 10 seconds to save battery
NSTimer * delay10Seconds;
delay10Seconds = [NSTimer scheduledTimerWithTimeInterval:10
                                                  target:self
                                                selector:@selector(stopLocationDelayBy10Seconds)
                                                userInfo:nil
                                                 repeats:YES];
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
      [self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.


//Remove the "afterResume" Flag after the app is active again.
self.shareModel.afterResume = NO;

if(self.shareModel.anotherLocationManager)
    [self.shareModel.anotherLocationManager stopMonitoringSignificantLocationChanges];

self.shareModel.anotherLocationManager = [[CLLocationManager alloc]init];
self.shareModel.anotherLocationManager.delegate = self;
self.shareModel.anotherLocationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; //kCLLocationAccuracyBestForNavigation;
self.shareModel.anotherLocationManager.activityType = CLActivityTypeOtherNavigation;
[self.shareModel.anotherLocationManager startUpdatingLocation];

if(IS_OS_8_OR_LATER) {
    if ([self.shareModel.anotherLocationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
        [self.shareModel.anotherLocationManager requestWhenInUseAuthorization];
    }
    [self.shareModel.anotherLocationManager requestAlwaysAuthorization];
}
[self.shareModel.anotherLocationManager startMonitoringSignificantLocationChanges];
}

上記のコードを使用することで、ユーザーがアプリケーションを強制終了した場合でも場所を取得できますが、正確ではありません。時々私は場所を取得しませんでした、そして時々私はその保存された場所を通過した後に場所を取得します。ユーザーがその特定の半径を入力したときに、正確に位置通知を表示する必要があります。

この問題を解決するために私を助けてください。

前もって感謝します。

Mehul Solanki

リージョンモニタリング(ジオフェンシング)は私の要件を満たしています。

詳細については、次のリンクをいくつか使用できます。

  1. https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/LocationAwarenessPG/RegionMonitoring/RegionMonitoring.html

  2. http://www.rapidvaluesolutions.com/tech_blog/geofencing-using-core-location-for-regional-monitoring-in-ios-applications/

皆さんありがとう..

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

アプリケーションが強制終了されたときに正確な位置更新を取得するにはどうすればよいですか?

分類Dev

ログオフ後に強制終了することなくアプリケーションを起動するにはどうすればよいですか?

分類Dev

Androidアプリケーションで正確な信号強度を取得するにはどうすればよいですか?

分類Dev

(3D touch)ユーザーがアプリケーションを強制終了したときにアプリケーションで特定のページを開くにはどうすればよいですか?

分類Dev

アプリケーションが強制終了された後にギャラリーから画像を取得するにはどうすればよいですか?

分類Dev

アプリケーションが終了したときにdbusモニタースクリプトを強制終了するにはどうすればよいですか?

分類Dev

Oreoでアプリが強制終了されたときに進行中の通知をキャンセルするにはどうすればよいですか?

分類Dev

アプリケーションが正しく構成されていることを確認するにはどうすればよいですか?

分類Dev

アプリがユーザーによって強制終了されたときに位置情報の更新を再開するにはどうすればよいですか?

分類Dev

「ACCEPTED」状態にあるすべてのヤーンアプリケーションを強制終了するにはどうすればよいですか。

分類Dev

ユーザーがアプリケーションを終了したときにMPMusicPlayerControllerの再生を停止するにはどうすればよいですか?

分類Dev

更新を強制せずにPERFORCEJavaアプリケーションを同期させるにはどうすればよいですか?

分類Dev

Android Oreo以降でアプリケーションが強制終了された場合でも、バックグラウンドで特定のUUIDについてIBeaconをスキャンするにはどうすればよいですか?

分類Dev

Androidシステムがアプリを強制終了したときにアプリの状態を保存するにはどうすればよいですか?

分類Dev

アプリケーションがWPFで終了するときに、特定のオブジェクトのスレッドを強制終了するにはどうすればよいですか?

分類Dev

キーボードがハイジャックされたときにアプリケーションを強制的に最小化するにはどうすればよいですか?

分類Dev

プロセスが強制終了されたときにExpress Serverを正常にシャットダウンするにはどうすればよいですか?

分類Dev

プロセスが強制終了されたときにExpress Serverを正常にシャットダウンするにはどうすればよいですか?

分類Dev

プロセスが強制終了されたときにExpress Serverを正常にシャットダウンするにはどうすればよいですか?

分類Dev

Awesome WMでアプリケーションを強制的に最大化しないようにするにはどうすればよいですか?

分類Dev

Java Web Startアプリケーションが更新されたときにキャッシュを強制的にクリアすることは可能ですか?

分類Dev

アプリケーションが強制終了されたときに共有設定がStringSetを保存しない(これは機能です)

分類Dev

RabbitMQアプリケーションが開始されたかどうかを確認するにはどうすればよいですか

分類Dev

プロセスがアイドリングまたは強制終了されないようにするにはどうすればよいですか?

分類Dev

プロセスがアイドリングまたは強制終了されないようにするにはどうすればよいですか?

分類Dev

applicationDidEnterBackgroundが100%呼び出されない場合にスワイプしてアプリケーションを終了すると、データを確実に保存するにはどうすればよいですか?

分類Dev

アクティビティがシステムによって強制終了されたときにアプリの状態をフラッターで保存するにはどうすればよいですか?

分類Dev

アプリケーションがどこから取得されたかを判断するにはどうすればよいですか?

分類Dev

アプリケーションが実行されていない場合でも、TextViewを毎日更新するにはどうすればよいですか?

Related 関連記事

  1. 1

    アプリケーションが強制終了されたときに正確な位置更新を取得するにはどうすればよいですか?

  2. 2

    ログオフ後に強制終了することなくアプリケーションを起動するにはどうすればよいですか?

  3. 3

    Androidアプリケーションで正確な信号強度を取得するにはどうすればよいですか?

  4. 4

    (3D touch)ユーザーがアプリケーションを強制終了したときにアプリケーションで特定のページを開くにはどうすればよいですか?

  5. 5

    アプリケーションが強制終了された後にギャラリーから画像を取得するにはどうすればよいですか?

  6. 6

    アプリケーションが終了したときにdbusモニタースクリプトを強制終了するにはどうすればよいですか?

  7. 7

    Oreoでアプリが強制終了されたときに進行中の通知をキャンセルするにはどうすればよいですか?

  8. 8

    アプリケーションが正しく構成されていることを確認するにはどうすればよいですか?

  9. 9

    アプリがユーザーによって強制終了されたときに位置情報の更新を再開するにはどうすればよいですか?

  10. 10

    「ACCEPTED」状態にあるすべてのヤーンアプリケーションを強制終了するにはどうすればよいですか。

  11. 11

    ユーザーがアプリケーションを終了したときにMPMusicPlayerControllerの再生を停止するにはどうすればよいですか?

  12. 12

    更新を強制せずにPERFORCEJavaアプリケーションを同期させるにはどうすればよいですか?

  13. 13

    Android Oreo以降でアプリケーションが強制終了された場合でも、バックグラウンドで特定のUUIDについてIBeaconをスキャンするにはどうすればよいですか?

  14. 14

    Androidシステムがアプリを強制終了したときにアプリの状態を保存するにはどうすればよいですか?

  15. 15

    アプリケーションがWPFで終了するときに、特定のオブジェクトのスレッドを強制終了するにはどうすればよいですか?

  16. 16

    キーボードがハイジャックされたときにアプリケーションを強制的に最小化するにはどうすればよいですか?

  17. 17

    プロセスが強制終了されたときにExpress Serverを正常にシャットダウンするにはどうすればよいですか?

  18. 18

    プロセスが強制終了されたときにExpress Serverを正常にシャットダウンするにはどうすればよいですか?

  19. 19

    プロセスが強制終了されたときにExpress Serverを正常にシャットダウンするにはどうすればよいですか?

  20. 20

    Awesome WMでアプリケーションを強制的に最大化しないようにするにはどうすればよいですか?

  21. 21

    Java Web Startアプリケーションが更新されたときにキャッシュを強制的にクリアすることは可能ですか?

  22. 22

    アプリケーションが強制終了されたときに共有設定がStringSetを保存しない(これは機能です)

  23. 23

    RabbitMQアプリケーションが開始されたかどうかを確認するにはどうすればよいですか

  24. 24

    プロセスがアイドリングまたは強制終了されないようにするにはどうすればよいですか?

  25. 25

    プロセスがアイドリングまたは強制終了されないようにするにはどうすればよいですか?

  26. 26

    applicationDidEnterBackgroundが100%呼び出されない場合にスワイプしてアプリケーションを終了すると、データを確実に保存するにはどうすればよいですか?

  27. 27

    アクティビティがシステムによって強制終了されたときにアプリの状態をフラッターで保存するにはどうすればよいですか?

  28. 28

    アプリケーションがどこから取得されたかを判断するにはどうすればよいですか?

  29. 29

    アプリケーションが実行されていない場合でも、TextViewを毎日更新するにはどうすればよいですか?

ホットタグ

アーカイブ