Я установил фоновую выборку, и она работает очень хорошо из отладки-> симулировать фоновую выборку.Однако, когда дело доходит до реального устройства, его никогда не называют !!!Я ждал почти неделю, но ничего нового !!!
Вот, во-первых, мой код и настройки: я включил возможность фоновой выборки на вкладке возможностей и проверил ее отражение в info.plist
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
</array>
Во-вторых: я установил UIApplicationBackgroundFetchIntervalMinimum в Minimum в AppDelegate.swift
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
registerForNotifications()
UNUserNotificationCenter.current().delegate = self
UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)
return true
}
В-третьих: я запускаю процесс, который будет обрабатываться, когда фоновая выборка вызывается в executeFetchWithCompletionHandler
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
let content = UserNotifications.UNMutableNotificationContent()
let documentsPath = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
let destinationSqliteURL = documentsPath.appendingPathComponent("MyDB.db")
let db = FMDatabase(path: destinationSqliteURL.path)
if !db.open() {
print("Unable to open database")
completionHandler(UIBackgroundFetchResult.failed)
return
}
var title : String!
if let rs = db.executeQuery("select _Title from Questions ORDER BY RANDOM() LIMIT 1;", withArgumentsIn: []){
while (rs.next()){
title = rs.string(forColumn: "_Title")
}
} else {
print("select failed: \(db.lastErrorMessage())")
completionHandler(UIBackgroundFetchResult.failed)
}
content.title = "Q&A of the Day"
content.body = title!
content.sound = UNNotificationSound.default()
var dateComponents = DateComponents()
dateComponents.calendar = Calendar.current
dateComponents.hour = 8 // 8:00 hours
let trigger = UNCalendarNotificationTrigger(
dateMatching: dateComponents, repeats: true)
let uuidString = UUID().uuidString
let request = UNNotificationRequest(identifier: uuidString,
content: content, trigger: trigger)
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.removeAllPendingNotificationRequests()
notificationCenter.add(request) { (error) in
if error != nil {
print("ERROR in setting up the scheduled notification request")
completionHandler(UIBackgroundFetchResult.failed)
}
else{
print("Notification is Sent")
completionHandler(UIBackgroundFetchResult.newData)
}
}
}
Это прекрасно работает при отладке его с имитации фоновой выборки, однако он не вызывается ни разу при тестировании на реальном устройстве.Я узнал, что, если он даже вызывается один раз, то в 8:00 каждое утро мне нужно отправлять уведомление, чего нельзя сказать о реальном устройстве.