Firebaseコンソールを使用せずにFirebase Cloud Messaging通知を送信するにはどうすればよいですか?


200

通知用の新しいGoogleサービスから始めFirebase Cloud Messagingます。

このコードのおかげでhttps://github.com/firebase/quickstart-android/tree/master/messaging Firebase User ConsoleからAndroidデバイスに通知を送信できました。

Firebaseコンソールを使用せずに通知を送信するAPIまたは方法はありますか?たとえば、自分のサーバーから直接通知を作成するためのPHP APIなどです。


1
通知を送信するサーバーをどこでホストしていますか?
Rodrigo Ruiz、


@David Corral、同じことについて私の答えを確認してください。 stackoverflow.com/a/38992689/2122328
Sandeep_Devhare

FCM通知を送信するために、スプリングアプリを書かれていると、あなたはそれがどのように動作するか見たいINCASE - > github.com/aniket91/WebDynamo/blob/master/src/com/osfg/...
Aniketタクール

改造を使用して、デバイスにデバイスをメッセージングできます。stackoverflow.com/questions/37435750/...
eurosecom

回答:


218

Firebase Cloud Messagingには、メッセージを送信するために呼び出すことができるサーバー側APIがあります。https://firebase.google.com/docs/cloud-messaging/serverを参照してください

メッセージの送信はcurl、HTTPエンドポイントの呼び出しに使用するのと同じくらい簡単です。https://firebase.google.com/docs/cloud-messaging/server#implementing-http-connection-server-protocolご覧ください

curl -X POST --header "Authorization: key=<API_ACCESS_KEY>" \
    --Header "Content-Type: application/json" \
    https://fcm.googleapis.com/fcm/send \
    -d "{\"to\":\"<YOUR_DEVICE_ID_TOKEN>\",\"notification\":{\"body\":\"Yellow\"},\"priority\":10}"

4
iOSでデバイスIDを取得するにはどうすればよいですか?didRegisterForRemoteNotificationsWithDeviceToken deviceToken:NSDataで取得するデバイストークンですか、それともFIRInstanceID.instanceID()。token()で取得する長いトークンですか?
FelipeOliveira 2016年

3
フランク私は、プログレッシブウェブアプリにプッシュ通知を追加し、POstmanを使用してhttpリクエストを投稿するために、firebase docsおよびcodelabsのガイドに従いましたが、401エラーが発生し続けます。助言がありますか。Firebaseコンソールから直接サーバーキーをコピーしています。
jasan

25
特定のユーザーやトピックではなくすべてのユーザーに送信する方法
vinbhai4u

3
CURLスニペットを使った初期の試みの1つで、このエラーメッセージが返されました。フィールド "priority"はJSON番号である必要があります:10。最後の10から引用符を削除した後、機能しました。
albert cブラウン2016

2
@ vinbhai4u答えはわかりますか?私もそれにこだわっています。それをすべてのアプリケーションユーザーに送信する方法は?
Rohit

51

これはCURLを使用して動作します

function sendGCM($message, $id) {


    $url = 'https://fcm.googleapis.com/fcm/send';

    $fields = array (
            'registration_ids' => array (
                    $id
            ),
            'data' => array (
                    "message" => $message
            )
    );
    $fields = json_encode ( $fields );

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

    $ch = curl_init ();
    curl_setopt ( $ch, CURLOPT_URL, $url );
    curl_setopt ( $ch, CURLOPT_POST, true );
    curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );
    curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );

    $result = curl_exec ( $ch );
    echo $result;
    curl_close ( $ch );
}

?>

$message デバイスに送信するメッセージです

$idあるデバイス登録トークン

YOUR_KEY_HERE サーバーAPIキー(またはレガシーサーバーAPIキー)


Firebaseコンソールには、fcm.googleapis.com / fcm / sendへのプッシュメッセージングデータの保存はありませんか?
Mahmudul Haque Khan

1
デバイス登録IDを取得できる場所からブラウザーにプッシュ通知を送信するにはどうすればよいですか?
Amit Joshi

