Наиболее полезным решением является использование push-уведомлений.Решение, которое я использовал в своем собственном приложении:
- Создайте простой сервер, который может получать простой запрос: токен устройства и время, когда вы хотите включить ваше устройство.
- Когда приложение переходит в фоновый режим, отправьте запрос на сервер, чтобы позже разбудить устройство.Например, 5 минут / 20 минут и т. Д.
func applicationWillEnterForeground(_ application: UIApplication) {
внутри AppDelegate
. - Не забудьте разрешить приложению работать в фоновом режиме, насколько это возможно.
Например,
@UIApplicationMain
class AppDelegate: UIResponder {
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable: Any],
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
if UIApplication.shared.applicationState != .active {
doFetch(completionHandler: completionHandler)
} else {
// foreground here
completionHandler(UIBackgroundFetchResult.noData)
}
}
func application(_ application: UIApplication,
performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
doFetch(completionHandler: completionHandler)
}
private func doFetch(completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
sendTheRequestToWakeApp()
backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
self?.endBackgroundTask()
}
/// do work here
completionHandler(UIBackgroundFetchResult.noData)
}
private func endBackgroundTask() {
print("Background task ended.")
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
private func sendTheRequestToWakeApp() {
/// Implement request using native library or Alamofire. etc.
}
}
на стороне сервера используют простое время или цикл.
Недостатки,
- Требуется Интернет
- Это не 'т отлично работает.Когда батарея разряжена, фоновый режим ограничен.
Не забудьте настроить проект: