Отправка push-уведомления конкретному пользователю с помощью FCM при нажатии кнопки из приложения. [Дубликат]

Прежде всего, поймите, что не так с этим кодом:

var funcs = [];
for (var i = 0; i < 3; i++) {          // let's create 3 functions
    funcs[i] = function() {            // and store them in funcs
        console.log("My value: " + i); // each should log its value.
    };
}
for (var j = 0; j < 3; j++) {
    funcs[j]();                        // and now let's run each one to see
}

Здесь, когда инициализируется массив funcs[], i увеличивается, массив funcs инициализируется и размер массива func равен 3, поэтому i = 3,. Теперь, когда вызывается funcs[j](), он снова использует переменную i, которая уже была увеличена до 3.

Теперь, чтобы решить эту проблему, у нас есть много вариантов. Ниже приведены два из них:

  1. Мы можем инициализировать i с помощью let или инициализировать новую переменную index с помощью let и сделать ее равной i. Поэтому, когда вызов выполняется, index будет использоваться, и его область действия закончится после инициализации. И для вызова снова будет инициализирован index:
    var funcs = [];
    for (var i = 0; i < 3; i++) {          
        let index = i;
        funcs[i] = function() {            
            console.log("My value: " + index); 
        };
    }
    for (var j = 0; j < 3; j++) {
        funcs[j]();                        
    }
    
  2. Другой вариант может состоять в том, чтобы ввести tempFunc, который возвращает действительную функцию:
    var funcs = [];
    function tempFunc(i){
        return function(){
            console.log("My value: " + i);
        };
    }
    for (var i = 0; i < 3; i++) {  
        funcs[i] = tempFunc(i);                                     
    }
    for (var j = 0; j < 3; j++) {
        funcs[j]();                        
    }
    
58
задан Suyash 25 May 2016 в 11:48
поделиться

10 ответов

Облачные функции Google теперь позволяют отправлять push-уведомления с устройства на устройство без сервера приложений.

На соответствующей странице в облачных функциях Google:

Разработчики могут использовать функции облака, чтобы пользователи могли общаться и получать актуальную информацию о приложении. Рассмотрим, например, приложение, которое позволяет пользователям следить за действиями друг друга в приложении. В таком приложении функция, инициированная записью базы данных Realtime для хранения новых подписчиков, может создавать уведомления Firebase Cloud Messaging (FCM), чтобы сообщить соответствующим пользователям, что они получили новых подписчиков.

Пример:

  1. Функция запускает запись в путь базы данных Realtime, где хранятся последователи.
  2. Функция составляет сообщение для отправки через FCM.
  3. FCM отправляет уведомление сообщение на устройство пользователя.

Вот демонстрационный проект для отправки push-уведомлений устройства на устройство с помощью Firebase и облачных функций Google.

27
ответ дан Crashalot 23 August 2018 в 18:04
поделиться

Я понял, что: - Выполнение запроса HTTP POST со ссылкой « https://fcm.googleapis.com/fcm/send » с требуемым заголовком и данными, на которые ссылаются ЗДЕСЬ . Constants.LEGACY_SERVER_KEY - это локальная переменная класса, вы можете найти это в настройках проекта Firebase -> CLOUD MESSAGING -> Legacy Server. Вы должны пройти токен регистрации устройства (reg_token) в нижеприведенном фрагменте кода ЗДЕСЬ. Однако вам нужна okhttp зависимость библиотеки, чтобы получить этот сниппет.

public static final MediaType JSON
        = MediaType.parse("application/json; charset=utf-8");
private void sendNotification(final String regToken) {
    new AsyncTask<Void,Void,Void>(){
        @Override
        protected Void doInBackground(Void... params) {
            try {
                OkHttpClient client = new OkHttpClient();
                JSONObject json=new JSONObject();
                JSONObject dataJson=new JSONObject();
                dataJson.put("body","Hi this is sent from device to device");
                dataJson.put("title","dummy title");
                json.put("notification",dataJson);
                json.put("to",regToken);
                RequestBody body = RequestBody.create(JSON, json.toString());
                Request request = new Request.Builder()
                        .header("Authorization","key="+Constants.LEGACY_SERVER_KEY)
                        .url("https://fcm.googleapis.com/fcm/send")
                        .post(body)
                        .build();
                Response response = client.newCall(request).execute();
                String finalResponse = response.body().string();
            }catch (Exception e){
                //Log.d(TAG,e+"");
            }
            return null;
        }
    }.execute();

}

