Firebase-Nachricht mit hoher Priorität, die das Gerät von Doze android 6+ nicht aufweckt

9

Ich habe mein Projekt von der Verwendung von GCM für die Verwendung von Firebase migriert. Die Push-Benachrichtigung kommt durch, wenn das Gerät gerade wach ist oder kürzlich geschlafen hat, aber wenn ich das Gerät für etwa eine Stunde belasse, wird kein Push gesendet, bis ich das Gerät aufwecke.

Die Android-Dokumentation besagt, dass Sie FireBase mit Priorität auf "hoch" setzen müssen, wenn Sie ein Gerät zum Senden einer Nachricht aufwecken müssen. Es besagt auch, dass Geräte-Admin-Apps keinen Doze-Einschränkungen unterliegen, meine App ist eine Geräte-Admin-App.

Ich dachte, ich würde erwähnen, dass ich bei der Migration des Projekts von GCM zu FCM nur den Paketnamen in der Firebase-Konsole und nicht den Fingerabdruck angegeben habe.

Was ich versucht habe.

1) Setzen Sie die Priorität auf hoch

%Vor%

Die Zeit zu leben ist so eingestellt, dass die Nachricht letztendlich ankommt. delay_while_idle ist auf false gesetzt, dies wird von FCM nach dem September 2016 ignoriert.

2) Geräte-Admin-Apps unterliegen nicht Doze, meine ist eine Geräte-Admin-App, aber ich habe die App auch explizit zur Doze-Whitelist hinzugefügt, die unter Setting - & gt; Batterie - & gt; Optimierung. Dies wurde manuell über die Einstellungen App und nicht programmgesteuert im Code durchgeführt.

Ich habe mein Gerät verlassen, um für 3 Stunden schlafen zu gehen und keinen Push durchzukommen. Ich habe auch adb verwendet, um das Gerät in Doze zu setzen. Wenn adb das Gerät in Doze setzt, wird kein Push empfangen, wenn adb das Gerät aus Doze herausnimmt, kommt der Push durch.

weitere Gedanken habe ich nicht ausprobiert.

Meine Pushs sind Datennachrichten. Dies liegt daran, dass ich nicht möchte, dass der Push in die Benachrichtigungsleiste auf dem Gerät gelangt und der Benutzer darauf klicken muss, um die Funktionalität auszuführen. Der Benutzer hat keine Interaktion mit der Geräte-Admin-App. Eine Datennachricht wird also von

verarbeitet %Vor%

Ich glaube, dass Benachrichtigungsnachrichten das Gerät aufwecken, was ich brauche, aber ich möchte, dass die App den Push behandelt, nicht der Benutzer. Könnte ich Nachrichten haben, die sowohl Benachrichtigung als auch Daten sind, aber onMessageRecievied die Funktionalität behandeln?

Hat irgendjemand Ähnliches erfahren oder irgendwelche Lösungen dazu gefunden?

[EDIT1] Ich habe den folgenden Link gefunden, der besagt, dass Sie eine Nachricht senden können, die sowohl Benachrichtigungen als auch Daten enthält. Wenn sich die App jedoch im Hintergrund befindet, wird die Benachrichtigung angezeigt, aber die Daten werden nur ausgeführt, wenn der Benutzer auf die Benachrichtigung klickt. Dies ist nicht das, was ich möchte, da ich möchte, dass die Daten sofort in onMessageRecived ausgeführt werden.

Benachrichtigung mit Daten

[EDIT2] Ich habe den folgenden Code und die Erlaubnis zur App hinzugefügt. Die App fordert den Nutzer nun auf, die App für Doze auf die weiße Liste zu setzen, also habe ich auf "Ja" geklickt. Ich habe dann über adb das Gerät in Doze gesteckt und einen Push gesendet. Es kam nichts durch, bis ich das Gerät wieder aus dem Schlafmodus nahm. Das funktioniert leider nicht.

%Vor%

[EDIT3]

Ich habe weitere Tests durchgeführt, um das Problem zu isolieren und meinen Webanwendungscode aus der Gleichung zu nehmen. Ich habe das Gerät in Doze über adb und die verwendete FireBase-Konsole, um den Push stattdessen zu senden. Die Push-Funktion wurde ordnungsgemäß ausgeführt. Dies weist darauf hin, dass ein Problem mit meinem Webanwendungscode vorliegt, der alle Push-Informationen an den fcm-Endpunkt sendet. Ich werde den Code heute Abend bekommen und später posten.

