如何在Button OnClickListener中只知道userID的情况下向特定用户发送推送通知?Firebase

7

我只需要在我的按钮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 Cloud Messaging来发送推送通知。此外,您需要在受信任的环境中运行代码。我建议阅读这里的教程:https://firebase.googleblog.com/2016/08/sending-notifications-between-android.html,然后学习使用Cloud Functions的示例:https://firebase.google.com/docs/functions/use-cases#notify_users_when_something_interesting_happens - Frank van Puffelen
3个回答

12
要使用Firebase向特定单个用户发送推送通知,您只需要拥有FCM注册令牌,这是用户设备接收通知的唯一标识符。
以下是Firebase FCM文档以获取此令牌: FCM Token registration 基本上:
- 您为用户获取FCM令牌 - 然后,通过将此FCM令牌与用户ID关联,将此FCM令牌存储在您的服务器或数据库中 - 当您需要发送通知时,可以通过用户ID检索存储在服务器或数据库上的此FCM令牌,并使用Firebase Cloud Functions。以下是一个特定案例研究,用于向特定用户发送通知:Cloud Functions 仅仅用户ID本身是不足以发送特定用户的通知的。

我该如何获取它? - user8593304
使用FCM,我如何通过代码而非Firebase控制台在我的应用内发送通知? - user8593304
有一些推送通知提供商,如Bluemix Push Notifications和其他几家公司,它们会在用户ID和设备令牌之间进行映射。最好使用它们而不是编写自己的逻辑。 - Neeraj Krishna

7

首先,用户需要生成以下代码:

String token = FirebaseInstanceId.getInstance().getToken();

然后将其与用户ID一起存储在Firebase数据库中作为键,或通过以下方式订阅用户到任何主题:

FirebaseMessaging.getInstance().subscribeToTopic("topic");

要发送通知,您需要调用以下API:

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

使用请求头部分的“Authorization”标识您的FCM密钥,“Content-Type”标识为“application/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密钥将被暴露并可能被滥用。

Translated:

或者你可以使用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 密钥公开暴露给公众


我不明白应该在哪里写入接收消息的用户的ID令牌。 - user8593304
在 FCM 通知器类中,将“to”替换为“用户令牌”,而不是“/topics/topic”。 - kunwar97
好的,完美。还有一件事:我需要在清单文件中写些什么吗? - user8593304
你需要在客户端应用程序中实现FirebaseMessagingService和FirebaseIdService,因此必须将这些服务添加到客户端应用程序的清单中。 - kunwar97
这只涉及添加通知负载,那数据负载怎么办?如何添加它?@kunwar97 - Pratiksha Shaha
嗨 @PratikshaShaha,我已更新我的答案。然而,不建议使用此方法,因为它会产生安全风险。 - kunwar97

0

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

我自己还没有测试过这个方法,但我在此之前曾经读到过。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接