5

バックグラウンドで NSTimer を実行するアプリケーションを作成しました。Location Manager を使用して NSTimer をバックグラウンドで実行しました。

以下のリンクを使用して NSTimer をバックグラウンドで実行しました。

iOS アプリケーションで n 分ごとにバックグラウンドで位置情報を更新するにはどうすればよいですか?

このアプローチは iOS 6 では正常に機能しますが、iOS 7 では機能しません。iOS 7 でアプリケーションがバックグラウンドにある間、しばらくするとアプリケーションがクラッシュします。

バックグラウンドで NSTimer を実行する別の方法があれば教えてください。

前もって感謝します。

4

4 に答える 4

5

iOS7 では、定期的なデータ フェッチのための新しいモードがあります。アプリにバックグラウンド モードを追加fetchし、アプリケーション デリゲートで間隔を に渡します- [UIApplication setMinimumBackgroundFetchInterval:。アプリがバックグラウンドになると、アプリのデリゲートは呼び出しの受信を開始application:performFetchWithCompletionHandler:します。

詳細はこちら: https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:performFetchWithCompletionHandler :

于 2013-09-26T07:32:28.840 に答える
2
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
loop = [NSTimer scheduledTimerWithTimeInterval:0.25 target:self selector:@selector(Update) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:loop forMode:NSRunLoopCommonModes];
于 2016-01-18T07:21:25.617 に答える
-1
NSTimer *currentCycleTimer;

UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
UIApplication *app = [UIApplication sharedApplication];
bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
[app endBackgroundTask:bgTask];
}];
[currentCycleTimer invalidate];
currentCycleTimer=nil;
secondsLeft = 120;
currentCycleTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self        selector:@selector(Countdown) userInfo:nil repeats: YES];

-(void) Countdown
{
  [currentCycleTimer invalidate];
  currentCycleTimer=nil;
}
于 2015-01-03T12:25:28.757 に答える
-2
-(void)start {

[[NSUserDefaults standardUserDefaults ]setObject:[NSDate date] forKey:@"startTimer"];

 Nstimer*   timer2=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerFired) userInfo:nil repeats:YES];
}
-(void)timerFired
{
      @try {
    NSDate *timerStartDate = [[NSUserDefaults standardUserDefaults]objectForKey:@"startTimer"];


NSTimeInterval interval=[timerStartDate timeIntervalSinceNow];

int hour1=-interval/3600;

int rem =((int)interval)%3600 ;

int min1 = -rem/60 ;

int sec1 = -rem %60 ;

// NSLog(@"hour %i  rem %i",hour,rem);    
// NSLog(@"hour%i",hour1);
// NSLog(@"min%i",min1);
// NSLog(@"sec%i",sec1);


NSString *strmin=[NSString stringWithFormat:@"%i",min1];
NSString *strhour=[NSString stringWithFormat:@"%i",hour1];

if ([strmin integerValue]<10)
{
    [lblSeconds setText:[NSString stringWithFormat:@"0%@",strmin]];
}
else 
{
    lblSeconds.text=strmin;

}
if ([strhour integerValue]<10) {
    [lblHour setText:[NSString stringWithFormat:@"0%@",strhour]];
}
else
{
    lblHour.text=strhour;

}

}
@catch (NSException *exception) {
    NSLog(@"exception in timer %@ ",[exception description]);

}
  return;   
}
于 2013-11-29T07:36:27.860 に答える