我如何只知道 Button OnClickListener 中的用户 ID 就可以向特定用户发送推送通知?火力地堡
How can i send push notification to specific users just knowing the userID inside Button OnClickListener? Firebase
我只需要向我的 Button OnClickListener
内的特定用户发送推送通知。是否可以使用 userId
和该特定用户的所有信息?
这是我的Button
OnClickListener()
代码
richiedi_invito.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseReference = FirebaseDatabase.getInstance().getReference();
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
lista_richieste = (ArrayList) dataSnapshot.child("classi").child(nome).child("lista_richieste").getValue();
verifica_richieste = (String) dataSnapshot.child("classi").child(nome).child("richieste").getValue();
if (!lista_richieste.contains(userID)){
ArrayList lista_invito = new ArrayList();
lista_invito.add(userID);
if (verifica_richieste.equals("null")){
databaseReference.child("classi").child(nome).child("richieste").setValue("not_null");
databaseReference.child("classi").child(nome).child("lista_richieste").setValue(lista_invito);
}
else{
lista_richieste.add(userID);
databaseReference.child("classi").child(nome).child("lista_richieste").setValue(lista_richieste);
}
//invitation code here
Fragment frag_crea_unisciti = new CreaUniscitiFrag();
FragmentManager fragmentManager= getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, frag_crea_unisciti);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Toast.makeText(getActivity(), "Richiesta di entrare inviata correttamente", Toast.LENGTH_SHORT).show();
}else{
Snackbar.make(layout,"Hai già richiesto di entrare in questa classe",Snackbar.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
});
要使用 Firebase 向特定的单个用户发送推送通知,您只需要 FCM 注册令牌,这是接收通知的用户设备的唯一标识符。
这是获取此令牌的 Firebase FCM 文档:FCM Token registration
基本上:
- 您获得用户的 FCM 令牌
- 然后,通过将此 FCM 令牌与用户 ID 相关联,将此 FCM 令牌存储在您的服务器或数据库中。
- 当您需要发送通知时,您可以使用用户 ID 检索存储在您的服务器或数据库中的此 FCM 令牌,并使用 Firebase Cloud Functions。以下是为特定用户发送通知的具体案例研究:Cloud Functions
仅用户 ID 本身不足以为特定用户发送通知。
首先,用户必须生成
String token = FirebaseInstanceId.getInstance().getToken();
然后将其以 userId 作为键存储在 Firebase 数据库中,或者您可以通过 FirebaseMessaging.getInstance().subscribeToTopic("topic");
为用户订阅任何主题
要发送通知,您必须点击此 API:https://fcm.googleapis.com/fcm/send
使用 headers“授权”您的 FCM 密钥和 Content-Type 作为“application/json”,请求 body 应该是:
{
"to": "/topics or FCM id",
"priority": "high",
"notification": {
"title": "Your Title",
"text": "Your Text"
},
"data": {
"customId": "02",
"badge": 1,
"sound": "",
"alert": "Alert"
}
}
或者您可以使用 okHttp,这是不推荐的方法,因为您的 FCM 密钥会暴露并可能被滥用。
public class FcmNotifier {
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public static void sendNotification(final String body, final String title) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
OkHttpClient client = new OkHttpClient();
JSONObject json = new JSONObject();
JSONObject notifJson = new JSONObject();
JSONObject dataJson = new JSONObject();
notifJson.put("text", body);
notifJson.put("title", title);
notifJson.put("priority", "high");
dataJson.put("customId", "02");
dataJson.put("badge", 1);
dataJson.put("alert", "Alert");
json.put("notification", notifJson);
json.put("data", dataJson);
json.put("to", "/topics/topic");
RequestBody body = RequestBody.create(JSON, json.toString());
Request request = new Request.Builder()
.header("Authorization", "key=your FCM key")
.url("https://fcm.googleapis.com/fcm/send")
.post(body)
.build();
Response response = client.newCall(request).execute();
String finalResponse = response.body().string();
Log.i("kunwar", finalResponse);
} catch (Exception e) {
Log.i("kunwar",e.getMessage());
}
return null;
}
}.execute();
}
}
注意:不推荐使用此解决方案,因为它暴露了 Firebase API PUBLIC
的关键
我只需要向我的 Button OnClickListener
内的特定用户发送推送通知。是否可以使用 userId
和该特定用户的所有信息?
这是我的Button
OnClickListener()
代码
richiedi_invito.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseReference = FirebaseDatabase.getInstance().getReference();
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
lista_richieste = (ArrayList) dataSnapshot.child("classi").child(nome).child("lista_richieste").getValue();
verifica_richieste = (String) dataSnapshot.child("classi").child(nome).child("richieste").getValue();
if (!lista_richieste.contains(userID)){
ArrayList lista_invito = new ArrayList();
lista_invito.add(userID);
if (verifica_richieste.equals("null")){
databaseReference.child("classi").child(nome).child("richieste").setValue("not_null");
databaseReference.child("classi").child(nome).child("lista_richieste").setValue(lista_invito);
}
else{
lista_richieste.add(userID);
databaseReference.child("classi").child(nome).child("lista_richieste").setValue(lista_richieste);
}
//invitation code here
Fragment frag_crea_unisciti = new CreaUniscitiFrag();
FragmentManager fragmentManager= getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, frag_crea_unisciti);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Toast.makeText(getActivity(), "Richiesta di entrare inviata correttamente", Toast.LENGTH_SHORT).show();
}else{
Snackbar.make(layout,"Hai già richiesto di entrare in questa classe",Snackbar.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
});
要使用 Firebase 向特定的单个用户发送推送通知,您只需要 FCM 注册令牌,这是接收通知的用户设备的唯一标识符。
这是获取此令牌的 Firebase FCM 文档:FCM Token registration
基本上:
- 您获得用户的 FCM 令牌
- 然后,通过将此 FCM 令牌与用户 ID 相关联,将此 FCM 令牌存储在您的服务器或数据库中。
- 当您需要发送通知时,您可以使用用户 ID 检索存储在您的服务器或数据库中的此 FCM 令牌,并使用 Firebase Cloud Functions。以下是为特定用户发送通知的具体案例研究:Cloud Functions
仅用户 ID 本身不足以为特定用户发送通知。
首先,用户必须生成
String token = FirebaseInstanceId.getInstance().getToken();
然后将其以 userId 作为键存储在 Firebase 数据库中,或者您可以通过 FirebaseMessaging.getInstance().subscribeToTopic("topic");
要发送通知,您必须点击此 API:https://fcm.googleapis.com/fcm/send
使用 headers“授权”您的 FCM 密钥和 Content-Type 作为“application/json”,请求 body 应该是:
{
"to": "/topics or FCM id",
"priority": "high",
"notification": {
"title": "Your Title",
"text": "Your Text"
},
"data": {
"customId": "02",
"badge": 1,
"sound": "",
"alert": "Alert"
}
}
或者您可以使用 okHttp,这是不推荐的方法,因为您的 FCM 密钥会暴露并可能被滥用。
public class FcmNotifier {
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public static void sendNotification(final String body, final String title) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
OkHttpClient client = new OkHttpClient();
JSONObject json = new JSONObject();
JSONObject notifJson = new JSONObject();
JSONObject dataJson = new JSONObject();
notifJson.put("text", body);
notifJson.put("title", title);
notifJson.put("priority", "high");
dataJson.put("customId", "02");
dataJson.put("badge", 1);
dataJson.put("alert", "Alert");
json.put("notification", notifJson);
json.put("data", dataJson);
json.put("to", "/topics/topic");
RequestBody body = RequestBody.create(JSON, json.toString());
Request request = new Request.Builder()
.header("Authorization", "key=your FCM key")
.url("https://fcm.googleapis.com/fcm/send")
.post(body)
.build();
Response response = client.newCall(request).execute();
String finalResponse = response.body().string();
Log.i("kunwar", finalResponse);
} catch (Exception e) {
Log.i("kunwar",e.getMessage());
}
return null;
}
}.execute();
}
}
注意:不推荐使用此解决方案,因为它暴露了 Firebase API PUBLIC
的关键