33

मैं एक जीसीएम मुद्दे के बारे में कई पोस्ट पढ़ रहा हूं जो कुछ लोगों को प्रभावित करता है। ऐसा लगता है कि कुछ उपकरणों/राउटर/वाहक में अधिसूचनाओं में देरी होती है। मैंने अपने राउटर के साथ इस मुद्दे का अनुभव किया है: संदेश वाईफ़ाई पर बहुत देरी के साथ आया था लेकिन जब मैंने वाईफ़ाई को अक्षम किया और मोबाइल नेट से कनेक्ट किया तो तुरंत आया।एंड्रॉइड जीसीएम संदेशों में देरी से बचने/दिल की धड़कन को बदलने से कैसे बचें

ऐसा लगता है कि एंड्रॉइड ऐप से एक कामकाज किया जा सकता है। जीबीएम कनेक्शन को जीवित रखने वाले दिल की धड़कन को बढ़ाने की तरह कुछ, या ऐसा।

क्या कोई हमें बता सकता है कि देरी से बचने के लिए हमें क्या करना चाहिए? हम एंड्रॉइड ऐप से जीसीएम के साथ कनेक्शन कैसे रख सकते हैं? एक कोड उदाहरण (और कहां और इसका उपयोग कैसे करें) वास्तव में सहायक होगा।

This post समस्या बताता है। यह कहता है कि "हम जीसीएम सर्वर से हर दो मिनट में एक पिंग के साथ कनेक्शन को जीवित रख सकते हैं (जो मुफ़्त है)"। हम वह कैसे कर सकते है?

धन्यवाद एक बहुत


निम्न एप्लिकेशन चाल करने के लिए लग रहे हैं। हैरानी की बात है, पहले एक किसी भी अनुमति की जरूरत नहीं है, दूसरा एक इंटरनेट कनेक्शन और तीसरा केवल जड़ें फोन के लिए है:

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

उत्तर

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?

आप अपने सर्वर से जीसीएम संदेश भेजकर ऐसा कर सकते हैं, जिस पर आप इस पिंग को करना चाहते हैं। आप उस संदेश में कुछ विशेष पेलोड डाल सकते हैं जिसे डिवाइस पर ऐप द्वारा चुपचाप संसाधित किया जाएगा (और कोई अधिसूचना प्रदर्शित नहीं)। हालांकि, इस तरह के पिंग इस ऐप का उपयोग करने वाले उपकरणों के बैटरी जीवन को कम कर देंगे।

+0

धन्यवाद Eran की प्राथमिकता निर्धारित कर सकते हैं। हम ऐसा नहीं कर सकते क्योंकि हमें बहुत सारी सूचनाएं भेजनी होंगी - हमारे पास लाखों पंजीकृत डिवाइस हैं। क्या हम डिवाइस से "पिंग" कर सकते हैं (एंड्रॉइड ऐप से)? –

+1

@FerranMaylinch यह संभव हो सकता है। मैंने कभी डिवाइस से अधिसूचना भेजने की कोशिश नहीं की है, लेकिन ऐसा कोई कारण नहीं है कि इसे काम नहीं करना चाहिए (सभी डिवाइस के पास अपनी पंजीकरण आईडी है और इसे केवल जीसीएम सर्वर पर HTTP अनुरोध पोस्ट करना है) । इसके साथ एकमात्र समस्या यह है कि यह केवल तभी काम करेगा जब ऐप चल रहा हो। – Eran

10

जीसीएम सर्वर से दिल में दिल की धड़कन भेजने की कोई ज़रूरत नहीं है, आप एंड्रॉइड को दिल की धड़कन भेजने के लिए मजबूर कर सकते हैं जितनी जल्दी यह अन्यथा करेगा।

मैं पुश सूचनाएं फिक्सर एप्लिकेशन है, जो मैं परीक्षण किया है और मेरे लिए काम किया है पर एक नज़र था, और यह तुम सब करने की निम्नलिखित उद्देश्यों को प्रसारित किया जाता है की जरूरत है लगता है:

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

मुझे यकीन है कि क्यों नहीं कर रहा हूँ यह दोनों भेज रहा है, आप केवल एक कोशिश कर सकते हैं और देख सकते हैं कि यह चाल है या नहीं। ऐप का लिंक यहां है (मैं डेवलपर नहीं हूं): https://play.google.com/store/apps/details?id=com.andqlimax.pushfixer.noroot

36

मैं इसे पहले उत्तर में एक टिप्पणी के रूप में रखूंगा लेकिन मेरे पास पर्याप्त प्रतिष्ठा नहीं है।

मेरे पास एक समान समस्या थी और मैंने इसे अपने webservice को कॉल करने से पहले नीचे दिए गए कोड को निष्पादित करने का हल किया।

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

आशा है कि यह आपकी मदद करे!

+1

मैं कोड GcmBroadcastReceiver से ऊपर कहां जोड़ सकता हूं? – sasikumar

+0

कहीं भी आपके पास संदर्भ ऑब्जेक्ट (एप्लिकेशन, गतिविधि, सेवा) तक पहुंच है। उदाहरण के लिए, यदि आप इसे अपनी गतिविधि के अंदर उपयोग करते हैं तो बस getContext() पर कॉल करें और उपरोक्त कोड का उपयोग करें। –

+0

ठीक है धन्यवाद, यह ठीक काम करता है – sasikumar

2

एक वैकल्पिक समाधान आप जड़ अनुमतियाँ यदि - आप की जाँच करें और GCM दिल की धड़कन बार मैन्युअल रूप से बदल सकते हैं। डिफ़ॉल्ट 900000 (15 मिनट) है।मैं सुरक्षित होने के लिए 240000 (4 मिनट) पर सेट करता हूं और 5 मिनट राउटर टाइमआउट से बचता हूं।

चेक दिल की धड़कन समय (शेल)

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';" 

दिल की धड़कन बदलें समय (शेल)

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' 

दिल की धड़कन बदलें समय (एंड्रॉयड)

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(); 
1

यह नहीं है कि आप पुश कैसे प्राप्त करते हैं, यह इस बारे में है कि आप इसे कैसे भेजते हैं।

आप संदेश को "उच्च" (अपने सर्वर से जहां धक्का भेजने के लिए,)

https://developers.google.com/cloud-messaging/concept-options#setting-the-priority-of-a-message

+0

यह मेरे लिए काम करता है, और ऐसा लगता है कि एफसीएम पर भी लागू होता है, मुझे लगता है कि अन्य उत्तरों पुराने हैं? – JMK

संबंधित मुद्दे