Задача проверяет, выполнено ли определенное условие, и может публиковать локальное уведомление с регулированием и ведением журнала отладки.
Все компилируется и регистрируется, и я добавил разрешенные идентификаторы планировщика фоновых задач в свой Info.plist.
Однако, Я хочу проверить, корректен ли мой общий конвейер или я упускаю что-то тонкое, что может привести к ненадежному выполнению задачи в TestFlight/производстве.
Ниже приведено краткое описание моей настройки.
Регистрация (приложение SwiftUI с использованием .backgroundTask):
Код: Выделить всё
@main
struct IOSApp: App {
@UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup { RootView() }
.backgroundTask(.appRefresh(MissedReflectionsMonitorService.identifier)) {
await MissedReflectionsMonitorService.shared.handleTask()
}
}
}
Scheduling
func schedule(in seconds: TimeInterval) {
guard isiPhoneOnly() else { return }
let req = BGAppRefreshTaskRequest(identifier: Self.identifier)
req.earliestBeginDate = Date(timeIntervalSinceNow: seconds)
do {
try BGTaskScheduler.shared.submit(req)
} catch {
// log scheduling errors
}
}
Код: Выделить всё
func handleTask() async {
guard isiPhoneOnly() else { return }
schedule(in: 300) // reschedule first
do {
let count = try await computeMissedReflectionsCount()
if count > 0, shouldNotify(count) {
await postLocalNotification(count)
recordNotificationState(count)
}
} catch {
// log error
}
}
- выходит из строя раньше, если не в режиме только для iPhone
- переносит само планирование
- вычисляет количество «пропущенных отражений»
- применяет регулирование
- при необходимости отправляет локальное уведомление
- сохраняет состояние отладки в UserDefaults
- Регулирование уведомлений
Код: Выделить всё
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil
) -> Bool {
UNUserNotificationCenter.current().delegate = notificationDelegate
if DeviceMode.current() == .iPhoneOnly {
Task { await MissedReflectionsMonitorService.shared.schedule(in: 300) }
} else {
BGTaskScheduler.shared.cancel(taskRequestWithIdentifier: MissedReflectionsMonitorService.identifier)
}
return true
}
- Видите ли вы что-нибудь, что могло бы помешать:
запуску задачи фонового обновления системой? - Пользователи TestFlight не видят надежного фонового выполнения?
- Уведомления не отображаются, даже если задача действительно выполнялась?
- Логика перепланирования обеспечивает непрерывность?
Я знаю, что фоновое выполнение iOS довольно оппортунистично, но я хотел бы исключить любые структурные проблемы или проблемы жизненного цикла в моей реализации.
Буду очень признателен за любые рекомендации или подводные камни, о которых мне следует знать!
Подробнее здесь: https://stackoverflow.com/questions/798 ... pipeline-c
Мобильная версия