Прежде всего, поймите, что не так с этим кодом:
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.
Теперь, чтобы решить эту проблему, у нас есть много вариантов. Ниже приведены два из них:
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]();
}
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]();
}
Облачные функции Google теперь позволяют отправлять push-уведомления с устройства на устройство без сервера приложений.
На соответствующей странице в облачных функциях Google:
Разработчики могут использовать функции облака, чтобы пользователи могли общаться и получать актуальную информацию о приложении. Рассмотрим, например, приложение, которое позволяет пользователям следить за действиями друг друга в приложении. В таком приложении функция, инициированная записью базы данных Realtime для хранения новых подписчиков, может создавать уведомления Firebase Cloud Messaging (FCM), чтобы сообщить соответствующим пользователям, что они получили новых подписчиков.
Пример:
blockquote>
- Функция запускает запись в путь базы данных Realtime, где хранятся последователи.
- Функция составляет сообщение для отправки через FCM.
- FCM отправляет уведомление сообщение на устройство пользователя.
Вот демонстрационный проект для отправки push-уведомлений устройства на устройство с помощью Firebase и облачных функций Google.
Я понял, что: - Выполнение запроса 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.
ВАЖНО: - Использование вышеуказанного кода означает, что ваш ключ сервера находится в клиентском приложении. Это опасно, поскольку кто-то может вникнуть в ваше приложение и получить ключ сервера для отправки вредоносных уведомлений вашим пользователям.
Вы можете использовать базу данных реального времени firebase для этого. Вы можете создать структуру данных для хранения чатов и добавить наблюдателей для потоков беседы для обоих пользователей. Он по-прежнему не обладает архитектурой device-server-device, но в этом случае на стороне разработчиков нет дополнительного сервера. Это использует серверы firebase. Вы можете проверить учебник здесь (игнорируйте часть пользовательского интерфейса, хотя это также хорошая отправная точка для пользовательских интерфейсов чата).
Вы можете использовать «Дооснащение». Подписывайте устройства для обсуждения новостей. Отправить уведомление от одного устройства к другому.
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);
}
Да, это возможно сделать без какого-либо сервера. Вы можете создать клиентскую группу группы устройств, а затем обмениваться сообщениями в группе. Однако существуют ограничения:
Ссылка: Firebase doc См. раздел «Управление группами устройств в клиентских приложениях Android»
1) подписаться на идентичное имя темы, например:
2) отправлять сообщения внутри приложения
Итак, у меня была идея здесь. См.: Если FCM, а также GCM имеют доступ к HTTP-запросу, мы можем отправить сообщение json с данными наших сообщений, включая токены (ы) устройств, которые мы хотим, чтобы это сообщение было доставлено.
Итак, почему бы не отправить сообщение на сервер Firebase с этим уведомлением, которое будет доставлено пользователю B? вы понимаете ?
Итак, вы отправляете сообщение и чат с сообщением о вызове, чтобы обеспечить доставку уведомления, если пользователь находится в вашем приложении в фоновом режиме. Я тоже скоро буду в этом нуждаться, я буду тестировать позже. Что вы говорите?
Если у вас есть маркер fcm (gcm) устройства, которому вы хотите отправить уведомление. Это просто запрос на отправку уведомления.
Вы можете сделать это с помощью запроса Volly Jsonobject ....
выполните следующие действия:
1 скопируйте старый ключ сервера и сохраните его как Legacy_SERVER_KEY
Legacy Server key
blockquote>вы можете видеть на картинке, как получить
2 Вам нужна зависимость от Volley
compile ' com.mcxiaoke.volley: library: 1.0.19 '
blockquote>Код для отправки 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 ();
Самый простой способ:
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;
}
}