繁体   English   中英

我如何只知道 Button OnClickListener 中的用户 ID 就可以向特定用户发送推送通知? Firebase

[英]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 令牌注册

基本上:

  • 您获得用户的 FCM 令牌
  • 然后,通过将此 FCM 令牌与用户 ID 相关联,将此 FCM 令牌存储在您的服务器或数据库上。
  • 当您需要发送通知时,您可以使用用户 ID 检索存储在您的服务器或数据库上的 FCM 令牌并使用 Firebase Cloud Functions。 以下是为特定用户发送通知的特定案例研究: Cloud Functions

仅用户 ID 本身不足以为特定用户发送通知。

首先,用户必须生成String token = FirebaseInstanceId.getInstance().getToken(); 然后以 userId 为键将其存储在 Firebase 数据库中,或者您可以通过FirebaseMessaging.getInstance().subscribeToTopic("topic");将用户订阅到任何主题FirebaseMessaging.getInstance().subscribeToTopic("topic");

要发送通知,您必须点击此 API: https : //fcm.googleapis.com/fcm/send

使用标题“授权”,您的 FCM 密钥和内容类型为“应用程序/json”,请求正文应为:

{ 
  "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 密钥暴露给公众

另一种方法是让用户订阅以他/她的 uid 命名的主题。 然后将通知发送到具有 uid 名称的主题。

我自己还没有测试过,但我前段时间在这里读过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM