タイマーをバックグラウンドで実行できるアプリケーションを実行しようとしています。
ここに私のコードがあります:
let taskManager = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(self.scheduleNotification), userInfo: nil, repeats: true)
RunLoop.main.add(taskManager, forMode: RunLoopMode.commonModes)
上記のコードは、ローカル通知を呼び出す機能を実行します。これは、アプリがフォアグラウンドにあるときに機能しますが、バックグラウンドで動作させるにはどうすればよいですか?
複数の印刷行を配置しようとしましたが、アプリを最小化(ホームボタンを押す)するとタイマーが停止し、アプリに戻ると再開することがわかりました。
タイマーを引き続きバックグラウンドで実行したかった。それを行う方法はありますか?
ここに私がしたいことがあります:
アプリを実行-> 10秒待機->通知受信-> 10秒待機->通知受信->戻って待機し、再び受信
フォアグラウンドで発生します。バックグラウンドではありません。 plsは助けます。
機能に移動して、バックグラウンドモードとアクティブなオーディオをオンにすることができます。 AirPlay、および画像と画像。
それは実際に動作します 。 DispatchQueueを設定する必要はありません。タイマーを使用できます。
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (t) in
print("time")
}
タイマーは、次の両方に該当する場合にのみバックグラウンドで実行できます。
他の何らかの理由でアプリがバックグラウンドで実行されます。 (ほとんどのアプリはそうではありません;ほとんどのアプリはバックグラウンドに入ると中断されます。)そして:
アプリが行ったとき、タイマーは既に実行されていましたintoバックグラウンド。
タイマーはバックグラウンドでは機能しません。バックグラウンドタスクについては、以下のリンクを確認してください...
https://www.raywenderlich.com/143128/background-modes-tutorial-getting-started
============== Objective Cの場合================
グローバルuibackgroundタスク識別子を作成します。
UIBackgroundTaskIdentifier bgRideTimerTask;
タイマーを作成してBGTaskIdentifierを追加します。これを使用して、新しいタイマーオブジェクトを作成するときに古いBGTaskIdentifierを削除することを忘れないでください。
[timerForRideTime invalidate];
timerForRideTime = nil;
bgRideTimerTask = UIBackgroundTaskInvalid;
UIApplication *sharedApp = [UIApplication sharedApplication];
bgRideTimerTask = [sharedApp beginBackgroundTaskWithExpirationHandler:^{
}];
timerForRideTime = [NSTimer scheduledTimerWithTimeInterval:1.0
target:self
selector:@selector(timerTicked:)
userInfo:nil
repeats:YES];
[[NSRunLoop currentRunLoop]addTimer:timerForRideTime forMode: UITrackingRunLoopMode];
ここでは、アプリがバックグラウンドになった場合でもこれが機能します。新しい問題が見つかった場合は私に尋ねてください。
NSTImerオブジェクトについていく必要はありません。すべての場所の更新には、独自のタイムスタンプが付いています。
したがって、最後の時間と現在の時間に追いつくことができ、そのしきい値に達すると頻繁にタスクを実行します。
if let location = locations.last {
let time = location.timestamp
guard let beginningTime = startTime else {
startTime = time // Saving time of first location time, so we could use it to compare later with subsequent location times.
return //nothing to update
}
let elapsed = time.timeIntervalSince(beginningTime) // Calculating time interval between first and second (previously saved) location timestamps.
if elapsed >= 5.0 { //If time interval is more than 5 seconds
//do something here, make an API call, whatever.
startTime = time
}
}