web-dev-qa-db-ja.com

Swift 3-タイマーをバックグラウンドで動作させる方法

タイマーをバックグラウンドで実行できるアプリケーションを実行しようとしています。

ここに私のコードがあります:

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は助けます。

11
Cristina Reyes

機能に移動して、バックグラウンドモードとアクティブなオーディオをオンにすることができます。 AirPlay、および画像と画像。

それは実際に動作します 。 DispatchQueueを設定する必要はありません。タイマーを使用できます。

Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (t) in

   print("time")
}
13

タイマーは、次の両方に該当する場合にのみバックグラウンドで実行できます。

  • 他の何らかの理由でアプリがバックグラウンドで実行されます。 (ほとんどのアプリはそうではありません;ほとんどのアプリはバックグラウンドに入ると中断されます。)そして:

  • アプリが行ったとき、タイマーは既に実行されていましたintoバックグラウンド。

7
matt

タイマーはバックグラウンドでは機能しません。バックグラウンドタスクについては、以下のリンクを確認してください...

https://www.raywenderlich.com/143128/background-modes-tutorial-getting-started

1
Morshed Alam

============== 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];

ここでは、アプリがバックグラウンドになった場合でもこれが機能します。新しい問題が見つかった場合は私に尋ねてください。

1
NIRAV BHAVSAR

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
                }
}
0
cspam