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/...を見ます通知自体を表示する) - データコスモスJan 13 at 10:49

関連する問題