2014-04-25 8 views
15

मैं GoogleCloudMessaging.getInstance (संदर्भ) के साथ जीसीएम में पंजीकरण करता हूं; और डिवाइस पर प्राप्त टोकन बचाओ। फिर इसे सर्वर पर भेजें और यह उपयोगकर्ता खाते से जुड़ा हुआ है। अगर मैं लॉग आउट किए बिना अपने ऐप को अनइंस्टॉल करता हूं और फिर से इंस्टॉल करता हूं और किसी अन्य उपयोगकर्ता के साथ लॉग इन करता हूं, तो मुझे नया टोकन मिलता है और इसे सर्वर पर भेजता है। और जब पहली उपयोगकर्ता को भेजता है तो मैं उन्हें देखता हूं जब मैंने दूसरे उपयोगकर्ता के साथ लॉग इन किया था।एंड्रॉइड जीसीएम और एकाधिक टोकन

जीसीएम मुझे अलग टोकन क्यों भेजता है और मैं इसे कैसे संभाल सकता हूं?

+0

के संभावित डुप्लिकेट [वर्ष GCM टोकन एक स्थापना हटाने के बाद भी पर रहते हैं?] (http://stackoverflow.com/questions/17328654/do-old-gcm- टोकन-लाइव-ऑन-भी-बाद-एक-स्थापना रद्द करें) –

उत्तर

11

Google Cloud Messaging से डुप्लिकेट संदेशों की अद्भुत दुनिया में आपका स्वागत है। जब ऐसा होता है, तो GCM इंजन इसे हल करने के लिए Canonical IDs सक्षम करता है। ऐसा इसलिए हो सकता है क्योंकि आपने उसी डिवाइस के लिए कई आईडी के साथ पंजीकृत किया था, या क्योंकि GCM सर्वर को unregister() कॉल नहीं मिला था जब ऐप अनइंस्टॉल किया गया था। कैनोनिक आईडी का उपयोग करके आपकी आईडी आपके द्वारा बनाए गए अंतिम पंजीकरण के रूप में सेट हो जाएगी।

इस बारे में GCM reference के अनुसार:

विहित आईडी

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

जीसीएम इन स्थितियों से आसानी से पुनर्प्राप्त करने के लिए "कैननिकल पंजीकरण आईडी" नामक एक सुविधा प्रदान करता है। एक कैननिकल पंजीकरण आईडी को आपके आवेदन द्वारा अनुरोधित अंतिम पंजीकरण की आईडी माना जाता है। यह वह आईडी है जिसे डिवाइस को संदेश भेजते समय सर्वर का उपयोग करना चाहिए।

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

अधिक जानकारी here

इसके अलावा वहाँ कैसे procceed करने पर एक व्यावहारिक मामला है, यह सहायक हो सकती:

5

मैं पंजीकरण आईडी परिवर्तन अनुभव किया जब आवेदन की स्थापना रद्द करने, एप्लिकेशन को संदेश भेजने का प्रयास कर रहा जबकि यह अनइंस्टॉल किया गया है (जब तक मुझे NotRegistered त्रुटि नहीं मिलती) और फिर पुन: स्थापित करें।

गूगल suggests से कोस्टिन Manolache पंजीकरण आईडी परिवर्तन इस तरह से संभाल करने के लिए:

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

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

इसके अलावा, आपको अन्य उत्तरों में उल्लिखित अनुसार, अपने सर्वर में Google से कैनोलिक पंजीकरण आईडी प्रतिक्रियाएं संभालना चाहिए।

1

आप पंजीकरण आईडी के साथ एंड्रॉइड डिवाइस आईडी भेज सकते हैं। एंड्रॉइड डिवाइस आईडी अद्वितीय है और ऐप अनइंस्टॉल पुनर्स्थापित करने के दौरान वही बना रहता है और डिवाइस फ़ैक्टरी रीसेट होने पर ही बदलता है।

उदाहरण: के रूप में हम अलग-अलग डिवाइस पर भेजना कई उपकरणों के लिए How to get unique device hardware id in Android?

0

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

<?php 
//Define your GCM server key here 
define('API_ACCESS_KEY', 'your server api key'); 

//Function to send push notification to all 
function sendToAll($message) 
{ 
    $db = new DbOperation(); 
    $tokens = $db->getAllToken(); 
    $regTokens = array(); 
    while($row = $tokens->fetch_assoc()){ 
     array_push($regTokens,$row['token']); 
    } 
    sendNotification($regTokens,$message); 
} 


//function to send push notification to an individual 
function sendToOne($email,$message){ 
    $db = new DbOperation(); 
    $token = $db->getIndividualToken($email); 
    sendNotification(array($token),$message); 
} 


//This function will actually send the notification 
function sendNotification($registrationIds, $message) 
{ 
    $msg = array 
    (
     'message' => $message, 
     'title' => 'Android Push Notification using Google Cloud Messaging', 
     'subtitle' => 'www.simplifiedcoding.net', 
     'tickerText' => 'Ticker text here...Ticker text here...Ticker text here', 
     'vibrate' => 1, 
     'sound' => 1, 
     'largeIcon' => 'large_icon', 
     'smallIcon' => 'small_icon' 
    ); 

    $fields = array 
    (
     'registration_ids' => $registrationIds, 
     'data' => $msg 
    ); 

    $headers = array 
    (
     'Authorization: key=' . API_ACCESS_KEY, 
     'Content-Type: application/json' 
    ); 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, 'https://android.googleapis.com/gcm/send'); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); 
    $result = curl_exec($ch); 
    curl_close($ch); 

    $res = json_decode($result); 

    $flag = $res->success; 
    if($flag >= 1){ 
     header('Location: index.php?success'); 
    }else{ 
     header('Location: index.php?failure'); 
    } 
} 