далее, если вы хотите отправить сообщение в определенную тему, замените 'regToken' на json, как на этом

json.put("to","/topics/foo-bar")

, и, наконец, не забудьте добавить разрешение INTERNET в свой AndroidManifest. xml.

ВАЖНО: - Использование вышеуказанного кода означает, что ваш ключ сервера находится в клиентском приложении. Это опасно, поскольку кто-то может вникнуть в ваше приложение и получить ключ сервера для отправки вредоносных уведомлений вашим пользователям.

13
ответ дан brijesh kumar 23 August 2018 в 18:04
поделиться

Вы можете использовать базу данных реального времени firebase для этого. Вы можете создать структуру данных для хранения чатов и добавить наблюдателей для потоков беседы для обоих пользователей. Он по-прежнему не обладает архитектурой device-server-device, но в этом случае на стороне разработчиков нет дополнительного сервера. Это использует серверы firebase. Вы можете проверить учебник здесь (игнорируйте часть пользовательского интерфейса, хотя это также хорошая отправная точка для пользовательских интерфейсов чата).

Firebase Realtime Chat

0
ответ дан DS. 23 August 2018 в 18:04
поделиться

Вы можете использовать «Дооснащение». Подписывайте устройства для обсуждения новостей. Отправить уведомление от одного устройства к другому.

public void onClick(View view) {

    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    httpClient.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request original = chain.request();

            // Request customization: add request headers
            Request.Builder requestBuilder = original.newBuilder()
                    .header("Authorization", "key=legacy server key from FB console"); // <-- this is the important line
            Request request = requestBuilder.build();
            return chain.proceed(request);
        }
    });

    httpClient.addInterceptor(logging);
    OkHttpClient client = httpClient.build();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://fcm.googleapis.com")//url of FCM message server
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())//use for convert JSON file into object
            .build();

    // prepare call in Retrofit 2.0
    FirebaseAPI firebaseAPI = retrofit.create(FirebaseAPI.class);

    //for messaging server
    NotifyData notifydata = new NotifyData("Notification title","Notification body");

Call<Message> call2 = firebaseAPI.sendMessage(new Message("topic or deviceID", notifydata));

    call2.enqueue(new Callback<Message>() {
        @Override
        public void onResponse(Call<Message> call, Response<Message> response) {

            Log.d("Response ", "onResponse");
            t1.setText("Notification sent");

        }

        @Override
        public void onFailure(Call<Message> call, Throwable t) {
            Log.d("Response ", "onFailure");
            t1.setText("Notification failure");
        }
    });
}

POJOs

public class Message {
String to;
NotifyData notification;

public Message(String to, NotifyData notification) {
    this.to = to;
    this.notification = notification;
}

}

и

public class NotifyData {
String title;
String body;

public NotifyData(String title, String body ) {

    this.title = title;
    this.body = body;
}

}

и FirebaseAPI

public interface FirebaseAPI {

@POST("/fcm/send")
Call<Message> sendMessage(@Body Message message);

}
1
ответ дан eurosecom 23 August 2018 в 18:04
поделиться

Да, это возможно сделать без какого-либо сервера. Вы можете создать клиентскую группу группы устройств, а затем обмениваться сообщениями в группе. Однако существуют ограничения:

  1. Вы должны использовать ту же учетную запись Google на устройствах
  2. Вы не можете отправлять сообщения с высоким приоритетом

Ссылка: Firebase doc См. раздел «Управление группами устройств в клиентских приложениях Android»

3
ответ дан greywolf82 23 August 2018 в 18:04
поделиться

1) подписаться на идентичное имя темы, например:

  • ClientA.subcribe ("to / topic_users_channel")
  • ClientB.subcribe ("to / topic_users_channel" )

2) отправлять сообщения внутри приложения

GoogleFirebase: Как отправить сообщения темы

2
ответ дан Maxim Firsoff 23 August 2018 в 18:04
поделиться

Итак, у меня была идея здесь. См.: Если FCM, а также GCM имеют доступ к HTTP-запросу, мы можем отправить сообщение json с данными наших сообщений, включая токены (ы) устройств, которые мы хотим, чтобы это сообщение было доставлено.

Итак, почему бы не отправить сообщение на сервер Firebase с этим уведомлением, которое будет доставлено пользователю B? вы понимаете ?