これは、私が取得しています長いテキストを、完璧に動作しますが{"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}。これを修正するにはどうすればよいですか?
Alisha Lamichhane、

@AlishaLamichhaneメッセージが4096バイトを超えていますか?そうでない場合は、メッセージをbase64エンコードできます(テキストに問題がある可能性があります)。4096バイトより大きい場合は、FCMの制限です。
Rik

47

サービスAPIを使用します。

URL: https://fcm.googleapis.com/fcm/send

メソッドタイプ: POST

ヘッダー:

Content-Type: application/json
Authorization: key=your api key

本体/ペイロード:

{ "notification": {
    "title": "Your Title",
    "text": "Your Text",
     "click_action": "OPEN_ACTIVITY_1" // should match to your intent filter
  },
    "data": {
    "keyname": "any value " //you can get this data as extras in your activity and this data is optional
    },
  "to" : "to_id(firebase refreshedToken)"
} 

これをアプリに追加すると、以下のコードをアクティビティに追加して呼び出すことができます。

<intent-filter>
    <action android:name="OPEN_ACTIVITY_1" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

また、アプリがバックグラウンドで実行されているときFirebase onMessageReceivedが呼び出されないので回答を確認してください


Ankit、特定のデバイスIDに送信できます。ただし、すべてに送信することはできません。"to" : "to_id(firebase refreshedToken)"デバイスIDの代わりに何を入れますか?"all"まったく機能していません。C#WebRequestを使用して通知を送信しています。@AshikurRahmanあなたの提案も歓迎します。私は3-4日以来、苦労して検索しています。
Ravimallya 2017

3
気にしないで。私は解決策を見つけました。to: "/ topics / all"はすべてのデバイスに通知を送信します。IOSのみをターゲットにしたい場合は、すべてをiosに置き換え、androidの場合は「android」に置き換えます。これらはデフォルトのトピックセットです。私は推測する。
Ravimallya 2017


詳細については、このブログ投稿を読む- > developine.com/...
Developine

@Ankit、こんにちは、ターゲットデバイスのIDを取得する方法を指定していただけますか?
Anand Raj

40

curlの使用例

特定のデバイスにメッセージを送信する

特定のデバイスにメッセージを送信するには、特定のアプリインスタンスの登録トークンをに設定します

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "data": { "score": "5x1","time": "15:10"},"to" : "<registration token>"}' https://fcm.googleapis.com/fcm/send

トピックにメッセージを送信する

ここでのトピックは:/ topics / foo-bar

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{ "to": "/topics/foo-bar","data": { "message": "This is a Firebase Cloud Messaging Topic Message!"}}' https://fcm.googleapis.com/fcm/send

デバイスグループにメッセージを送信する

デバイスグループへのメッセージの送信は、個々のデバイスへのメッセージの送信とよく似ています。toパラメータをデバイスグループの一意の通知キーに設定します

curl -H "Content-type: application/json" -H "Authorization:key=<Your Api key>"  -X POST -d '{"to": "<aUniqueKey>","data": {"hello": "This is a Firebase Cloud Messaging Device Group Message!"}}' https://fcm.googleapis.com/fcm/send

サービスAPIの使用例

API URL: https://fcm.googleapis.com/fcm/send

ヘッダー

Content-type: application/json
Authorization:key=<Your Api key>

リクエスト方法: POST

リクエストボディ

特定のデバイスへのメッセージ

{
  "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to": "<registration token>"
}

トピックスへのメッセージ

{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!"
  }
}

デバイスグループへのメッセージ

{
  "to": "<aUniqueKey>",
  "data": {
    "hello": "This is a Firebase Cloud Messaging Device Group Message!"
  }
}

エンドポイントURL fcm.googleapis.com/fcm/sendをどこで見つけました か。Firebaseのドキュメントに記載されている箇所はありませんか?
Utsav Gupta

1
これは
JR

@JRユーザーが受信者にメッセージを送信したときに受信者が通知メッセージを受信する必要があるチャットアプリケーションを作成しました。この場合、私はあなたの答えをどのように使用できますか?では、フィールドの値を "to"に指定するにはどうすればよいですか?
Anand Raj

