通知用の新しいGoogleサービスFirebase Cloud Messaging
から始めています。
このコードのおかげで https://github.com/firebase/quickstart-Android/tree/master/messaging 私は自分のFirebase User Console)から自分のAndroidデバイスに通知を送ることができました。
Firebase consoleを使用せずに通知を送信するためのAPIや方法はありますか?たとえば、私のサーバーから直接通知を作成するためのPHP APIなどです。
Firebase Cloud Messagingには、メッセージを送信するために呼び出すことができるサーバーサイドAPIがあります。 https://firebase.google.com/docs/cloud-messaging/server を参照してください。
メッセージの送信は、HTTPエンドポイントを呼び出すためにcurl
を使用するのと同じくらい簡単です。 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}"
これは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キー)です。
サービス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がバックグラウンドで起動しているときに呼び出されないという回答も確認してください
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!"
}
}
Frankが述べたように、Firebase Cloud Messaging(FCM)HTTP APIを使用して、自分のバックエンドからプッシュ通知をトリガーすることができます。しかし、あなたはできないでしょう
意味:FCM/GCM登録ID(プッシュトークン)を自分で保存するか、FCMトピックを使用してユーザーを登録する必要があります。 FCMはFirebase NotificationsのAPIではありません 、スケジュール設定やオープンレート分析を行わない低レベルのAPIです。 Firebase NotificationsはFCM上に構築されています。
最初に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;
}
?>
たとえば、Google Cloud Messaging(GCM)にPHPスクリプトを使用できます。 Firebaseとそのコンソールは、GCMのすぐ上にあります。
私はgithubでこれを見つけました: https://Gist.github.com/prime31/5675017
ヒント:このPHPスクリプトの結果は Android通知になります 。
したがって: Kootからのこの回答 - を読んでください Androidで通知を受信して表示したい場合は。
通知またはデータメッセージは、FCM HTTP v1 APIエンドポイントを使用してFirebase Baseクラウドメッセージングサーバーに送信できます。 https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send 。
Firebase consoleを使用してサービスアカウントの秘密キーを生成してダウンロードし、Google APIクライアントライブラリを使用してアクセスキーを生成する必要があります。任意のhttpライブラリを使用してエンドポイントの上にメッセージを投稿します。コードの下にOkHTTPを使用してメッセージを投稿します。 firebaseクラウドメッセージングとfcmトピックの例を使用した複数のクライアントへのメッセージ送信 で完全なサーバーサイドとクライアントサイドのコードを見つけることができます - /
特定のクライアントメッセージを送信する必要がある場合は、クライアントの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");
}
あるいは、Firebaseクラウド機能を使用することもできます。これは、プッシュ通知を実装するためのより簡単な方法です。 firebase/functions-samples
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
Androidからプッシュ通知を送信したい場合は私のブログ投稿をチェックしてください
1台のAndroid携帯電話から別のサーバーへのプッシュ通知を送信する。
プッシュ通知を送信することは、 https://fcm.googleapis.com/fcm/send への投稿要求に他なりません。
volleyを使ったコードスニペット:
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);
詳細については、私のブログ投稿をチェックしてください。