300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > im中的定位消息 ios_实时位置共享

im中的定位消息 ios_实时位置共享

时间:2020-02-28 20:59:01

相关推荐

im中的定位消息 ios_实时位置共享

实时位置共享

实时位置共享: 向聊天参与者实时发送自己的位置信息。

当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

}

}

}

];

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。