2017-12-26 20 views
-1

私は自分で作成したタイマーアプリケーションを持っています。NSTimerを物理デバイスのバックグラウンドで実行させる

シミュレータのiPhone Xで実行すると、タイマーはバックグラウンドで正常に動作しますが、物理デバイス(iPad Pro)でテストすると、バックグラウンドでは実行されません。

  • 私がバックグラウンドで言うときは、デバイスの上部(iPad)/側面(iPhone)にあるオフボタンを押して、画面が黒くなることを意味します。

これはシミュレータの代わりに、または私が気付いていないことですか、物理デバイスのバックグラウンドでも動作させるために私のアプリについて変更する必要があるものはありますか? DidBackgroundで

+3

検索してください。これは何度もカバーされていました。 https://stackoverflow.com/search?q=%5Bswift%5D+timer+background – rmaddy

+0

「バックグラウンドで実行されない」という意味の情報をさらに提供する必要があります。あなたはそれがバックグラウンドでやりたいですか? – ryantxr

+0

ryantxr私が意味することは、タイマーが一定の時間に達すると、オーディオを実行できるように、1の間隔で時間をバックグラウンドで実行し続けたいということです。 –

答えて

0

ありがとう:

  1. 停止normalTimer。

    1. 停止backgroundTaskTimer:
    2. は新backgroundTaskTimer WillForegroundで

    を開始

サンプルコードの下に検索normalTimer開始:

Appdelegateで

宣言:

var backgroundUpdateTask: UIBackgroundTaskIdentifier! 

    var backgroundTaskTimer:Timer! = Timer() 

を実装:

ApplicationDidEnterBackgroundで
func doBackgroundTask() { 
    DispatchQueue.global(qos: .default).async { 
     self.beginBackgroundTask() 

     if self.backgroundTaskTimer != nil { 
      self.backgroundTaskTimer.invalidate() 
      self.backgroundTaskTimer = nil 
     } 

     //Making the app to run in background forever by calling the API 
     self.backgroundTaskTimer = Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(self.startTracking), userInfo: nil, repeats: true) 
     RunLoop.current.add(self.backgroundTaskTimer, forMode: RunLoopMode.defaultRunLoopMode) 
     RunLoop.current.run() 

     // End the background task. 
     self.endBackgroundTask() 

    } 
} 

func beginBackgroundTask() { 
    self.backgroundUpdateTask = UIApplication.shared.beginBackgroundTask(withName: "Track trip", expirationHandler: { 
     self.endBackgroundTask() 
    }) 
} 

func endBackgroundTask() { 
    UIApplication.shared.endBackgroundTask(self.backgroundUpdateTask) 
    self.backgroundUpdateTask = UIBackgroundTaskInvalid 
} 

:ApplicationWillEnterForegroundで

func applicationDidEnterBackground(_ application: UIApplication) { 

    //Start the background fetch 
       self.doBackgroundTask() 

     } 

func applicationWillEnterForeground(_ application: UIApplication) { 

    if self.backgroundTaskTimer != nil { 
     self.backgroundTaskTimer.invalidate() 
     self.backgroundTaskTimer = nil 
    } 
} 
関連する問題