0

私のロケーションアプリケーションでは、didUpdateToLocationメソッドを実装しました。このメソッドは毎秒呼び出され、位置データを提供します。しかし、毎秒場所を取得する必要はありません。このメソッドを 5 分ごとに起動する必要があります。これを行うことは可能ですか?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //initialize location lisetener on Application startup
    self.myLocationManager = [[CLLocationManager alloc]init];
    self.myLocationManager.desiredAccuracy = kCLLocationAccuracyBest;
    self.myLocationManager.delegate = self;
    [self.myLocationManager startUpdatingLocation];


    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        self.viewController = [[INNOViewController alloc] initWithNibName:@"INNOViewController_iPhone" bundle:nil];
    } else {
        self.viewController = [[INNOViewController alloc] initWithNibName:@"INNOViewController_iPad" bundle:nil];
    }
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}


-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    /*
    if(self.executingInBackground)
    {
        NSLog(@"Aplication running in background");
    }
    else
    {
        NSLog(@"Aplication NOT running in background");
    }
     */


    //NSLog(@"new location->%@ and old location -> %@",newLocation,oldLocation);

    NSString *urlAsString = @"http://www.apple.com";

    NSURL *url=[NSURL URLWithString:urlAsString];

    NSURLRequest *urlRequest=[NSURLRequest requestWithURL:url];

    NSOperationQueue *queue = [[NSOperationQueue alloc]init];


    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

        if ([data length] > 0 && error == nil) {
            NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"Downloaded html -> %@",html);
            //NSLog(@"Downloaded successfully");
        }
        else if([data length] == 0 && error == nil)
        {
            NSLog(@"Nothing downloaded");
        }
        else
        {
            NSLog(@"Error occured -> %@",error);
        }

    }];
}
4

4 に答える 4

3

と頼んだので、すぐに呼び出されますkCLLocationAccuracyBest。少し後退します。時間ではなく、デルタ距離に基づいています。その精度では、距離がわずかに変化しただけでも、良好な受信エリアで更新がトリガーされます。別の値を使用してください。

繰り返しますが、これらのメソッドは時間に基づいて使用することを意図したものではありません。これらは、デルタ距離に基づいて使用されることを意図しています。

于 2013-04-24T08:30:59.190 に答える
2

精度と距離フィルターを減らします。これにより、メソッドが呼び出される頻度が減り
ます。5 分後にメソッドを呼び出したい場合は、メソッド stopupdating と startupdating を 5 分ごとに強制的に呼び出すことができます。

于 2013-04-24T08:30:37.733 に答える
1

startMonitoringSignificantLocationChangesの代わりに使用できますstartUpdatingLocation。ユーザーが最後の位置から約 500 メートル移動した場合にのみ更新されます

于 2013-04-24T08:32:21.073 に答える
1

それ以外の:

[self.myLocationManager startUpdatingLocation];

使用する:

[self.myLocationManager startMonitoringSignificantLocationChanges];

使用する場合: startUpdatingLocation1 秒ごとにデリゲート メソッドが呼び出されます。使用するstartMonitoringSignificantLocationChangesと、場所が大幅に変更されたとき、または 5 分間隔でデリゲート メソッドが呼び出されます。


startMonitoringSignificantLocationChanges

場所の大幅な変更に基づいて、更新の生成を開始します。 - (void)startMonitoringSignificantLocationChanges

討論

このメソッドは、ロケーション イベントの配信を非同期で開始し、呼び出した直後に戻ります。ロケーション イベントは、デリゲートの locationManager:didUpdateLocations: メソッドに配信されます。配信される最初のイベントは、通常、最後にキャッシュされたロケーション イベント (存在する場合) ですが、状況によってはより新しいイベントになる場合があります。現在の場所の修正を取得するにはさらに数秒かかる場合があるため、デリゲート メソッドの場所イベントのタイムスタンプを必ず確認してください。

現在の場所の修正を返した後、受信者は、ユーザーの場所の大幅な変更が検出された場合にのみ更新イベントを生成します。たとえば、デバイスが別の基地局に関連付けられると、新しいイベントが生成される場合があります。イベントを生成するために、distanceFilter プロパティの値に依存しません。このメソッドを連続して数回呼び出しても、新しいイベントが自動的に生成されるわけではありません。ただし、その間に stopMonitoringSignificantLocationChanges を呼び出すと、次にこのメソッドを呼び出したときに新しい初期イベントが送信されます。

このサービスを開始した後でアプリケーションが終了した場合、新しいイベントが到着すると、システムは自動的にアプリケーションをバックグラウンドで再起動します。このような場合、アプリケーション デリゲートの locationManager:didUpdateLocations: メソッドに渡されるオプション ディクショナリには、ロケーション イベントのためにアプリケーションが起動されたことを示すキー UIApplicationLaunchOptionsLocationKey が含まれます。再起動時に、引き続きロケーション マネージャー オブジェクトを構成し、このメソッドを呼び出してロケーション イベントを受信し続ける必要があります。位置情報サービスを再起動すると、現在のイベントがデリゲートにすぐに配信されます。さらに、ロケーション サービスを開始する前であっても、ロケーション マネージャー オブジェクトのロケーション プロパティには最新のロケーション オブジェクトが取り込まれます。

locationManager:didUpdateLocations: メソッドを実装するデリゲート オブジェクトに加えて、潜在的なエラーに対応するために locationManager:didFailWithError: メソッドも実装する必要があります。

注: アプリは、デバイスが前回の通知から 500 メートル以上移動するとすぐに通知を受け取ることができます。5 分に 1 回以上の頻度で通知を期待するべきではありません。デバイスがネットワークからデータを取得できる場合、ロケーション マネージャーはタイムリーに通知を配信する可能性が高くなります。

CLLocationManager.h で宣言

参照CLLocationManager

于 2013-04-24T08:31:07.897 に答える