1

В моем AppDelegate я добавил метод для выполнения запроса на выборку на моем Core Data, и в некоторых случаях я показываю уведомление ... Но я вижу что существуют некоторые устаревшие методы. Я пытался сделать некоторые изменения, но:Запрос фоновой выборки и уведомлений не работает в каждой ситуации

  • Когда я убить мое приложение в фоновый режим не работает

  • Когда мое приложение находится на переднем плане, Фоновый режим работы, но уведомления не показать

  • Когда я запускаю мое приложение в фоновом режиме, все работает отлично

Вот мой код:

Метод, который я хочу работать каждый раз (каждую минуту):

func notification(){ 

    let appDel: AppDelegate = UIApplication.shared.delegate as! AppDelegate 
    let context: NSManagedObjectContext = appDel.managedObjectContext 
    var messageNotif:String? = nil 

    do { 

     let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Leads") 
     let predicate = NSPredicate(format: "statutSendLead=%@ OR statutSendSimulation=%@", "0", "0") 
     request.predicate = predicate 
     let results = try context.fetch(request) 

     if results.count > 0 { 
      if Reachability.isConnectedToNetwork() == false { 

       messageNotif = "Votre demande n'a pas été envoyée, merci de vous connecter à internet." 
      } else { 

       Reachability.checkUrl(urlString:Configuration.MyVariables.url, finished: { isSuccess in 


        if isSuccess == false { 
         messageNotif = "Notre service d'enregistrement des demandes est temporairement indisponible, un renvoi sera effectué ultérieurement." 
        } 
       }) 
      } 
      */ 


      if (messageNotif != nil) { 

       let identifier = self.stringWithUUID() 


       if #available(iOS 10.0, *) { 
        let center = UNUserNotificationCenter.current() 
        center.requestAuthorization(options: [.alert, .sound]) { (granted, error) in 

         let content = UNMutableNotificationContent() 

         content.body = messageNotif! 
         content.sound = UNNotificationSound.default() 
         // Deliver the notification in five seconds. 
         let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 5, repeats: false) 
         let request = UNNotificationRequest.init(identifier: "test", content: content, trigger: trigger) 

         // Schedule the notification. 
         let center = UNUserNotificationCenter.current() 

         UNUserNotificationCenter.current().removeAllPendingNotificationRequests() 
         UNUserNotificationCenter.current().add(request) {(error) in 
          if let error = error { 
           print(error) 
          } 
         } 
        } 
       } else { 
        let notification = UILocalNotification() 
        notification.alertBody = messageNotif 
        notification.fireDate = NSDate() as Date 
        notification.soundName = UILocalNotificationDefaultSoundName 
        UIApplication.shared.scheduleLocalNotification(notification) 
       } 
      } 
     } 

     /* else { 
     timerNotification.invalidate() 
     } */ 

    } catch { 
     print(error) 
    } 
} 

Другие методы:

var window: UIWindow? 
var timerUploadData:Timer! 
var timerNotification:Timer! 
var test:Timer! 

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

    UIApplication.shared.setMinimumBackgroundFetchInterval(
     UIApplicationBackgroundFetchIntervalMinimum) 

    let userDefaults = UserDefaults.standard 

    if userDefaults.object(forKey: "ApplicationUniqueIdentifier") == nil { 
     let UUID = Foundation.UUID().uuidString 
     userDefaults.set(UUID, forKey: "ApplicationUniqueIdentifier") 
     userDefaults.synchronize() 
    } 

    Thread.sleep(forTimeInterval: 3.0) 
    window = UIWindow(frame: UIScreen.main.bounds) 
    let containerViewController = ContainerViewController() 
    window!.rootViewController = containerViewController 
    window!.makeKeyAndVisible() 


    if #available(iOS 10.0, *){ 

     application.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil)) 
     timerNotification = Timer.scheduledTimer(timeInterval: 60 * 1, target: self, selector: #selector(AppDelegate.notification), userInfo: nil, repeats: true) 

    } 
    else { //If user is not on iOS 10 use the old methods we've been using 
     let notificationSettings = UIUserNotificationSettings(
      types: [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound], categories: nil) 
     timerNotification = Timer.scheduledTimer(timeInterval: 60 * 1, target: self, selector: "notification", userInfo: nil, repeats: true) 
     application.registerUserNotificationSettings(notificationSettings) 
    } 

    registerPushNotifications() 

    return true 
} 

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { 
    notification() 
} 


func application(_ application: UIApplication, didRegister notificationSettings: UIUserNotificationSettings) { 
    if notificationSettings.types != UIUserNotificationType() { 
     application.registerForRemoteNotifications() 
    } 
} 

func registerPushNotifications() { 
    DispatchQueue.main.async { 
     let settings = UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil) 
     UIApplication.shared.registerUserNotificationSettings(settings) 
    } 
} 

func stringWithUUID() -> String { 
    let uuidObj = CFUUIDCreate(nil) 
    let uuidString = CFUUIDCreateString(nil, uuidObj)! 
    return uuidString as String 
} 
+0

см. этот https://stackoverflow.com/questions/17044373/local-notification-in-foreground для вашего вопроса, почему уведомления не отображаются, когда ваше приложение находится на переднем плане (потому что приложение должно показать само уведомление) –

+0

Любой ответ для приложения прекращенная ситуация? – Ben

+0

Вы прочитали: https://blog.newrelic.com/2016/01/13/ios9-background-execution/? –

ответ

0

хотя это старый вопрос, теперь я получил хороший ответ на аналогичный проблема, см. the answer from Rob

Это возможный ответ, почему ваш фоновый режим не работает, когда вы убиваете приложение и даже намек на то, как его проверить.

Другой вопрос уже ответили в комментариях:

посмотреть stackoverflow.com/questions/17044373/... на ваш вопрос, почему уведомления не отображаются, если ваше приложение находится на переднем плане (поскольку приложение есть чтобы показать само уведомление) - data cosmos 13 января в 10:49