ऊपर कोड हम mysql तालिका से पंजीकरण टोकन फ़ेच कर रहे हैं में है। सभी उपकरणों को भेजने के लिए हमें सभी टोकन की आवश्यकता है। और एक व्यक्तिगत डिवाइस भेजने के लिए हमें केवल उस डिवाइस के लिए टोकन की आवश्यकता है।

स्रोत: Google Cloud Messaging Example

0

पहले जब आप इसके साथ सूचना भेजें प्रयोक्ता आईडी भेजने के लिए और पूछना अगर sharedpreference == comming में आईडी या कोई

यदि आप सभी उपयोगकर्ताओं के लिए सूचनाएं भेजने और कुछ एक 2 सूचनाएं प्राप्त कर किया जा सकता है जबकि उसे केवल

अपने सर्वर पर फ़ाइल बनाएं और किसी भी संख्या के साथ 0 कहें तो जब आप अधिसूचना भेजना चाहते हैं तो इस numebr को इसके साथ भेजें, फिर इस नंबर पर + + नया नंबर होने के लिए जोड़ें। n हर नया एक

एंड्रॉयड आवेदन में के साथ एक ही अगले अधिसूचना चर जोड़ सकते हैं और इस चर = सर्वर से आ चर के बाद अधिसूचना जोड़ने लेकिन आप से पूछना चाहता if(number_in_your_service!=server_number) // अधिसूचना

किसी को भी जोड़ की जरूरत है सूचनाओं की संख्या आप बस एक दिखाई देगा भेज

public class GcmIntentService extends IntentService { 
    public static int openintent; 
    public static final int NOTIFICATION_ID = 1; 
    private static final String TAG = "GcmIntentService"; 

    private static String number_in_your_service="somethingneversend"; 
    NotificationCompat.Builder builder; 

    public GcmIntentService() { 
    super("GcmIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
    String messageType = gcm.getMessageType(intent); 

    if (!extras.isEmpty()) { // has effect of unparcelling Bundle 
     if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
     } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
     // If it's a regular GCM message, do some work. 
     } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
     // This loop represents the service doing some work. 
     for (int i = 0; i < 5; i++) { 
      Log.i(TAG, "Working... " + (i + 1) + "/5 @ " + SystemClock.elapsedRealtime()); 
      try { 
      Thread.sleep(100); 
      } catch (InterruptedException e) { 
      } 
     } 
     Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); 
     // Post notification of received message. 
     sendNotification(extras); 
     Log.i(TAG, "Received: " + extras.toString()); 
     } 
    } 
    // Release the wake lock provided by the WakefulBroadcastReceiver. 
    GcmBroadcastReceiver.completeWakefulIntent(intent); 
    } 

    private void sendNotification(Bundle extras) { 

    if((extras.getString("server_number")).equals(number_in_your_service)) { 

     Intent intent = new Intent(this, Main_Page_G.class); 
     intent.putExtra("frame",100); 
     intent.putExtra("bundle",extras); 
     final PendingIntent contentIntent = PendingIntent.getActivity(this, 
      120, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     NotificationManager mNotificationManager; 
     NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
      GcmIntentService.this).setContentTitle("name") 
      .setContentText("content") 
      .setDefaults(Notification.DEFAULT_SOUND) 
      .setContentInfo("Test") 
      .setSmallIcon(R.drawable.rehablogo2) 
      .setAutoCancel(true); 
     mBuilder.setContentIntent(contentIntent); 
     mNotificationManager = (NotificationManager) GcmIntentService.this 
      .getSystemService(Context.NOTIFICATION_SERVICE); 
     mNotificationManager.notify(id, mBuilder.build()); 
     id=Integer.parseInt(extras.getString("id")); 
    } 
    } 
} 
संबंधित मुद्दे