@ Anad Rajが私の回答で「特定のデバイスにメッセージを送信する」を参照
JR

25

Frankが述べたように、Firebase Cloud Messaging(FCM)HTTP APIを使用して、独自のバックエンドからプッシュ通知をトリガーできます。しかし、あなたはできません

  1. FirebaseユーザーID(UID)に通知を送信し、
  2. ユーザーセグメントに通知を送信します(ユーザーコンソールで行うことができるようなターゲットプロパティとイベント)。

意味:FCM / GCM登録ID(プッシュトークン)を自分で保存するか、FCMトピックを使用してユーザーをサブスクライブする必要があります。また、FCMはFirebase Notificationsの APIではなく、スケジュールやオープンレートの分析を行わない低レベルのAPIであることにも注意してください。Firebase NotificationsはFCMの上に構築されています。


6

最初にAndroidからトークンを取得する必要があります。次に、このphpコードを呼び出して、アプリでさらにアクションを実行するためにデータを送信することもできます。

 <?php

// Call .php?Action=M&t=title&m=message&r=token
$action=$_GET["Action"];


switch ($action) {
    Case "M":
         $r=$_GET["r"];
        $t=$_GET["t"];
        $m=$_GET["m"];

        $j=json_decode(notify($r, $t, $m));

        $succ=0;
        $fail=0;

        $succ=$j->{'success'};
        $fail=$j->{'failure'};

        print "Success: " . $succ . "<br>";
        print "Fail   : " . $fail . "<br>";

        break;


default:
        print json_encode ("Error: Function not defined ->" . $action);
}

