====== 实时位置共享 ====== ---- 实时位置共享: 向聊天参与者实时发送自己的位置信息。 {{:start:490integrationcases:share_location.jpg|实时位置共享}} 当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:490integrationcases:input-status|输入状态提示]] 下一页:[[im:490integrationcases:end2end-encryption|端到端加密方案]]