IOS BGAppRefreshTask работает некорректно — корректен ли мой конвейер фоновых задач?IOS

Программируем под IOS
Ответить
Anonymous
 IOS BGAppRefreshTask работает некорректно — корректен ли мой конвейер фоновых задач?

Сообщение Anonymous »

Я реализую задачу фонового обновления с помощью BGAppRefreshTask в приложении iOS.

Задача проверяет, выполнено ли определенное условие, и может публиковать локальное уведомление с регулированием и ведением журнала отладки.
Все компилируется и регистрируется, и я добавил разрешенные идентификаторы планировщика фоновых задач в свой 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
}
}
Вызывается при запуске приложения (в режиме только для iPhone), а также перепланируется внутри handleTask() для обеспечения непрерывности.

Код: Выделить всё

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
  • Регулирование уведомлений
Код запуска AppDelegate:

Код: Выделить всё

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
}
Я пытаюсь подтвердить, соответствует ли мой конвейер ожиданиям Apple в отношении BGAppRefreshTask. Мои вопросы:
  • Видите ли вы что-нибудь, что могло бы помешать:

    запуску задачи фонового обновления системой?
  • Пользователи TestFlight не видят надежного фонового выполнения?
  • Уведомления не отображаются, даже если задача действительно выполнялась?
  • Логика перепланирования обеспечивает непрерывность?

Я знаю, что фоновое выполнение iOS довольно оппортунистично, но я хотел бы исключить любые структурные проблемы или проблемы жизненного цикла в моей реализации.
Буду очень признателен за любые рекомендации или подводные камни, о которых мне следует знать!

Подробнее здесь: https://stackoverflow.com/questions/798 ... pipeline-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»