33

Czytałem wiele postów dotyczących problemu z GCM, który dotyczy niektórych osób. Wygląda na to, że w niektórych urządzeniach/routerach/nośnikach powiadomienia są opóźnione. Doświadczyłem tego problemu z moim routerem: wiadomości przychodziły z dużym opóźnieniem na WIFI, ale pojawiały się natychmiast po wyłączeniu WIFI i połączeniu z siecią mobilną.Jak uniknąć opóźnień w wiadomościach GCM systemu Android/zmianie pulsu

Wygląda na obejście tego problemu, które można wykonać w aplikacji na Androida. Coś w rodzaju zwiększenia pulsu, które utrzymuje połączenie GCM przy życiu.

Czy ktoś może nam powiedzieć, co powinniśmy zrobić, aby uniknąć opóźnienia? Jak możemy utrzymać połączenie z GCM z aplikacji na Androida? Przykład kodu (i gdzie i jak go używać) byłby naprawdę pomocny.

This post wyjaśnia problem. Mówi, że "możemy utrzymywać połączenie przy życiu z pingem co dwie minuty z serwera GCM (który jest bezpłatny)". Jak możemy to zrobić?

Thanks a lot


następujące aplikacje wydają się rade. Niespodziewanie, pierwszy nie wymaga pozwolenia, drugi internet a trzeci jest tylko dla ukorzenionych telefonów:

https://play.google.com/store/apps/details?id=at.pansy.droid.gcmWifiFix

https://play.google.com/store/apps/details?id=com.elotro.pushheartbeat

https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer

Odpowiedz

1

"we could keep the connection alive with a ping every two minutes from the GCM server (which is free)". How can we do that?

Możesz to zrobić, wysyłając wiadomość GCM ze swojego serwera do wszystkich urządzeń, na których chcesz wykonać ping. Możesz umieścić w wiadomości specjalną ładunek, który będzie przetwarzany bezgłośnie przez aplikację na urządzeniu (i nie będzie wyświetlał żadnego powiadomienia). Jednak takie pingowanie skróci żywotność baterii urządzeń korzystających z tej aplikacji.

+0

Dzięki Eran. Nie możemy tego zrobić, ponieważ musielibyśmy wysłać zbyt wiele powiadomień - mamy miliony zarejestrowanych urządzeń. Czy możemy zrobić "ping" z urządzenia (z aplikacji na Androida)? –

+1

@FerranMaylinch To może być możliwe. Nigdy nie próbowałem wysyłać powiadomień z urządzenia do siebie, ale nie ma powodu, żeby to nie działało (w końcu urządzenie ma swój własny identyfikator rejestracyjny i wszystko, co musi zrobić, to wysłać żądanie HTTP do serwera GCM) . Jedynym problemem jest to, że działa tylko wtedy, gdy aplikacja jest uruchomiona. – Eran

10

Nie trzeba wysyłać pulsu z serwera GCM do telefonu, możesz zmusić Androida do wysyłania pulsu szybciej, niż zrobiłby to w przeciwnym razie.

musiałem spojrzeć na powiadomienia push Fixer aplikacji, które testowane i pracował dla mnie, i wydaje się, wszystko co musisz zrobić, to nadawane następujące metody:

com.google.android.intent.action.MCS_HEARTBEAT 
com.google.android.intent.action.GTALK_HEARTBEAT 

Nie jestem pewien, dlaczego wysyła oba, możesz wypróbować tylko jedną i sprawdzić, czy to wystarczy. Oto link do aplikacji (nie jestem programistą): https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer.noroot

36

Powiedziałbym to jako komentarz w pierwszej odpowiedzi, ale nie mam wystarczającej reputacji.

Miałem podobny problem i rozwiązałem go, wykonując poniższy kod przed wywołaniem mojej usługi internetowej.

context.sendBroadcast(new Intent("com.google.android.intent.action.GTALK_HEARTBEAT")); 
context.sendBroadcast(new Intent("com.google.android.intent.action.MCS_HEARTBEAT")); 

Mam nadzieję, że Ci to pomoże!

+1

gdzie mogę dodać powyższy kod GcmBroadcastReceiver? – sasikumar

+0

Wszędzie, gdzie masz dostęp do obiektu kontekstowego (aplikacja, działanie, serwis). Na przykład, jeśli używasz go wewnątrz swojej działalności, po prostu wywołaj getContext() i użyj powyższego kodu. –

+0

ok dzięki ,, działa dobrze – sasikumar

2

Alternatywnym rozwiązaniem jeśli masz uprawnienia roota - Można sprawdzić i zmienić ręcznie razy GCM serca. Wartością domyślną jest 900000 (15 minut).Ustawiłem na 240000 (4 minuty), aby być bezpiecznym i uniknąć 5-minutowych przekroczeń czasu routera.

czas Sprawdź tętno (shell)

adb shell 
su 
sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "SELECT * FROM main WHERE name ='gtalk_max_server_heartbeat_time';" 
sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "SELECT * FROM main WHERE name LIKE 'gtalk_%heartbeat_ping_interval_ms';" 

czas zmiany pulsu (shell)

sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "UPDATE main SET value = '240000' WHERE name = 'gtalk_max_server_heartbeat_time' 
sqlite3 /data/data/com.google.android.gsf/databases/gservices.db "UPDATE main SET value = '240000' WHERE name LIKE 'gtalk_%heartbeat_ping_interval_ms' 

czas zmiany pulsu (Android)

Process proc = Runtime.getRuntime().exec("su"); 
DataOutputStream os = new DataOutputStream(proc.getOutputStream()); 
os.writeBytes("sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \"UPDATE main SET value = '240000' WHERE name = 'gtalk_max_server_heartbeat_time'\"\n"); 
os.writeBytes("sqlite3 /data/data/com.google.android.gsf/databases/gservices.db \"UPDATE main SET value = '240000' WHERE name LIKE 'gtalk_%heartbeat_ping_interval_ms'\"\n"); 
os.writeBytes("exit\n"); 
os.writeBytes("exit\n"); 
os.flush(); 
os.close(); 
proc.waitFor(); 
Powiązane problemy