0

Ive успешно реализовала мой сервер приложений php app. Мое устройство Android может получать уведомления с полезной нагрузкой данных. Теперь я хочу отправить уведомление с помощью datapayload с моего устройства на конкретное пользовательское устройство.Уведомление Firebase конкретному пользователю с устройства Android

Мое дело: Посетитель пришел навстречу сотрудникуA прием уведомляет только сотрудникаA.

Нужно ли мне реализовать сервер xmpp? или мой php-сервер также может обрабатывать этот механизм? Я попробовал ссылку на сервер xmpp https://github.com/carlosCharz/fcmxmppserver. Но библиотеки были устаревшими. любая помощь будет оценена

+1

Я бы рекомендовал гораздо более простой подход, выделенный здесь: https://firebase.googleblog.com/2016/08/sending-notifications-between-android.html –

ответ

-1

Все, что вам нужно для отправки уведомлений на конкретное устройство, является токеном устройства.

Таким образом, вы можете сделать это двумя способами:

  1. Задать сервер для конкретного маркера и отправить запрос через firebase от устройства
  2. Задать сервер для отправки запроса на какое-то устройство.

Таким образом, вы должны хранить токены устройств на сервере. Если собрать эту информацию с подключением пользователей счетов вы можете отправить уведомление от одного пользователя к другому


Существует code snippet отправить уведомление concreate устройства из приложения Android с помощью OkHttp библиотеки:

MediaType JSON = MediaType.parse("application/json; charset=utf-8"); 

OkHttpClient client = new OkHttpClient(); 

//in JSON field "to" is target device token. 
//you can get it so: FirebaseInstanceId.getInstance().getToken(); 
//but, ofcause, you must get it from i.e. server 
String json = "{ 
    \"notification\": { 
    \"title\": \"news\", 
    \"text\": \"newsTExt\", 
    \"click_action\": \"test\" 
    }, 
    \"data\": { 
    \"keyname\": \"any value\" 
    }, 
    \"to\" : \"dAQilNw:APA91IFd666h7WVSlAOyS-WraSrGv_IRZM\" 
}" 

String keyFromConsole = ...;//here is key from firebase console (Settings-prohect settings-CLOUD MESSAGING-server key) 

RequestBody body = RequestBody.create(JSON, json); 
Request request = new Request.Builder() 
     .url("https://fcm.googleapis.com/fcm/send") 
     .addHeader("Authorization", "key=" + keyFromConsole) 
     .addHeader("ContentType", "application/json") 
     .post(body) 
     .build(); 


Response response = client.newCall(request).enqueue(new Callback() { 

    @Override public void onFailure(Call call, IOException e) { 
     e.printStackTrace(); 
    } 

    @Override public void onResponse(Call call, Response response) throws IOException { 
    System.out.println(response.body().string()); 
    } 
}); 
+0

Вы предлагаете мне хранить ключ сервера на устройстве ? –

+0

Это всегда вариант. Если yiu не хочет этого, отправьте запрос с сервера – mohax

+0

Да, вы идете .. какой сервер я должен реализовать, чтобы приложение могло получать уведомление, и одновременно оно может отправлять уведомление на другое конкретное устройство? @mohax –

-1

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

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("/topics/news", 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); 

}