web-dev-qa-db-ja.com

XMPPまたはその他のスクリプトを使用せずにFCMを使用してデバイスからデバイスへの通知を送信する方法

1つのAndroidデバイスからFirebaseデータベースに接続されている別のデバイスにアップストリーム通知メッセージをFCM経由で送信する方法はありますか。

XMPPサーバーがアップストリームメッセージを受信し、他のデバイスに通知を送信できることを知っています。アップストリームAPIで送信されたメッセージを受信するには、XMPPサーバーを実装する必要がありますが、他の方法があります。

20

何度も試してみて、ようやく1つのソリューションとその機能を完全に手に入れました

ステップ1:2つのライブラリを含める

compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.google.firebase:firebase-messaging:9.2.0'

ステップ2:MainActivityまたは通知を送信する場所から

OkHttpClient mClient = new OkHttpClient();

String refreshedToken = "";//add your user refresh tokens who are logged in with firebase.

JSONArray jsonArray = new JSONArray();
jsonArray.put(refreshedToken);

ステップ3:すべてのデバイスに通知を送信する1つの非同期タスクを作成します。

public void sendMessage(final JSONArray recipients, final String title, final String body, final String icon, final String message) {

        new AsyncTask<String, String, String>() {
            @Override
            protected String doInBackground(String... params) {
                try {
                    JSONObject root = new JSONObject();
                    JSONObject notification = new JSONObject();
                    notification.put("body", body);
                    notification.put("title", title);
                    notification.put("icon", icon);

                    JSONObject data = new JSONObject();
                    data.put("message", message);
                    root.put("notification", notification);
                    root.put("data", data);
                    root.put("registration_ids", recipients);

                    String result = postToFCM(root.toString());
                    Log.d("Main Activity", "Result: " + result);
                    return result;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                try {
                    JSONObject resultJson = new JSONObject(result);
                    int success, failure;
                    success = resultJson.getInt("success");
                    failure = resultJson.getInt("failure");
                    Toast.makeText(MainActivity.this, "Message Success: " + success + "Message Failed: " + failure, Toast.LENGTH_LONG).show();
                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "Message Failed, Unknown error occurred.", Toast.LENGTH_LONG).show();
                }
            }
        }.execute();
    }

String postToFCM(String bodyString) throws IOException {



   public static final String FCM_MESSAGE_URL = "https://fcm.googleapis.com/fcm/send";
      final MediaType JSON
                = MediaType.parse("application/json; charset=utf-8");

        RequestBody body = RequestBody.create(JSON, bodyString);
        Request request = new Request.Builder()
                .url(Url.FCM_MESSAGE_URL)
                .post(body)
                .addHeader("Authorization", "key=" + "your server key")
                .build();
        Response response = mClient.newCall(request).execute();
        return response.body().string();
    }

ステップ4:ボタンのonclickを呼び出す

    btnSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sendMessage(jsonArray,"Hello","How r u","Http:\\google.com","My Name is Vishal");
        }
    });
0

1つのAndroidデバイスからFirebaseデータベースに接続された別のデバイスにFCMを介してアップストリーム通知メッセージを送信する方法はありますか?

現在、あるデバイスから別のデバイスにメッセージを直接送信することはできません。
(または、少なくとも、巨大なセキュリティ脆弱性を導入しないと不可能です:詳細は以下)

完全な詳細:

  1. ユーザーデバイスにメッセージを送信することは非常に深刻なアクションです!
    ペイロードに基づいて、メッセージはスパム、フィッシング、内部メソッドの実行を引き起こす可能性があります。
  2. この操作を信頼できるエンティティのみに許可する場合、FCM送信APIが認証ヘッダーにSERVER-API-KEYを必要とする理由です。
  3. アプリコードにSERVER-API-KEYを追加する(または他の方法でアプリに通信する)は安全ではありません。これは、apkの抽出、逆コンパイル、検査、エミュレーターでの実行、デバッグでの実行などが可能なためです。

今日これを実装する最良の方法:は2つのデバイスの間に何らかのサーバーを置くことです:

[DeviceA] -- please send message to B -->  [SERVER] -- fcmSendAPI --> [DeviceB]

サーバーは、PHPページ、またはより複雑なXMPP実装のようにシンプルにすることができます。

Node.jsの例は次の場所にあります。
Firebase DatabaseとCloud Messagingを備えたデバイス間で通知を送信

14
Diego Giorgini

最後に、信頼できるサーバースクリプトを自分で2か月間維持しようとして、突然 OneSignal を見つけました。完全に無料で、iOS、Android、WPおよびブラウザでのデバイス間プッシュメッセージをサポートしています。

希望、プロモーションスパムのフラ​​グは表示されませんが、 しかし、これは現在、完全に「バックエンドレス」になる唯一の(そして最も簡単な)方法です

また、完全に安全な方法です。ルールで保護されたFirebase Databaseに保存できる特別なOSユーザーIDを知らない限り、誰もプッシュを送信できません。

UPD:Firebaseに代わるものではありません。プッシュサービスのみがあり、他には何もありません

UPD2:Firebaseに関数が追加され、その使用例に送信FCMが含まれています。これで、他のサーバーやサービスは必要ありません。公式のサンプルで詳細をご覧ください https://github.com/firebase/functions-samples

3
Dima Rostopira