使用 Firebase 云消息传递似乎是更可取的方法。但是,如果这对您不起作用,我们可以利用实时数据库来执行此操作,尽管它不会是严格的客户端到客户端。
举个例子:假设我们有 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() 方法中收到此响应。
这可能不是你想要的,但它对我来说是一个有趣的练习,所以我还是想分享它。