====== 实时位置共享 ======
----
实时位置共享: 向聊天参与者实时发送自己的位置信息。
{{ :im:other:integrationcases:image022.png?nolink |实时位置共享}}
当A用户开启位置共享,需要实时监听自己的位置变化,同时在坐标变化时向B用户发送一条带有自己坐标的透传信息。
当B用户接收到实时共享的透传消息时,解析消息中的坐标,在需要的时候显示在界面上。
- 用户A向用户B发送一条带位置扩展的透传消息。
- 用户B在收到消息后,判断是否要展示并刷新界面。
注:“透传消息”是一种特殊类型的消息,收发双方不会存数据库,同时用户离线时也不会有推送,比较适合配合业务来处理一些功能。
===== 发送包含位置信息的透传 =====
=== Android示例 ===
EMMessage cmdMsg = EMMessage.createSendMessage(EMMessage.Type.CMD);
// 如果是群聊,设置chattype,默认是单聊
if (chatType == CHATTYPE_GROUP){
cmdMsg.setChatType(ChatType.GroupChat);
}
String action="shareLocation"; // 当前cmd消息的关键字
CmdMessageBody cmdBody=new CmdMessageBody(action);
// 设置消息body
cmdMsg.addBody(cmdBody);
// 设置要发给谁,用户username或者群聊groupid
cmdMsg.setReceipt(toChatUsername);
// 通过扩展字段设置坐标位置(参数可以自定义,但要求与ios保持一致)
JSONObject jsonObject = new JSONObject();
jsonObject.put("latitude", "38.6518");
jsonObject.put("longitude", "104.07642");
cmdMsg.setAttribute("coordinate",jsonObject.toString());
EMChatManager.getInstance().sendMessage(cmdMsg,new EMCallBack() {
@Override
public void onSuccess() {}
@Override
public void onProgress(int progress, String status) {}
@Override
public void onError(int code, String error) {}
});
=== iOS示例 ===
- (void)sendCmdMessage:(NSString *)conversationId {
EMCmdMessageBody *body = [[EMCmdMessageBody alloc] initWithAction:@"shareLocation"];
//latitude,longitude:获取到的经纬度
NSDictionary *ext = @{@"latitude":@"38.6518",@"longitude":@"104.07642"};
NSString *currentUsername = [EMClient sharedClient].currentUsername;
EMMessage *message = [[EMMessage alloc] initWithConversationID:conversationId
from:currentUsername
to:conversationId
body:body
ext:ext];
message.chatType = EMChatTypeChat; //单聊
[[EMClient sharedClient].chatManager sendMessage:message
progress:nil
completion:^(EMMessage *message, EMError *error) {
if (!error) {
NSLog(@"发送成功");
}
}
];
}
===== 接受并解析位置共享透传消息 =====
接收透传消息有两种方法,一种是接收在线透传消息,一种是接收离线透传消息,考虑到位置共享的实时性,此处只处理用在线时收到的位置共享即可。
=== Android示例 ===
//接收透传消息
EMChatManager.getInstance().registerEventListener(new EMEventListener() {
@Override
public void onEvent(EMNotifierEvent event) {
switch (event.getEvent()) {
case EventNewCMDMessage: // CMD消息
{
EMMessage message = (EMMessage) event.getData();
CmdMessageBody cmdMsgBody = (CmdMessageBody) message.getBody();
String aciton = cmdMsgBody.action;//获取自定义action
if(action.equals("shareLocation")){//判断是否是共享实时位置
try {
String co = message.getStringAttribute("coordinate");
JSONTokener jsonTokener = new JSONTokener(co);
JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
// 解析出来的经纬度
double lati = Double.valueOf(jsonObject.getString("latitude"));
double longi = Double.valueOf(jsonObject.getString("longitude"));
} catch (EaseMobException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
break;
}
default:
break;
}
}
}, new EMNotifierEvent.Event[] { EMNotifierEvent.Event.EventNewCMDMessage});
=== iOS示例 ===
- (void)cmdMessagesDidReceive:(NSArray *)aCmdMessages {
[aCmdMessages enumerateObjectsWithOptions:NSEnumerationReverse
usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj isKindOfClass:[EMMessage class]]) {
EMMessage *cmdMessage = (EMMessage *)obj;
// 判断是否是位置共享消息
EMCmdMessageBody *body = (EMCmdMessageBody *)cmdMessage.body;
if ([body.action isEqualToString:@"shareLocation"]) {
//解析出来的经纬度
double latitude = [[cmdMessage.ext objectForKey:@"latitude"] doubleValue];
double longitude = [[cmdMessage.ext objectForKey:@"longitude"] doubleValue];
*stop = YES;
// update ui
}
}
}
];
}
----
上一页:[[im:other:integrationcases:inputstatus|输入状态提示]]
下一页:[[im:other:integrationcases:end2end|端到端加密方案]]