2017-04-21 16 views
0

私はx秒ごとに自分の位置を更新し、UIを更新するための通知を送信できるiOSを構築しようとしています。 私の所在はわかりますが、更新はランダムです。任意のアイデアをどのように間隔を追加するには?ここx秒ごとに場所を更新するiOS

私のコードです:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    CLLocation *location = [locations lastObject]; 
    [self sendNotification :@"long" 
          :[NSString stringWithFormat:@"%.8f",location.coordinate.longitude]]; 
    [self sendNotification :@"lat" 
          :[NSString stringWithFormat:@"%.8f",location.coordinate.latitude]]; 

} 
+0

を宣言した次の例を見ることができますロケーションマネージャーが場所が変更されたときに通知するだけのx秒ごとに更新するのはなぜですか。 – rckoenes

+0

変更されていないにもかかわらず、間隔が必要です –

+0

CoreLocationの動作方法ではありません。したがって、あなたはそれを偽造する必要があります。変数に最新の場所を格納し、x秒ごとにこれを読んでください。 – rckoenes

答えて

0

使用NSTimer:

//このメソッドを実装グローバル

NSTimer *ShareTimeCheck; 
    int ShareSecLeft; 

を宣言:

-(void)shareTimeChecking{ 
     if (ShareSecLeft==0) { 
      [ShareTimeCheck invalidate]; 
      ShareTimeCheck=nil; 
     }else{ 
      ShareSecLeft--; 
      if (ShareSecLeft==0) { 
       [ShareTimeCheck invalidate]; 
       ShareTimeCheck=nil; 
      } 
     } 
    } 

コールウル位置更新方法では、この1:iOS版で

    if (ShareSecLeft==0) { 
     [ShareTimeCheck invalidate]; 
         ShareTimeCheck=nil; 
         ShareSecLeft=5; 

    heduledTimerWithTimeInterval:1 target:self selector:@selector(shareTimeChecking) userInfo:nil repeats:YES]; 

    //write ur code to update the ui. or update to server as per ur requirement. 

} 
+0

申し訳ありませんが動作しませんでした –

+0

問題は何ですか?私は私のアプリケーションで5秒ごとに更新しています...私のためにうまく働いています... –

0

がネイティブ我々は、システムがユーザーの場所を更新する間隔を変更することはできません。 GPS信号がある場合、IOSは毎秒定期的に位置を更新します。

アプリケーションがフォアグラウンドにある場合、NSTimerを使用するなど、間隔を置いて監視をやり直すことができます。この場合、アプリケーションの寿命について考える必要があります。アプリケーションはバックグラウンドで実行され、アイドルストップ中は動作しません。

最後に、UIApplication:beginBackgroundTaskWithExpirationHandler:を使用して、バックグラウンドでNSTimerを使用しています。このタイマーは、アプリケーションがバックグラウンドで実行されている間に定期的にトリガーします。簡単な解決策は、タイマーループを実行するかもしれない

#import "AppDelegate.h" 

@implementation AppDelegate 

BOOL locationStarted = FALSE; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    //set default value after application starts 
    locationStarted = FALSE; 
    //create CLLocationManager variable 
    locationManager = [[CLLocationManager alloc] init]; 
    //set delegate 
    locationManager.delegate = self; 

    app = [UIApplication sharedApplication]; 

    return YES; 
} 

//update location 
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 
    NSLog(@"Location: %f, %f", newLocation.coordinates.longtitude, newLocation.coordinates.latitude); 
} 

//run background task 
-(void)runBackgroundTask: (int) time{ 
    //check if application is in background mode 
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { 

     //create UIBackgroundTaskIdentifier and create a background task, which starts after time 
     __block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
      [app endBackgroundTask:bgTask]; 
      bgTask = UIBackgroundTaskInvalid; 
     }]; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
      NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(startTrackingBg) userInfo:nil repeats:NO]; 
      [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode]; 
      [[NSRunLoop currentRunLoop] run]; 
     }); 
    } 
} 

//starts when application switches to background 
- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    //check if application status is in background 
    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) { 
     NSLog(@"start background tracking from appdelegate"); 

     //start updating location with location manager 
     [locationManager startUpdatingLocation]; 
    } 

    //change locationManager status after time 
    [self runBackgroundTask:20]; 
} 

//starts with background task 
-(void)startTrackingBg{ 
    //write background time remaining 
    NSLog(@"backgroundTimeRemaining: %.0f", [[UIApplication sharedApplication] backgroundTimeRemaining]); 

    //set default time 
    int time = 60; 
    //if locationManager is ON 
    if (locationStarted == TRUE) { 
     //stop update location 
     [locationManager stopUpdatingLocation]; 
     locationStarted = FALSE; 
    }else{ 
     //start updating location 
     [locationManager startUpdatingLocation]; 
     locationStarted = TRUE; 
     //ime how long the application will update your location 
     time = 5; 
    } 

    [self runBackgroundTask:time]; 
} 

//application switches back from background 
- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    locationStarted = FALSE; 
    //stop updating 
    [locationManager stopUpdatingLocation]; 
} 

/*** other methods ***/ 
- (void)applicationWillResignActive:(UIApplication *)application{} 

- (void)applicationDidBecomeActive:(UIApplication *)application{} 

- (void)applicationWillTerminate:(UIApplication *)application{} 

@end 

__block UIBackgroundTaskIdentifier bgTask = [app beginBackgroundTaskWithExpirationHandler:^{ 
    [app endBackgroundTask:bgTask]; 
    bgTask = UIBackgroundTaskInvalid; 
}]; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 
    NSTimer* t = [NSTimer scheduledTimerWithTimeInterval:time target:self selector:@selector(startTrackingBg) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:t forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 
}); 
+0

可変アプリケーションとは何ですか? –

+0

chogath申し訳ありません、私はAppDelegate.hコードを追加するのを忘れました。 @interface AppDelegate:UIResponder { CLLocationManager * locationManager; UIApplication * app; } –

+0

新しいプロジェクトを作成しましたが、コードをコピーしてコンソールに何も表示されません! –

0

はこれを試してみてください:

は.hファイルに

@property (strong, nonatomic) NSDate *lastTimestamp; 

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    CLLocation *mostRecentLocation = locations.lastObject; 
    NSLog(@"Current location: %@ %@", @(mostRecentLocation.coordinate.latitude), @(mostRecentLocation.coordinate.longitude)); 

    NSDate *now = [NSDate date]; 
    NSTimeInterval interval = self.lastTimestamp ? [now timeIntervalSinceDate:self.lastTimestamp] : 0; 

    if (!self.lastTimestamp || interval >= 5 * 60) 
    { 
     self.lastTimestamp = now; 
     NSLog(@"update your UI"); 
    } 
}