Кажется, что использование Firebase Cloud Messaging было бы предпочтительным методом. Однако, если это не работает для вас, мы могли бы использовать для этого базу данных реального времени, хотя это не будет строго клиент-клиент.
В качестве примера: представьте, что у нас есть 2 пользователя с UID user1
и user2
. База данных может быть структурирована так, чтобы у каждого пользователя был свой список под узлами /requests
и /responses
:
{
"requests": {
"user1": {},
"user2": {}
},
"responses": {
"user1": {},
"user2": {}
}
}
В сценарии, когда user2
хочет запросить местоположение user1
, клиенты будут следовать следующему потоку:
Для Android это будет работать примерно так:
private FirebaseDatabase database = FirebaseDatabase.getInstance();
private FirebaseAuth auth = FirebaseAuth.getInstance();
private String myUserId;
private void setup() {
if (auth.getCurrentUser() == null) { // User must be signed-in
finish();
return;
}
myUserId = auth.getCurrentUser().getUid();
DatabaseReference requestsRef = database.getReference("requests").child(myUserId);
DatabaseReference responsesRef = database.getReference("responses").child(myUserId);
requestsRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
handleRequest(dataSnapshot.getKey());
dataSnapshot.getRef().removeValue(); // Delete the request once it's been handled
}
// ...
});
responsesRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String from = dataSnapshot.getKey();
String coordinates = dataSnapshot.getValue(String.class);
if (from != null && coordinates != null) handleResponse(from, coordinates);
dataSnapshot.getRef().removeValue(); // Delete the response once it's been handled
}
// ...
});
}
private void handleResponse(String from, String coordinates) {
Toast.makeText(this, String.format("User: %s is located at: %s", from, coordinates), Toast.LENGTH_SHORT).show();
}
private void handleRequest(String from) {
Toast.makeText(this, String.format("User: %s wants to know our location", from), Toast.LENGTH_SHORT).show();
sendResponse(from);
}
private void sendResponse(String to) {
String myCoordinates = "37.4220° N, 122.0841° W"; // Example, this will need implementing
database.getReference("/responses").child(to).child(myUserId).setValue(myCoordinates);
}
private void sendRequest(String to) {
database.getReference("/requests").child(to).child(myUserId).setValue(true);
}
В этом примере оба клиента пользователя сначала вызовут setup()
, чтобы начать прослушивание запросов и ответов.
Затем, чтобы запросить координаты пользователя, позвоните sendRequest()
с одного клиента. Другой клиент получит этот запрос в методе handleRequest()
и отправит свои координаты в базу данных. Наконец, запрашивающий клиент получит этот ответ в методе handleResponse()
.
Возможно, это не совсем то, что вы ищете, но это было забавное упражнение для меня, поэтому я все равно хотел поделиться им.