2015-01-12 13 views
6
class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 
    } 

    func update() { 
     println("Something cool") 
    } 
} 

Không sao cho Trình mô phỏng , Tôi sẽ liên tục "Điều gì đó thú vị" thông qua tôi đã nhấn vào nút trang chủ. Nhưng nó hoạt động khi tôi gỡ lỗi ứng dụng bằng iPhone của mình. Tôi đã không nhận được bất cứ điều gì khi tôi khai thác nút Home và làm cho nền ứng dụng của tôi chạy. Có người nói với tôi rằng tôi có thể chơi một nhạc trống dài để thực hiện chạy ứng dụng của tôi trong background.But Tôi không biết làm thế nào để chơi nhạc ở chế độ nền với @ Matt nhanh chóngLàm cách nào để sử dụng nền NSTimer?

+0

h ttp: //stackoverflow.com/questions/8415870/scheduled-nstimer-when-app-is-in-background – rakeshbs

+1

Tại sao bạn _need_ bộ hẹn giờ chạy trong nền? – matt

Trả lời

3

khi tôi khai thác các nút home và làm cho nền ứng dụng chạy của tôi

Không, đó là giả định sai. Khi bạn nhấn vào nút trang chủ, bạn làm không phải làm cho ứng dụng của bạn chạy dưới nền. Bạn làm cho ứng dụng của mình tạm dừng trong nền. Mã của bạn không không chạy khi bạn ở chế độ nền.

Ứng dụng có thể nhận được sự cho phép đặc biệt để chạy trong nền chỉ để thực hiện một số hoạt động hạn chế nhất định, như tiếp tục phát nhạc hoặc tiếp tục sử dụng Vị trí chính. Tuy nhiên, ứng dụng của bạn không thực hiện được những thứ đó, vì vậy nó sẽ chuyển sang nền và dừng lại.

+0

một người nào đó nói với tôi rằng tôi có thể phát nhạc trống dài để làm cho Ứng dụng của tôi chạy ở chế độ nền. Nhưng tôi không biết cách phát nhạc ở chế độ nền với @matt –

+0

sau đó tìm hiểu cách thực hiện điều đó. Tôi đã đề cập đến chơi nhạc như một hoạt động nền pháp lý trong câu trả lời của tôi. – matt

+0

Tôi nghi ngờ ứng dụng của bạn có thể bị từ chối từ cửa hàng ứng dụng nếu bạn làm điều gì đó tương tự.Thay vào đó, hãy giải thích bạn cảm thấy mình cần làm gì trong nền? Theo mặc định, ứng dụng bị tạm dừng không phải là thứ mà người dùng quan tâm vào lúc đó. Nó sẽ có thể làm những gì nó cần khi người dùng bắt đầu sử dụng nó một lần nữa. –

18

Bạn có thể sử dụng beginBackgroundTaskWithExpirationHandler để nhận thời gian thực hiện nền.

class ViewController: UIViewController { 
    var backgroundTaskIdentifier: UIBackgroundTaskIdentifier? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     backgroundTaskIdentifier = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({ 
      UIApplication.sharedApplication().endBackgroundTask(self.backgroundTaskIdentifier!) 
     }) 
     var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "update", userInfo: nil, repeats: true) 
    } 

    func update() { 
     println("Something cool") 
    } 
} 

Swift 3,0

backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: { 
    UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!) 
}) 

Mã này được lấy cảm hứng từ this answer, nhưng tôi chuyển đến nhanh chóng.

Điều này dường như chỉ chạy trong 3 phút trên iOS 7 trở lên.

+0

Như đã nêu, đó là một cổng nhanh từ câu trả lời trước. Tôi vừa chuyển câu trả lời, kiểm tra mã, và nó dường như đang hoạt động. Tôi có thể làm sạch các ví dụ một chút và loại bỏ một số mã rác. – garetmckinley

+0

đã cắt mã ví dụ xuống một chút. – garetmckinley

+0

một người nào đó nói với tôi rằng tôi có thể phát một bản nhạc trống dài để làm cho Ứng dụng của tôi chạy ở chế độ nền. Nhưng tôi không biết cách phát nhạc trong nền bằng cách nhanh chóng @mediachicken –

7

Tôi sẵn sàng đặt cược rằng bạn không cần chạy hẹn giờ ở chế độ nền, những gì bạn cần là biết thời gian đã trôi qua trong khi bạn bị tạm ngưng. Đó là cách sử dụng tài nguyên của bạn tốt hơn là cố gắng phát một tệp âm thanh trống.

Sử dụng applicationWillResignActiveapplicationDidBecomeActive để xác định khoảng thời gian đã trôi qua. Đầu tiên lưu fireDate bộ đếm thời gian của bạn và làm mất hiệu lực nó trong applicationWillResignActive

func applicationWillResignActive(application: UIApplication) { 
    guard let t = self.timer else { return } 
    nextFireDate = t.fireDate 
    t.invalidate() 
} 

Tiếp theo, xác định bao nhiêu thời gian còn lại cho bộ đếm thời gian trong applicationDidBecomeActive bằng cách so sánh thời gian nay đến fireDate bạn đã lưu trong applicationWillResignActive gọi:

func applicationDidBecomeActive(application: UIApplication) { 
    guard let n = nextFireDate else { return } 
    let howMuchLonger = n.timeIntervalSinceDate(NSDate()) 
    if howMuchLonger < 0 { 
     print("Should have already fired \(howMuchLonger) seconds ago") 
     target!.performSelector(selector!) 
    } else { 
     print("should fire in \(howMuchLonger) seconds") 
     NSTimer.scheduledTimerWithTimeInterval(howMuchLonger, target: target!, selector: selector!, userInfo: nil, repeats: false) 
    } 
} 

Nếu bạn cần một lặp lại một, chỉ cần làm toán để tìm ra bao nhiêu lần so với bộ đếm thời gian nên đã bị sa thải trong khi ở chế độ nền

let howManyTimes = abs(howMuchLonger)/repeatInterval 
Các vấn đề liên quan