1

Dans mon AppDelegate, j'ai ajouté une méthode pour faire une demande d'extraction sur mon Core Data, et dans certains cas, je montre une notification ... Mais je vois qu'il existe des méthodes obsolètes. J'ai essayé de faire quelques changements, mais:La requête d'extraction d'arrière-plan et les notifications ne fonctionnent pas dans toutes les situations

  • Lorsque je tue mon application le mode d'arrière-plan ne fonctionne pas

  • Lorsque mon application est au premier plan, le mode d'arrière-plan fonctionne, mais les notifications ne le font pas apparaissent

  • Quand je lance mon application en arrière-plan, tout fonctionne bien

Voici mon code:

La méthode que je veux courir chaque fois (toutes les minutes):

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) 
    } 
} 

Les autres méthodes:

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

voir ce https://stackoverflow.com/questions/17044373/local-notification-in-foreground pour votre question pourquoi les notifications ne sont pas affichées lorsque votre application est au premier plan (car l'application doit afficher la notification elle-même) –

+0

Aucune réponse pour l'application situation terminée? – Ben

+0

Avez-vous lu ceci: https://blog.newrelic.com/2016/01/13/ios9-background-execution/? –

Répondre

0

bien que ce soit une vieille question que je suis maintenant une bonne réponse sur un même problème, voir the answer from Rob

Ceci est une réponse possible pourquoi votre mode d'arrière-plan ne fonctionne pas lorsque vous tuez votre application et même un indice sur la façon de tester cela.

L'autre question est déjà répondu dans les commentaires:

voir ce stackoverflow.com/questions/17044373/... pour votre question de savoir pourquoi les notifications ne sont pas affichées lorsque votre application est au premier plan (parce que l'application ont pour afficher la notification elle-même) - données cosmos Jan 13 à 10:49