2017-05-22 3 views
1

アクティブなときにうまく動作する単純なタイマーを構築しようとしています。問題は、30秒後にアプリケーションを終了して10秒後に戻った場合、私のタイマに約28秒残っていることを示しています。その後、私の通知のタイミングが狂ってしまいます。私は問題を解決するためにさまざまな方法を試してきましたが、役に立たないものです。誰もこれで助けることができますか? NSUserDefaultsでUILabelタイマーをバックグラウンドで更新する方法

import UIKit 
import AVFoundation 
import Foundation 
import UserNotifications 

class TimerController: UIViewController, UNUserNotificationCenterDelegate { 

//MARK: - Variables and Constants 

var Minutes = 10.0 
var audioPlayer = AVAudioPlayer() 
let vc = ViewController() 
var isGrantedAccess = false 
private var timer = Timer() 
let timeInterval = 0.1 

//MARK: - IBOutlet 
@IBOutlet weak var label: UILabel! 
@IBOutlet weak var sliderOutlet: UISlider! 
@IBOutlet weak var startOutlet: UIButton! 
@IBOutlet weak var stopOutlet: UIButton! 


//MARK: - Functions 

//MARK: - Notification Alert Functions 

func startTimer() { 

} 

func stopTimer(){ 
    //shut down timer 
    timer.invalidate() 
    //clear out any pending and delivered notifications 
    UNUserNotificationCenter.current().removeAllPendingNotificationRequests() 
    UNUserNotificationCenter.current().removeAllDeliveredNotifications() 
} 

func sendNotification() { 

     let content = UNMutableNotificationContent() 
     content.title = "Timer Finished" 
     content.body = "Your escort should be here" 
     content.sound = UNNotificationSound.default() 
     content.categoryIdentifier = "timer.category" 

     let trigger = UNTimeIntervalNotificationTrigger(timeInterval: Minutes, repeats: false) 
     let request = UNNotificationRequest(identifier: "timer.request", content: content, trigger: trigger) 
     UNUserNotificationCenter.current().add(request) { (error) in 
      if let error = error{ 
       print("Error posting notification:\(error.localizedDescription)") 

     } 
    } 
} 


func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping() -> Void) { 
    if response.actionIdentifier == "stop.action"{ 
     stopTimer() 
    } 
    completionHandler() 
} 

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    completionHandler([.alert,.sound]) 
} 




//MARK: - UIButtons 
@IBAction func slider(_ sender: UISlider) 
{ 
    Minutes = Double(sender.value) 
    label.text = String(format: "%.0f", Minutes) + " Minutes" 
} 


@IBAction func start(_ sender: AnyObject) { 

    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(counter), userInfo: nil, repeats: true) 

    sliderOutlet.isHidden = true 
    startOutlet.isHidden = true 
    self.sendNotification() 

} 

func counter() { 
    DispatchQueue.main.async { 

    self.Minutes -= 1 
    self.label.text = String(format: "%.0f", self.Minutes) + " Minutes" 
    } 
    if (Minutes == 0) 
    { 
     timer.invalidate() 

     sliderOutlet.isHidden = false 
     startOutlet.isHidden = false 


    } 
} 



@IBAction func stop(_ sender: AnyObject) 
{ 
    timer.invalidate() 
    Minutes = 0 
    sliderOutlet.setValue(10, animated: true) 
    label.text = "0 Minutes" 

    audioPlayer.stop() 

    sliderOutlet.isHidden = false 
    startOutlet.isHidden = false 
} 



override func viewDidLoad() 
{ 
    super.viewDidLoad() 

    print(vc.isGrantedAccess) 

    do 
    { 
     let audioPath = Bundle.main.path(forResource: "1", ofType: ".mp3") 
     try audioPlayer = AVAudioPlayer(contentsOf: URL(fileURLWithPath: audioPath!)) 
    } 
    catch 
    { 
     //ERROR 
    } 

} 
+0

可能な二重にフォアグラウンドに行くとき、新しい日付の間の差を計算しますカウントダウンタイマーを実行し、バックグラウンドで実行](https://stackoverflow.com/questions/35286466/making-a-countdown-timer-and-run-it-in-the-background) –

答えて

1

ストア日()あなたは

func applicationDidEnterBackground(_ application: UIApplication) {} 

にバックグラウンドに行くとき、あなたが作る[の

func applicationWillEnterForeground(_ application: UIApplication) {} 
関連する問題