[英]How to make a repeating countdown timer app for an iphone in swift 3 that fires a notification every 'x' minutes even when in the background
我正在嘗試制作一個簡單的應用程序,無論該應用程序是否在前台,它每7分鍾發出一次警報(當然是可配置的)。
盡管只需要做一個硬編碼的重復計時器就可以做到這一點很容易,但是添加任何種類的前端接口似乎都給我的策略帶來了麻煩,這向我暗示也許我完全采用了錯誤的方法。
例如,如果我只有開始/停止按鈕,則暫停現有的計時器需要取消后台通知,但要跟蹤還剩多少時間。 然后,當恢復時,需要使用剩余時間重新創建通知。 例如,如果它是一個5分鍾的計時器,而僅剩2分鍾就暫停,那么當它恢復時,它將被設置為2分鍾的倒數計時器。 因此,如果我將應用程序置於后台,則會收到時間已到的通知,但它不會自動開始5分鍾的倒計時,而是返回2分鍾。 我需要能夠創建重復的通知,但是一旦“剩余”時間到期,就切換到完整的持續時間。
我可以對通知創建一個操作,如果用戶按下該操作,它將重新啟動計時器,但是為此,我需要計時器立即自動重新啟動,即使用戶忽略了它也是如此。
我可以使用前台計時器輕松地完成此操作,但是隨后我需要強制我的手機永遠不要進入睡眠狀態,並且僅在此應用程序處於前台時才可以工作,而這在手機上並不總是可能的。
其他計時器應用程序也可以彈出后台通知。 日歷應用程序可以安排任意時間的后台通知。 我懷疑日歷應用程序在啟動時會安排所有未來(包括重復)的警報,因為即使手機已重啟且日歷應用程序從未啟動,它仍能正常工作。 因此,日歷應用程序通知機制必須足夠聰明才能觸發警報,然后安排下一個警報,這正是我在這里需要的機制。 我以為日歷應用程序可能只使用基於服務器的遠程通知,而服務器處理了所需的更復雜的邏輯,但事實並非如此,因為即使沒有任何互聯網連接,日歷應用程序通知也能正常工作。
我對此進行了大量研究,但似乎找不到解決方法。 如果在觸發通知時我可以傳遞一小段要執行的代碼,那將起作用,但是我看不到這樣做的方法。
這是我的通知創建代碼目前的樣子:
let content = UNMutableNotificationContent()
content.title = "Context switch"
content.body = "\(Int(initialDuration / 60)) minutes have passed."
content.sound = UNNotificationSound.default()
content.categoryIdentifier = generalCatId
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: remaining, repeats: true)
let request = UNNotificationRequest(identifier: requestIdentifier, content: content, trigger: trigger)
let center = UNUserNotificationCenter.current()
center.delegate = self
center.add(request) { (error) in
if error != nil {
print(error!)
}
}
iOS中可用的五種基本背景模式:
抱歉,您可以永遠在后台運行計時器,因此您必須考慮執行與執行有限長度任務后台模式無關的操作。
因此,您有3個選擇:
注冊您的應用以接收位置更新,這需要使用位置服務的請求權限requestAlwaysAuthorization()
每次您進入前台時都要檢查設備時間,如果用戶手動更改時間,這將無法正常工作,因此最好的辦法是調用Web服務以獲取UTC的當前時間
當您的應用發送到后台時,注冊到本地通知
var localNotification = UILocalNotification() localNotification.fireDate = NSDate(timeIntervalSinceNow: 5) localNotification.alertBody = "Time out" localNotification.timeZone = NSTimeZone.defaultTimeZone() localNotification.applicationIconBadgeNumber = UIApplication.sharedApplication().applicationIconBadgeNumber + 1
然后安排此通知UIApplication.sharedApplication().scheduleLocalNotification(localNotification)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.