[EDIT4] Ich habe gerade noch mehr Tests gemacht. Ich legte das Gerät in den Schlafmodus und verwendete dann die FireBase-Konsole, um eine Datennachricht mit zwei Schlüssel / Wert-Paaren zu senden. Wenn sich das Gerät in Doze befindet und sich die App im Vordergrund befindet (auf dem Bildschirm), wird der Push ausgeführt und onMessageReceived ausgeführt. Das ist toll. Wenn sich die App jedoch in der BG befindet, wird nur eine Benachrichtigung angezeigt. Ich verstehe, dass aus den Dokumenten die Datennachrichten über einen Intent an die Launcher-Aktivität gesendet werden, aber meine Launcher-App die Pushs nicht behandelt. Die Klasse, die die Pushs behandelt, heißt MyAndroidFirebaseMsgService und erweitert FirebaseMessagingService.

Muss ich die Absicht an diese Klasse weiterleiten, wenn die App in der BG ist? Scheint ein bisschen Starge zu haben, dies zu tun. In GCM war das nie der Fall.

Außerdem möchte ich nicht, dass die App von einem Push startet, da dies sehr invasiv ist, da der Gerätebenutzer eine andere App verwenden könnte. Meine App ist auch eine Geräteadministrations-App. In 99% der Fälle gibt es keine Benutzerinteraktion, sondern nur ein Client, der Richtlinien auf dem Gerät ausführt.

[edit5]

%Vor%

Danke

    
turtleboy 25.01.2018, 20:54
quelle

2 Antworten

1

Während ich an einer Anwendung arbeite, stehe ich auch an diesem Punkt fest. Dann habe ich auf Github ein Problem gefunden, das mein Problem gelöst hat. Das heißt,

  

Auf Geräten mit Android 6.0+ beendet der Doze-Modus den gesamten Hintergrund   Verbindungen, wenn das Telefon im Leerlauf ist und nicht geladen wird, einschließlich   die Hintergrundverbindung zu Pushy.

     

Sobald das Gerät vom Benutzer bewegt oder geweckt wird, Hintergrund   Verbindungen wiederhergestellt werden und alle ausstehenden Benachrichtigungen werden   innerhalb von Sekunden geliefert, sofern sie noch nicht abgelaufen sind.

     

Um Benachrichtigungen im Doze-Modus an Geräte zu senden, kann Ihre App dies melden   die Berechtigung REQUEST_IGNORE_BATTERY_OPTIMIZATIONS in ihrer    AndroidManifest.xml und zeigt einen Systemdialog an, zu dem Benutzer aufgefordert werden   Whitelist Ihre App von Akku-Optimierungen, ohne die App zu verlassen.

     

Dadurch wird die Hintergrundverbindung zu Pushy wirksam beibehalten   und Geräte können sogar im Doze-Modus Benachrichtigungen empfangen.

Sie können dieses Problem hier Ссылка

überprüfen

Hoffe es hilft dir!

    
Heisen-Berg 30.01.2018 11:44
quelle
1

Sie können nichts tun.

Dies ist ein bekanntes Problem, das durch eine von einigen OEMs (wie Meizu oder Asus) implementierte Batterieoptimierung verursacht wird. Wenn eine App im App-Switcher entfernt wird, wird die Anwendung so behandelt, als ob Force gestoppt wäre, was nicht das Standardverhalten von Android ist. Der unglückliche Nebeneffekt davon ist, dass der FCM-Dienst für Ihre App nicht mehr ausgeführt werden kann. Ein ähnlicher Effekt kann bei Nachrichten mit hoher Priorität im Doze-Modus verursacht werden.

Das Firebase-Team arbeitet daran, dieses Verhalten von seinem Ende her zu verbessern, aber das eigentliche Update muss von der OEM-Seite kommen.

Eine Möglichkeit, zu überprüfen, ob Ihre App von der Batteriemanagementfunktion eines OEMs betroffen ist, finden Sie unten:

1) Schließen Sie das OEM-Gerät an adb an

2) Führen Sie Ihre App auf dem Gerät aus

3) Wischen Sie die App vom letzten Bildschirm des Geräts weg

4) Befehl ausführen: adb shell dumpsys Paket MY-PACKAGE | grep gestoppt

Wenn stopped = true angezeigt wird, kann davon ausgegangen werden, dass der OEM über einen solchen Mechanismus verfügt und dass Ihre App davon betroffen ist.

    
Kuva 02.02.2018 15:25
quelle