我将从通知的新Google服务开始Firebase Cloud Messaging
。
多亏了这段代码https://github.com/firebase/quickstart-android/tree/master/messaging,我能够从Firebase用户控制台发送通知发送到Android设备。
是否有任何API或方法无需使用Firebase控制台即可发送通知?我的意思是,例如,一个PHP API或类似的东西,可以直接从我自己的服务器创建通知。
我将从通知的新Google服务开始Firebase Cloud Messaging
。
多亏了这段代码https://github.com/firebase/quickstart-android/tree/master/messaging,我能够从Firebase用户控制台发送通知发送到Android设备。
是否有任何API或方法无需使用Firebase控制台即可发送通知?我的意思是,例如,一个PHP API或类似的东西,可以直接从我自己的服务器创建通知。
Answers:
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}"
这可以使用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密钥)
{"multicast_id":3694931298664346108,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"MessageTooBig"}]}
。如何解决此问题?
使用服务API。
网址: 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>
"to" : "to_id(firebase refreshedToken)"
而不是设备ID?"all"
根本不工作。我正在使用C#WebRequest
发送通知。@AshikurRahman您的建议也欢迎。从3-4天开始,我一直在努力和寻找。
使用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通知基于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;
}
?>
可以使用FCM HTTP v1 API端点将通知或数据消息发送到Firebase基本云消息传递服务器。 https://fcm.googleapis.com/v1/projects/zoftino-stores/messages:send。
您需要使用Firebase控制台生成和下载服务帐户的私钥,并使用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");
}
这个链接的解决方案对我很有帮助。您可以检查出来。
带有这些指令的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> </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.
如果您想从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);
我建议大家查看我的博客文章以获取完整的详细信息。
使用Firebase控制台,您可以根据应用程序包向所有用户发送消息。但是,使用CURL或PHP API则不可能。
通过API您可以将通知发送到特定的设备ID或已订阅用户到选定主题或已订阅主题的用户。
Get a view on following link. It will help you.
https://firebase.google.com/docs/cloud-messaging/send-message
或者,您可以使用Firebase云功能,这对我来说是实现推送通知的更简单方法。 Firebase /功能样本
如果您使用的是PHP,建议您使用Firebase的PHP SDK:Firebase Admin SDK。为了简单的配置,您可以按照以下步骤操作:
从Firebase获取项目凭证json文件(初始化sdk)并将其包括在您的项目中。
在您的项目中安装SDK。我使用作曲家:
composer require kreait/firebase-php ^4.35
尝试从SDK文档中的Cloud Messaging会话中获取任何示例:
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);