function notify ($r, $t, $m)
    {
    // API access key from Google API's Console
        if (!defined('API_ACCESS_KEY')) define( 'API_ACCESS_KEY', 'Insert here' );
        $tokenarray = array($r);
        // prep the bundle
        $msg = array
        (
            'title'     => $t,
            'message'     => $m,
           'MyKey1'       => 'MyData1',
            'MyKey2'       => 'MyData2', 

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

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

        $ch = curl_init();
        curl_setopt( $ch,CURLOPT_URL, 'fcm.googleapis.com/fcm/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 );
        return $result;
    }


?>


2

FCM HTTP v1 APIエンドポイントを使用して、通知またはデータメッセージをFirebaseベースのクラウドメッセージングサーバーに送信できます。 https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send

Firebase consoleを使用してサービスアカウントの秘密鍵を生成およびダウンロードし、google apiクライアントライブラリを使用してアクセスキーを生成する必要があります。任意のhttpライブラリを使用してメッセージをエンドポイントの上に投稿します。下のコードはOkHTTPを使用してメッセージを投稿することを示しています。FCMトピックの例を使用してFirebase Cloud Messagingで複数のクライアントにメッセージを送信し、サーバー側とクライアント側の完全なコードを見つけることができます

特定のクライアントメッセージを送信する必要がある場合は、クライアントのFirebase登録キーを取得する必要があります。クライアントまたはデバイス固有のメッセージをFCMサーバーに送信する例をご覧ください。

String SCOPE = "https://www.googleapis.com/auth/firebase.messaging";
String FCM_ENDPOINT
     = "https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send";

GoogleCredential googleCredential = GoogleCredential
    .fromStream(new FileInputStream("firebase-private-key.json"))
    .createScoped(Arrays.asList(SCOPE));
googleCredential.refreshToken();
String token = googleCredential.getAccessToken();



final MediaType mediaType = MediaType.parse("application/json");

OkHttpClient httpClient = new OkHttpClient();

Request request = new Request.Builder()
    .url(FCM_ENDPOINT)
    .addHeader("Content-Type", "application/json; UTF-8")
    .addHeader("Authorization", "Bearer " + token)
    .post(RequestBody.create(mediaType, jsonMessage))
    .build();


Response response = httpClient.newCall(request).execute();
if (response.isSuccessful()) {
    log.info("Message sent to FCM server");
}

友達fcm.googleapis.com/v1/projects/zoftino-stores/messages:sendこのリンクは有効期限が切れているようです!
Naser Nikzad、2018

1
それではなく、GoogleプロジェクトのURLを使用する必要があります。「zotino-stores」をプロジェクト名に置き換えます
Arnav Rao

2

このリンクからのこの解決策は私に大いに役立ちました。あなたはそれをチェックすることができます。

これらの命令行を含むcurl.phpファイルは機能します。

<?php 
// Server key from Firebase Console define( 'API_ACCESS_KEY', 'AAAA----FE6F' );
$data = array("to" => "cNf2---6Vs9", "notification" => array( "title" => "Shareurcodes.com", "body" => "A Code Sharing Blog!","icon" => "icon.png", "click_action" => "http://shareurcodes.com"));
$data_string = json_encode($data);
echo "The Json Data : ".$data_string;
$headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' );
$ch = curl_init(); curl_setopt( $ch,CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send' );
curl_setopt( $ch,CURLOPT_POST, true );
curl_setopt( $ch,CURLOPT_HTTPHEADER, $headers );
curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch,CURLOPT_POSTFIELDS, $data_string);
$result = curl_exec($ch);
curl_close ($ch);
echo "<p>&nbsp;</p>";
echo "The Result : ".$result;

覚えて you need to execute curl.php file using another browser ie not from the browser that is used to get the user token. You can see notification only if you are browsing another website.


0

Androidからプッシュ通知を送信したい場合は、私のブログ投稿をチェックしてください

1台のAndroidスマートフォンからサーバーのない別のスマートフォンにプッシュ通知を送信します。

プッシュ通知の送信は、https://fcm.googleapis.com/fcm/sendへの投稿リクエストにすぎません

ボレーを使用したコードスニペット:

    JSONObject json = new JSONObject();
 try {
 JSONObject userData=new JSONObject();
 userData.put("title","your title");
 userData.put("body","your body");

json.put("data",userData);
json.put("to", receiverFirebaseToken);
 }
 catch (JSONException e) {
 e.printStackTrace();
 }

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://fcm.googleapis.com/fcm/send", json, new Response.Listener<JSONObject>() {
 @Override
 public void onResponse(JSONObject response) {

Log.i("onResponse", "" + response.toString());
 }
 }, new Response.ErrorListener() {
 @Override
 public void onErrorResponse(VolleyError error) {

}
 }) {
 @Override
 public Map<String, String> getHeaders() throws AuthFailureError {

Map<String, String> params = new HashMap<String, String>();
 params.put("Authorizationey=" + SERVER_API_KEY);
 params.put("Content-Typepplication/json");
 return params;
 }
 };
 MySingleton.getInstance(context).addToRequestQueue(jsonObjectRequest);

詳細については、私のブログ投稿をチェックすることをお勧めします。



0

Firebase Consoleを使用すると、アプリケーションパッケージに基づいてすべてのユーザーにメッセージを送信できますが、CURLまたはPHP APIでは不可能です。

APIを使用して、特定のデバイスIDまたはサブスクライブしたユーザーに、選択したトピックまたはサブスクライブしたトピックユーザーに通知を送信できます。

Get a view on following link. It will help you.
https://firebase.google.com/docs/cloud-messaging/send-message


0

PHPを使用している場合は、Firebase用のPHP SDK:Firebase Admin SDKの使用をお勧めします。簡単な設定を行うには、次の手順に従います。

Firebaseからプロジェクト認証情報のjsonファイルを取得し(sdkを初期化)、プロジェクトに含めます。

プロジェクトにSDKをインストールします。私は作曲家を使用します:

composer require kreait/firebase-php ^4.35

SDKドキュメントのクラウドメッセージングセッションの例を試してください。

use Kreait\Firebase;
use Kreait\Firebase\Messaging\CloudMessage;

$messaging = (new Firebase\Factory())
->withServiceAccount('/path/to/firebase_credentials.json')
->createMessaging();

$message = CloudMessage::withTarget(/* see sections below */)
    ->withNotification(Notification::create('Title', 'Body'))
    ->withData(['key' => 'value']);

$messaging->send($message);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.