webentwicklung-frage-antwort-db.com.de

iOS11 Swift Silent Push (Hintergrundabruf, didReceiveRemoteNotification) funktioniert nicht mehr

Ich hatte gehofft, dass die iOS11-Version das Silent-Push-Problem beheben wird, das in der neuesten Betas- und GM -Version von iOS enthalten war.

Momentan habe ich Schwierigkeiten zu verstehen, warum ich keine stillen Push-Nachrichten bekomme, die meine App tatsächlich aufwecken sollten, um einige erforderliche Aufgaben im Hintergrund auszuführen.

In iOS 10 verwende ich nur die Hintergrundabruf-Funktion und implementierte den 'Wake-Up-Code' in meinem AppDelegate wie im folgenden Code.

In iOS 11 funktioniert der Registrierungscode weiterhin einwandfrei, und mein Backend übermittelt die Push-Benachrichtigung auch an Apples DEV-Server (Sandbox) und auch an die PROD-Server (Produktionsversion). Leider wird die Funktion func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) nie von den stillen Push-Benachrichtigungen aufgerufen.

Habe ich hier eigentlich etwas für iOS 11 vermisst?


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

  // .. some variables here ...

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

       // register silent Push notification in backend
       application.registerForRemoteNotifications()

       // ... some code here ... 


       // Set Background Fetch Intervall for background services / terminated app
       UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum)

       // ... some code here ... 

       return true
   }

   func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
       let tokenParts = deviceToken.map { data -> String in
           return String(format: "%02.2hhx", data)
       }
       let token = tokenParts.joined()
       logger.log.debug("Device Token: \(token)")

       let realm = RealmController()
       let user = realm.getLoggedInUserObject()

       // Send Push token to server
       if let user = user {
           let email = user.email!

           let serverController = ServerController.serverController
           serverController.sendPushToken(token: token, email: email) { status in
               if status == 201 {
                // ... some code here ...
               } else {
               // ... some code here ...
               }
           }
       }
   }
   func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
       logger.log.debug(error)
   }
   func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
       logger.log.debug(userInfo)

       let aps = userInfo["aps"] as! [String: AnyObject]
       if aps["content-available"] as? Int == 1 {
          // .... some silent Push tasks here ....
       }
   }
}
8
AlexWoe89

Final UPDATE 2017-10-31

Apple hatte gerade seine offizielle (Halloween) Version von iOS 11.1

 Apple Release Software Update 31st of October

UPDATE 2017-10-09

Apple hat heute die iOS11.1 Beta 2 veröffentlicht. Wieder erwähnten sie in ihren Versionshinweisen die folgende Anmerkung:

Behobene Probleme mit Benachrichtigungen 

Silent Push-Benachrichtigungen werden häufiger verarbeitet. (33278611)

Ich werde diese Beta-2-Version erneut testen und diese Antwort zu Ihrer Information aktualisieren.

UPDATE - Testing -> Nach einigen Tests mit verschiedenen Szenarien scheint dieser Fehler in der neuesten Beta-Version 2 von iOS11.1 behoben zu sein. Jetzt können wir nur noch auf die offizielle Veröffentlichung warten. In einigen Foren gehen sie davon aus, dass Apple Ende Oktober iOS11.1 veröffentlichen wird. 


Älterer Eintrag

Ich habe in der letzten Woche viel Zeit gesucht, um nach einer Antwort zu diesem Thema zu suchen. Nach dem Lesen der Apple-Versionshinweise (einschließlich der veralteten, geänderten und neuen Funktionen) habe ich folgende Situation getestet:

Ich habe die leere Funktion zu meiner AppDelegatehinzugefügt und jetzt funktioniert der Silent Push wieder sowohl im Vordergrund als auch im Hintergrund:

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        logger.log.debug("Perform Fetch with completion handler TEST")
    }

Ich bin nicht sicher, ob diese "Problemumgehung" mit dem Problem zusammenhängt, dass die folgende function application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) in iOS11 nicht aufgerufen wird.

Trotzdem können Sie es versuchen und mir ein Feedback geben, wenn Sie dasselbe Verhalten feststellen.

UPDATE 2017-09-25 

Der 'Silent Push' funktioniert jetzt in meinem Fall im Vordergrund- und Hintergrundmodus, jedoch nicht, wenn die App entweder vom Benutzer oder vom Betriebssystem angehalten wird. Dieses Problem ist also noch offen und nicht behoben - jede Hilfe wird geschätzt! Weitere Informationen finden Sie in diesem Thread: Stille Pushs, die auf iOS 11 nicht an die App geliefert werden


UPDATE 2017-10-05

Apple hat vor einigen Tagen die iOS11.1-Beta veröffentlicht. Sie erwähnten in ihren Versionshinweisen Folgendes:

Behobene Probleme mit Benachrichtigungen
Silent Push-Benachrichtigungen werden häufiger verarbeitet. (33278611)

Einige Entwickler sagen, dass das Problem mit dieser Betaversion behoben wurde, andere Entwickler sagen, dass das Problem unter bestimmten Umständen noch vorhanden ist. Nun wäre es interessant, wenn Apple iOS11.1 für die Kunden einführt. 

5
AlexWoe89

Was Sie erleben, ist eigentlich ein gut dokumentiertes Verhalten und kein Fehler. 

Apples Dokumentation sagt: "Das System behandelt unbeaufsichtigte Benachrichtigungen mit niedriger Priorität. Sie können sie verwenden, um den Inhalt Ihrer App zu aktualisieren, das System garantiert jedoch nicht deren Zustellung. Darüber hinaus können Sie stumme Benachrichtigungen übermitteln kann gedrosselt werden, wenn die Gesamtzahl zu hoch wird. Die tatsächliche Anzahl der vom System erlaubten stillen Benachrichtigungen hängt von den aktuellen Bedingungen ab. Versuchen Sie jedoch nicht, mehr als zwei oder drei stille Benachrichtigungen pro Stunde zu senden. "

Zusammenfassend kann nicht garantiert werden, dass eine unbeaufsichtigte Benachrichtigung die App aktiviert. Warum? Je öfter die App im Hintergrund auf dem Benutzergerät aufgeweckt wird, desto höher ist der Batterieverbrauch.

Laut der Aussage von IBM heißt es: "Mit dem Aufkommen von iOS 11 hat Apple Änderungen im Umgang mit bestimmten Arten von Push-Nachrichten vorgenommen. Dies wurde getan, um die Akkulaufzeit zu verbessern, kostet jedoch ein Benutzererlebnis, das wahrscheinlich ist Auswirkungen auf Ihre App. " Weitere Details finden Sie hier .

0
Yunlong Wang