项目总结系列一 位置实时共享

从北京回来到今天已经整整三个月了,三个月没有更新简书了。回来找了一家新的公司上班,正好今天新项目打包测试了,找了点时间来总结一下最近项目中遇到的一些问题与心得。今天主要分享位置实时共享,其实之前也有时间,因为在新的公司很少加班。但是自己太懒了所以……。

1.谈谈新公司

进入公司才发现公司有个iOS大神和我是一个大学的 还是一个系的 还是同一级的,还有两个Android与我是一个专业的,这个行业真的小啊😄。公司不大,老板是个美籍华人(这应该是我们加班少的原因吧)。

2.谈谈项目

项目内容保密(签了协议的)……,还是谈技术吧。
1>即时通讯:我们用的是环信的,因为这不是主要的功能,使用就直接用的是环信的UI,就是官方demo里面的EaseUI,导入SDK就不用说了,我主要分享一下我们在里面添加的一个新的功能:实时位置共享 我们将这个功能添加在群聊里面的。主要逻辑:是通过环信群聊的透传消息实现的用的是百度地图。

  • 通过百度地图定位 将自己的位置的经纬度放在透传消息的扩展信息中传出去
// 更新发送
- (void)sendCmdMessageWithType:(NSString *)type {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        EMCmdMessageBody *body = [[EMCmdMessageBody alloc] initWithAction:@"shareLocation"];
        _currentUserId = [[NSUserDefaults standardUserDefaults] objectForKey:@"eid"];
        NSDictionary *ext = @{@"latitude":@(_userStartLocation.location.coordinate.latitude),@"longitude":@(_userStartLocation.location.coordinate.longitude),@"type":type,_currentUserId:[[NSUserDefaults standardUserDefaults] objectForKey:@"user_nickname"]};
        
        EMMessage *message = [[EMMessage alloc] initWithConversationID:self.conversationID
                                                                  from:_currentUserId
                                                                    to:self.conversationID
                                                                  body:body
                                                                   ext:ext];
        message.chatType = EMChatTypeGroupChat;
        [[EMClient sharedClient].chatManager sendMessage:message progress:nil completion:^(EMMessage *message, EMError *error) {
            if (error) {
                [CTHUD showText:@"位置更新失败"];
                // 去请求token
            }
        }];
    });
}
  • 然后在解析透彻信息的解析位置信息
// 收到解析
- (void)didReceiveCmdMessages:(NSArray *)aCmdMessages {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        for (EMMessage *cmdMessage in aCmdMessages) {
            EMCmdMessageBody *body = (EMCmdMessageBody *)cmdMessage.body;
            // 判断是否是位置共享消息
            if ([body.action isEqualToString:@"shareLocation"]) {
                CLLocationCoordinate2D coordinate;
                coordinate.latitude = [[cmdMessage.ext objectForKey:@"latitude"] doubleValue];
                coordinate.longitude = [[cmdMessage.ext objectForKey:@"longitude"] doubleValue];
                NSString *nickName = [cmdMessage.ext objectForKey:cmdMessage.from];
                if ([[cmdMessage.ext objectForKey:@"type"] isEqualToString:@"update"]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self updateOtherAnnotationWithLocation:coordinate UserNickName:nickName];
                    });
                }else if ([[cmdMessage.ext objectForKey:@"type"] isEqualToString:@"remove"]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self removeOtherAnnotationWithUserNickName:nickName];
                    });
                }else if ([[cmdMessage.ext objectForKey:@"type"] isEqualToString:@"join"]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self addMyAnnotationWithLocation:coordinate UserNickName:nickName];
                        [self sendCmdMessageWithType:@"feedback"];
                    });
                }else if ([[cmdMessage.ext objectForKey:@"type"] isEqualToString:@"feedback"]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self addMyAnnotationWithLocation:coordinate UserNickName:nickName];
                    });
                }
            }
        }
    });
}
  • 将所有收到的透传消的位置信息标识在地图上。
// 添加新的用户标注
- (void)addMyAnnotationWithLocation:(CLLocationCoordinate2D)coordinate UserNickName:(NSString *)nickName{
    BMKPointAnnotation *annotation = [[BMKPointAnnotation alloc]init];
    annotation.coordinate = coordinate;
    annotation.title = nickName;
    [_mapView addAnnotation:annotation];
    [_mapView selectAnnotation:annotation animated:YES];
    [_otherUserAnnotation addObject:annotation];
    [_otherUserNickName addObject:nickName];
    [_mapView showAnnotations:_otherUserAnnotation animated:YES];
    [_mapView setCenterCoordinate:coordinate animated:YES];
    while (!_mapView.zoomOut) {
    }
}
  • 还需要通过传递者的传递的类型定该位置是新加入用户还是已经存在的用户
if ([[cmdMessage.ext objectForKey:@"type"] isEqualToString:@"update"]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self updateOtherAnnotationWithLocation:coordinate UserNickName:nickName];
                    });
                }else if ([[cmdMessage.ext objectForKey:@"type"] isEqualToString:@"remove"]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self removeOtherAnnotationWithUserNickName:nickName];
                    });
                }else if ([[cmdMessage.ext objectForKey:@"type"] isEqualToString:@"join"]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self addMyAnnotationWithLocation:coordinate UserNickName:nickName];
                        [self sendCmdMessageWithType:@"feedback"];
                    });
                }else if ([[cmdMessage.ext objectForKey:@"type"] isEqualToString:@"feedback"]) {
                    dispatch_async(dispatch_get_main_queue(), ^{
                        [self addMyAnnotationWithLocation:coordinate UserNickName:nickName];
                    });
                }
  • 新用户需要添加大头针,已经存在的用户只需要更新位置。
// 更新用户标注
- (void)updateOtherAnnotationWithLocation:(CLLocationCoordinate2D)coordinate UserNickName:(NSString *)nickName{
    for (BMKPointAnnotation *annotation in _otherUserAnnotation) {
        if ([annotation.title isEqualToString:nickName]) {
            annotation.coordinate = coordinate;
        }
    }
}
  • 通过百度地图获得自己移动的距离
BMKMapPoint point1 = BMKMapPointForCoordinate(CLLocationCoordinate2DMake(_userStartLocation.location.coordinate.latitude,_userStartLocation.location.coordinate.latitude));

BMKMapPoint point2 = BMKMapPointForCoordinate(CLLocationCoordinate2DMake(userLocation.location.coordinate.latitude,userLocation.location.coordinate.latitude));

 CLLocationDistance distance = BMKMetersBetweenMapPoints(point1,point2);
  • 自己定义一个移动的精度,我们当时定的移动距离大于20米(distance>20)就发送一次位置更新。
  • 最后当需要离开位置共享是也需要再发送一次信息,透传解析出,然后移除标识
// 删除用户标注
- (void)removeOtherAnnotationWithUserNickName:(NSString *)nickName{
    for (BMKPointAnnotation *annotation in _otherUserAnnotation) {
        if ([annotation.title isEqualToString:nickName]) {
            [_otherUserAnnotation removeObject:annotation];
            [_otherUserNickName removeObject:nickName];
            [_mapView removeAnnotation:annotation];
        }
    }
}

3.结束语

实时共享 其实与群聊差不多,就是我的位置移动距离达到了精度要求,我就发送一次群消息,让每一个参加共享的人都知道,然后在自己的地图上更新一次。以上就是我们的位置实时共享的逻辑与部分代码,欢迎各位的指正,谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容