Итак, вы отправляете сообщение и чат с сообщением о вызове, чтобы обеспечить доставку уведомления, если пользователь находится в вашем приложении в фоновом режиме. Я тоже скоро буду в этом нуждаться, я буду тестировать позже. Что вы говорите?

0
ответ дан Paulo Linhares - Packapps 23 August 2018 в 18:04
поделиться

Если у вас есть маркер fcm (gcm) устройства, которому вы хотите отправить уведомление. Это просто запрос на отправку уведомления.

https://github.com/prashanthd/google-services/blob/master/android/gcm/gcmsender/src/main/java/gcm/play/android/samples/com/ gcmsender / GcmSender.java

1
ответ дан Prashanth Debbadwar 23 August 2018 в 18:04
поделиться

Вы можете сделать это с помощью запроса Volly Jsonobject ....

выполните следующие действия:

1 скопируйте старый ключ сервера и сохраните его как Legacy_SERVER_KEY

Legacy Server key

вы можете видеть на картинке, как получить

2 Вам нужна зависимость от Volley

compile ' com.mcxiaoke.volley: library: 1.0.19 '

Код для отправки Push: -

    private void sendFCMPush() {

            String Legacy_SERVER_KEY = YOUR_Legacy_SERVER_KEY;
            String msg = "this is test message,.,,.,.";
            String title = "my title";
            String token = FCM_RECEIVER_TOKEN;

            JSONObject obj = null;
        JSONObject objData = null;
        JSONObject dataobjData = null;

        try {
            obj = new JSONObject();
            objData = new JSONObject();

            objData.put("body", msg);
            objData.put("title", title);
            objData.put("sound", "default");
            objData.put("icon", "icon_name"); //   icon_name image must be there in drawable
            objData.put("tag", token);
            objData.put("priority", "high");

            dataobjData = new JSONObject();
            dataobjData.put("text", msg);
            dataobjData.put("title", title);

            obj.put("to", token);
            //obj.put("priority", "high");

            obj.put("notification", objData);
            obj.put("data", dataobjData);
            Log.e("!_@rj@_@@_PASS:>", obj.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }

            JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, Constants.FCM_PUSH_URL, obj,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.e("!_@@_SUCESS", response + "");
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e("!_@@_Errors--", error + "");
                        }
                    }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("Authorization", "key=" + Legacy_SERVER_KEY);
                    params.put("Content-Type", "application/json");
                    return params;
                }
            };
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            int socketTimeout = 1000 * 60;// 60 seconds
            RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
            jsObjRequest.setRetryPolicy(policy);
            requestQueue.add(jsObjRequest);
}

Просто позвонить sendFCMPush ();

1
ответ дан Rjz Satvara 23 August 2018 в 18:04
поделиться

Самый простой способ:

void sendFCMPush(String msg,String token) {
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    httpClient.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request original = chain.request();

            // Request customization: add request headers
            Request.Builder requestBuilder = original.newBuilder()
                    .header("Authorization", "key="+Const.FIREBASE_LEGACY_SERVER_KEY); // <-- this is the important line
            Request request = requestBuilder.build();
            return chain.proceed(request);
        }
    });

    httpClient.addInterceptor(logging);
    OkHttpClient client = httpClient.build();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://fcm.googleapis.com/")//url of FCM message server
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())//use for convert JSON file into object
            .build();

    // prepare call in Retrofit 2.0
    FirebaseAPI firebaseAPI = retrofit.create(FirebaseAPI.class);

    //for messaging server
    NotifyData notifydata = new NotifyData("Chatting", msg);

    Call<Message> call2 = firebaseAPI.sendMessage(new Message(token, notifydata));

    call2.enqueue(new Callback<Message>() {
        @Override
        public void onResponse(Call<Message> call, retrofit2.Response<Message> response) {
            Log.e("#@ SUCCES #E$#", response.body().toString());
        }

        @Override
        public void onFailure(Call<Message> call, Throwable t) {

            Log.e("E$ FAILURE E$#", t.getMessage());
        }
    });
}

Создать класс для создания объекта:

public class Message {
String to;
NotifyData data;

public Message(String to, NotifyData data) {
    this.to = to;
    this.data = data;
}
}

Создать класс для создания объекта:

public class Notification {
String title;
String message;
enter code here`enter code here`
public Notification(String title, String message) {
    this.title = title;
    this.message = message;
}
}
-2
ответ дан The Dictator 23 August 2018 в 18:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: