簡體   English   中英

如何在Swift 3中為iPhone創建重復的倒數計時器應用程序,即使在后台,它也每隔'x'分鍾觸發一次通知

[英]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中可用的五種基本背景模式:

  1. 播放音頻 ,應用可以繼續在后台播放和/或錄制音頻。
  2. 接收位置更新 ,隨着設備位置的更改,應用程序可以繼續獲取回調。
  3. 執行通用的“無論如何”情況下的有限長度任務 ,其中應用程序可以在有限的時間內運行任意代碼。
  4. 處理特定於報亭應用程序的書報攤工具包下載 ,該應用程序可以在后台下載內容。
  5. 提供IP語音(VoIP)服務,該應用程序可以在后台運行任何任意代碼。 當然,Apple會限制其使用,因此您的應用程序也必須提供VoIP服務。

參考

抱歉,您可以永遠在后台運行計時器,因此您必須考慮執行執行有限長度任務后台模式無關的操作。

因此,您有3個選擇:

  1. 注冊您的應用以接收位置更新,這需要使用位置服務的請求權限requestAlwaysAuthorization()

  2. 每次您進入前台時都要檢查設備時間,如果用戶手動更改時間,這將無法正常工作,因此最好的辦法是調用Web服務以獲取UTC的當前時間

    http://www.timeapi.org/utc/now

  3. 當您的應用發送到后台時,注冊到本地通知

      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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM