java - फायरबेस कंसोल की बजाय जावा से फायरबेस क्लाउड मैसेजिंग अधिसूचना




firebase firebase-cloud-messaging (6)

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

क्लाइंट ऐप के लिए, मैंने निम्न कार्य किया:

  1. यहां से क्लोन फायरबेस messaging क्विकस्टार्ट ऐप - https://github.com/firebase/quickstart-android/tree/master/messaging - जो पहले से ही फ़ायरबेस निर्भरताओं और ऐसे के साथ सेटअप है। Android Studio में क्लोन ऐप लोड किया गया।
  2. फायरबेस कंसोल का उपयोग करके, My Notification Client नामक एक नई परियोजना बनाई गई और एंड्रॉइड ऐप के पैकेज नाम के रूप में com.google.firebase.quickstart.fcm का उपयोग करके एक ऐप जोड़ा गया।
  3. एंड्रॉइड ऐप के लिए डाउनलोड की गई google-services.json फ़ाइल को नव निर्मित प्रोजेक्ट में जोड़ा गया है और इसे messaging/app/ फ़ोल्डर में कॉपी किया गया है और Android Studio भीतर से ग्रेड फाइलों के साथ सिंक किया गया है।
  4. एक एमुलेटर बनाया और Android Studio भीतर से ऐप चलाया। जब एमुलेटर में ऐप लोड हो गया, तो Android Studio में Android Studio Android Monitor टैब में क्लाइंट के फायरबेस टॉक को कैप्चर करने के लिए Log Token बटन पर क्लिक किया गया।
  5. फायरबेस कंसोल का उपयोग करके, नव निर्मित प्रोजेक्ट My Notification Client चयन किया गया, बाएं फलक से Notifications लिंक पर क्लिक किया गया, और पिछले चरण में कैप्चर किए गए फायरबेस टॉकन को चिपकाकर डिवाइस पर अधिसूचना भेजी।

यह बहुत अच्छा काम किया! अगला चरण एक अलग सरल जावा एप्लिकेशन (जो अंततः एक अधिसूचना सर्वर बन जाएगा) का उपयोग करना था ताकि फायरबेस कंसोल का उपयोग करने के बजाय क्लाइंट को अधिसूचना भेजी जा सके।

इसे पूरा करने के लिए, मैंने यहां उल्लिखित चरणों का पालन किया - https://firebase.google.com/docs/server/setup#prerequisites । विशेष रूप से, ये वे चरण हैं जिन्हें मैंने किया था:

  1. फायरबेस कंसोल में My Notification Server नामक एक नई परियोजना बनाई गई।
  2. फायरबेस कंसोल में Settings > Permissions का उपयोग करके, एक नया सेवा खाता बनाया और सेवा serviceAccountCredentials.json फ़ाइल डाउनलोड की।
  3. ग्रहण में एक नया मेवेन प्रोजेक्ट बनाया और pom.xml में निम्नलिखित निर्भरताओं को जोड़ा:
    <dependency>
      <groupId>com.google.gcm</groupId>
      <artifactId>gcm-server</artifactId>
      <version>1.0.0</version>
    </dependency>
    <dependency>
      <groupId>com.googlecode.json-simple</groupId>
      <artifactId>json-simple</artifactId>
      <version>1.1.1</version>
    </dependency>
    <dependency>
      <groupId>com.google.firebase</groupId>
      <artifactId>firebase-server-sdk</artifactId>
      <version>3.0.0</version>
    </dependency>
  1. फिर, मैंने com.google.android.gcm.sender.Sender को विस्तारित किया है। FCMSender बनाने के लिए FCMSender और नीचे दिखाए गए अनुसार नए एफसीएम एंडपॉइंट का उपयोग करने के लिए संरक्षित विधि getConnection(String url) ओवरराइड करें:

    class FCMSender extends Sender {
    
        public FCMSender(String key) {
            super(key);
        }
    
        @Override
        protected HttpURLConnection getConnection(String url) throws IOException {
            String fcmUrl = "https://fcm.googleapis.com/fcm/send";
            return (HttpURLConnection) new URL(fcmUrl).openConnection();
        }
    }
    
  2. मेरे जावा एप्लिकेशन की main() विधि इस तरह दिखती है:

    public static void main(String[] args) {
        // Obtain serverKey from Project Settings -> Cloud Messaging tab
        // for "My Notification Client" project in Firebase Console.
        String serverKey = <get_server_key_from_firebase_console>;
        Thread t = new Thread() {
            public void run(){ 
                try {
                    Sender sender = new FCMSender(serverKey);
                    Message message = new Message.Builder()
                                      .collapseKey("message")
                                      .timeToLive(3)
                                      .delayWhileIdle(true)
                                      .addData("message", "Notification from Java application");
                                      .build();  
    
                    // Use the same token(or registration id) that was earlier
                    // used to send the message to the client directly from
                    // Firebase Console's Notification tab.
                    Result result = sender.send(message,
                "APA91bFfIFjSCcSiJ111rbmkpnMkZY-Ej4RCpdBZFZN_mYgfHwFlx-M1UXS5FqDBcN8x1efrS2md8L9K_E9N21qB-PIHUqQwmF4p7Y3U-86nCGH7KNkZNjjz_P_qjcTR0TOrwXMh33vp",
                        1);
                    System.out.println("Result: " + result.toString());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            };
            t.start;
            try {
                t.join();
            }
            catch (InterruptedException iex) {
                iex.printStackTrace();
            }
        }
    

जब मैं जावा एप्लिकेशन चलाता हूं, तो मुझे MismatchSenderId त्रुटि मिलती है। मैंने नीचे दिखाए गए curl का उपयोग करके समस्या निवारण का प्रयास किया लेकिन एक ही त्रुटि मिली:

$ skey=<obtained_from_project_settings_cloud_messaging_tab_in_firebase_console>
$ curl -X POST --header "Authorization: key=$skey" \
  --Header "Content-Type: application/json" \
  https://fcm.googleapis.com/fcm/send \
  -d "{\"to\":\"APA91bFfIFjSCcSiJ111rbmkpnMkZY-Ej4RCpdBZFZN_mYgfHwFlx-M1UXS5FqDBcN8x1efrS2md8L9K_E9N21qB-PIHUqQwmF4p7Y3U-86nCGH7KNkZNjjz_P_qjcTR0TOrwXMh33vp\",\"data\":{\"message\":\"Yellow\"}}"

{"multicast_id":7391851081942579857,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MismatchSenderId"}]}

फायरबेस कंसोल में My Notification Server प्रोजेक्ट के लिए Project Settings > Cloud Messaging टैब पर सूचीबद्ध Server Key का उपयोग करने के बजाय, मैंने Project Number का उपयोग करने की कोशिश की लेकिन इससे InvalidRequestException: HTTP Status Code: 401 उत्पन्न InvalidRequestException: HTTP Status Code: 401

त्रुटि कोड के फायरबेस दस्तावेज़ इस बारे में MismatchSenderId बारे में कहते हैं:

बेमेल प्रेषक 200 + error:MismatchSenderId
एक पंजीकरण टोकन प्रेषकों के एक निश्चित समूह से जुड़ा हुआ है। जब कोई ग्राहक ऐप एफसीएम के लिए पंजीकरण करता है, तो उसे यह निर्दिष्ट करना होगा कि कौन से प्रेषकों को संदेश भेजने की अनुमति है। क्लाइंट ऐप में संदेश भेजते समय आपको उन प्रेषक आईडी में से एक का उपयोग करना चाहिए। यदि आप किसी भिन्न प्रेषक पर स्विच करते हैं, तो मौजूदा पंजीकरण टोकन काम नहीं करेंगे।

मैं यह नहीं समझ सका कि फायरबेस कंसोल में कहां / कैसे संदेश प्राप्त करने में सक्षम होने के लिए एंड्रॉइड ऐप (जिसे My Notification Client प्रोजेक्ट में जोड़ा गया था) को कॉन्फ़िगर कर सकते हैं।

इस मुद्दे पर किसी प्रकार की मदद की सराहना की जाएगी!


जावा से इस प्रेषण पुश अधिसूचनाओं का प्रयोग करें।

वसंत फ्रेमवर्क

अन्य परियोजनाओं की तुलना में न्यूनतम निर्भरताओं के साथ केवल 3 सरल वर्ग हैं।

https://github.com/AndreiD/testingpushnotifications

SERVER_API_KEY और Client_Token को प्रतिस्थापित करना याद रखें।


पर:

// Obtain serverKey from Project Settings -> Cloud Messaging tab // for "My Notification Server" project in Firebase Console. String serverKey = <get_server_key_from_firebase_console>;

आपको अपने एंड्रॉइड ऐप के लिए कुंजी प्राप्त करनी होगी।

और धन्यवाद, मैं ऐप के लिए नोटिफिकेशन भेजने / प्राप्त करने के लिए एक सेवा बनाने के लिए संघर्ष कर रहा था। अपने प्रश्न को देखा, इसे सही करने की कोशिश की, और मेरा निर्माण करने के लिए इस्तेमाल किया। आशा है कि यह आपकी मदद करेगा :)


मेरे पास बहुत ही समस्या थी, और यह भी जांचने के लिए आपके कोड का प्रयोग किया गया था कि क्या मेरे साथ कुछ गलत है या नहीं। यह पता चला है कि हमारे दोनों कोड सही थे। फायरबेस डॉक्स पर वर्णित समस्या बिल्कुल असाधारण है:

"बेमेल प्रेषक 200 + त्रुटि: MismatchSenderId एक पंजीकरण टोकन प्रेषकों के एक निश्चित समूह से जुड़ा हुआ है। जब कोई ग्राहक ऐप एफसीएम के लिए पंजीकरण करता है, तो उसे यह निर्दिष्ट करना होगा कि कौन से प्रेषकों को संदेश भेजने की अनुमति है। संदेश भेजने के दौरान आपको उन प्रेषक आईडी में से एक का उपयोग करना चाहिए क्लाइंट ऐप पर। यदि आप किसी भिन्न प्रेषक पर स्विच करते हैं, तो मौजूदा पंजीकरण टोकन काम नहीं करेंगे। "

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

बस अपने एंड्रॉइड प्रोजेक्ट पर इस वर्ग को बनाएं:

सार्वजनिक वर्ग NotificacaoRegistro FirebaseInstanceIdService {स्थिर निजी स्ट्रिंग TAG = "NOTIFICACAOREGISTRO" बढ़ाता है;

public NotificacaoRegistro(){
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
}
@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);
    // TODO: Implement this method to send any registration to your app's servers.

}

}

अपने AndroidManifest पर आवश्यक परिवर्तन करने के लिए मत भूलना

  <service
            android:name=".notificacoes.NotificacaoRegistro">
            <intent-filter>
                <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
            </intent-filter>
  </service>

यदि आपको केवल कोड की आवश्यकता है (उदाहरण के लिए, डिबगिंग के लिए) तो आप अपने ऑनएक्रेट विधि में केवल अपनी मुख्य गतिविधि पर कॉल कर सकते हैं

स्ट्रिंग रीफ्रेशेड टोकन = फायरबेस इंस्टेंस आईडी .getInstance ()। GetToken ();

लेकिन यह बेहतर है, अगर आप इसका सही ख्याल रखते हैं।

इस तरह आपको उस डिवाइस के लिए सही कुंजी मिल जाएगी। फिर अपने जावा एप्लिकेशन कोड पर

   Result result = sender.send(message,
            <PUT THE VALUE OF THE REFRESHED TOKEN HERE>,
                    1);

और आप सब तैयार हैं :)

उम्मीद है कि यह मदद करता है, और लंबे विलंब के बारे में खेद है :)

चियर्स


मैं एक ही मुद्दे में भाग रहा था। समस्या लाइन में थी:

String serverKey = <get_server_key_from_firebase_console>;

यह मान एंड्रॉइड ऐप प्रोजेक्ट से आना चाहिए; इस मामले में यह "मेरा अधिसूचना ग्राहक" होगा और "मेरा अधिसूचना सर्वर" नहीं होगा।


मैंने एक एफसीएमहेल्पर क्लास लिखा, जो ठीक काम करता है और उपयोग करने में आसान है।

यहां देखें https://github.com/MOSDEV82/fcmhelper


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

अपने ऐप सर्वर से अधिसूचना / संदेश अपने मोबाइल क्लाइंट को भेजने के लिए, आपको अपने स्वयं के HTTP और / या XMPP विधियों को लागू करने की आवश्यकता है। https://firebase.google.com/docs/cloud-messaging/ देखें

मेरा परीक्षण कोड, HTTP का उपयोग कर:

public CompletableFuture<String> fcmTest1() {
    // https://firebase.google.com/docs/cloud-messaging/http-server-ref
    String host = "fcm.googleapis.com";
    String requestURI = "/fcm/send";
    String CLIENT_TOKEN = "ASK_YOUR_MOBILE_CLIENT_DEV"; // https://developers.google.com/instance-id/

    CompletableFuture<String> fut = new CompletableFuture<>();
    JsonObject body = new JsonObject();
    // JsonArray registration_ids = new JsonArray();
    // body.put("registration_ids", registration_ids);
    body.put("to", CLIENT_TOKEN);
    body.put("priority", "high");
    // body.put("dry_run", true);

    JsonObject notification = new JsonObject();
    notification.put("body", "body string here");
    notification.put("title", "title string here");
    // notification.put("icon", "myicon");

    JsonObject data = new JsonObject();
    data.put("key1", "value1");
    data.put("key2", "value2");

    body.put("notification", notification);
    body.put("data", data);

    HttpClientRequest hcr = httpsClient.post(443, host, requestURI).handler(response -> {
        response.bodyHandler(buffer -> {
            logger.debug("FcmTest1 rcvd: {}, {}", response.statusCode(), buffer.toString());
            if (response.statusCode() == 200) {
                fut.complete(buffer.toString());
            } else {
                fut.completeExceptionally(new RuntimeException(buffer.toString()));
            }
        });
    });
    hcr.putHeader("Authorization", "key=" + Utils.FIREBASE_SERVER_KEY)
        .putHeader("content-type", "application/json").end(body.encode());
    return fut;
}

नोट: http क्लाइंट और जेसन को वर्क्स ( http://vertx.io/ ) द्वारा प्रदान किया गया था, लेकिन उम्मीद है कि कोड दिखाता है कि क्या स्पष्ट हो रहा है ताकि आप जो चाहें उसका उपयोग कर सकें।





firebase-cloud-messaging