swift 4: фоновый выбор никогда не вызывался - PullRequest
0 голосов
/ 02 октября 2018

Я установил фоновую выборку, и она работает очень хорошо из отладки-> симулировать фоновую выборку.Однако, когда дело доходит до реального устройства, его никогда не называют !!!Я ждал почти неделю, но ничего нового !!!

Вот, во-первых, мой код и настройки: я включил возможность фоновой выборки на вкладке возможностей и проверил ее отражение в 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 каждое утро мне нужно отправлять уведомление, чего нельзя сказать о реальном устройстве.

...