实战|uniapp模仿微信实现发送位置消息,解决滚动页面地图层级冲突

news2024/9/23 19:26:50

前言

在即时通讯应用中,虽然发送位置信息不是核心功能,但在特定场景下,这个功能仍然非常有用。

本文将介绍如何在 uniapp 中实现位置信息的发送和展示,特别是在遇到地图层级问题时的解决方案。

以下内容均基于 uniapp 打包 App 端。
在这里插入图片描述

常规解决方案带来的问题

在 uniapp 中,通常使用map组件来展示位置信息。但在打包为 App 端后,map组件的层级问题会导致它无法随着聊天页面滚动。就像下图的情况:
在这里插入图片描述
在这里插入图片描述

在这个方案中,有在文档上看到描述说可以采用cover-view去解决在滚动组件中map层级过高的问题,但是经过折腾应该还是对 uniapp 的了解不够,没有解决层级过高的问题,因此换了下面的方案,也算是一个新的路子,希望能够对看到这篇文档的你有所帮助。

采用的方案

静态地图方案

静态地图方案的核心其实是用一张地图的静态图片,替换了map组件,图片在scoll-list中不存在有层级过高的情况。而静态地图的产生则是调用了地图厂商所提供的静态地图 api,在调用生成的静态地图 api 时通过 url 传参的形式,将要展示的坐标经纬度传入,并且根据地图厂商规则去传入其他扩展参数,从而达到预期想要生成的静态地图效果。在本次我的实现中,我采用的是高德地图的 api,其他如百度,腾讯类似。

在高德静态地图 api 中,你可以除可传入经纬度坐标,也支持返回的图片宽高,这里我贴一下具体官方文档地址,供大家详细研究静态地图的使用:

高德静态地图

功能实现

在接下来的篇幅里面,我将描述一下,我在实现位置消息发送,消息页面展示位置气泡,以及点击消息气泡展示详细位置的实现过程,以及遇到的问题。

在实现之前我们需要先在 uniApp 官网查看相关获取位置、选择位置、查看位置相关 api 的用法以及注意事项。

  • uni.getLocation(获取位置)
  • uni.chooseLocation(选择位置)
  • uni.openLocation(查看位置)

第一步:实现发送位置

1)在mainifest.json文件下的App模块配置中勾选Geolocation(定位)

在定位中你可以选择系统定位或者是高德、百度等厂商的系统定位,这里为了延时,就直接选择系统定位。
在这里插入图片描述

2)点击发送位置获取系统定位授权

在这里插入图片描述

getLocation() {
      uni.getLocation({
        // type: 'wgs84',
        type: 'gcj02',
        success: (res) => {
          this.location = { ...res };
          console.log('当前位置:' + JSON.stringify(res));
        },
        fail: (err) => {
          console.error(err);
          // 这里可以处理权限被拒绝的情况
          if (err.errMsg === 'getLocation:fail auth deny') {
            // 引导用户打开权限设置
            uni.showModal({
              title: '提示',
              content: '需要获取您的位置信息,请到设置中打开相关权限',
              success: function (res) {
                if (res.confirm) {
                  // 打开设置页面
                  uni.openSetting({
                    success: function (res) {
                      console.log(res.authSetting);
                      // res.authSetting = { "scope.userLocation": true } 表示已获得权限
                    },
                  });
                }
              },
            });
          }
        },
      });
    },
3)授权后调用uni.chooseLocation打开进入地图选择位置。

此 api 在调用拉起时会发现进入的页面并不会给你一个地图页面以及地点联想,这是因为还需要在App权限模块中勾选MapsMaps下有高德百度Google三家,而我这里就选高德地图。

在这里插入图片描述

用户名的获取:
在这里插入图片描述

appkey_android key 的获取:

你需要在高德开放平台进行操作:

进入高德控制台应用管理我的应用创建新应用添加Key选择服务平台获取SHA1码

在填写一系列指定信息后,即可成功创建。
在这里插入图片描述

如果你不知道SHA1码的获取,在下文中也会提到对应 Mac 平台获取的方式。

appkey_ios key 的获取:

同安卓步骤只不过 iOS 不需要获取SHA1码,仅需要填写Bundle ID
在这里插入图片描述

完成以上步骤后,重新打包自定义调试基座,确保将地图原生插件依赖进去。

重新调用uni.chooseLocation后发现正常的展示了当下前位置,以及附近位置,选择完成后即可获取勾选的位置经纬度,位置名称,详细位置。

在这里插入图片描述

4) 发送位置消息

通过调用环信 uniApp api 发送位置消息来实现位置消息的发送

let option = {
  chatType: 'singleChat',
  type: 'loc',
  to: 'username',
  addr: this.location.address || '未知地址',
  buildingName: this.location.name || '未知建筑名称',
  lat: this.location.latitude,
  lng: this.location.longitude,
};
let msg = WebIM.message.create(option);
conn
  .send(msg)
  .then((res) => {
    console.log('Send message success', res);
  })
  .catch((e) => {
    console.log('Send message fail', e);
  });

该 api 相关文档:
环信-发送位置消息

第二步:渲染展示位置消息气泡

1) 创建高德地图 Web 平台 Key

静态地图的使用需要创建 Web 平台的 Key,该 Key 会在拼接静态地图 URL 时用到。

https://restapi.amap.com/v3/staticmap?location=116.481485,39.990464&zoom=10&size=750*300&markers=mid,,A:116.481485,39.990464&key=<用户的key>

在这里插入图片描述

2) 拿经纬度置换可用的静态地图资源图片

通过解析发送或者接收到的位置消息中的经纬度,调用高德地图静态地图 api,从而获取对应坐标的静态地图。

msgBody 即为环信收发位置消息的消息体。

    <img
      class="map_image_container"
      :src="`${AMAP_API_URL}${location}&zoom=10&size=400*200&scale=1&markers=mid,,A:${msgBody.lng},${msgBody.lat}&key=${AMAP_KEY}`"
    />

const AMAP_KEY = 'YOUR KEY';
const AMAP_API_URL = 'https://restapi.amap.com/v3/staticmap?';
const location = () => {
      return `location=${this.msgBody.lng},${this.msgBody.lat}`;
    },
3)展示位置名以及详细地址
   <view class="location_msg_container" @click="openMap">
    <u--text
      :lines="1"
      :text="msgBody.buildingName ? msgBody.buildingName : '未知建筑'"
    ></u--text>
    <u--text
      :lines="1"
      :text="msgBody.addr ? msgBody.addr : '未知建筑'"
    ></u--text>
    <img
      class="map_image_container"
      :src="`${AMAP_API_URL}${location}&zoom=10&size=400*200&scale=1&markers=mid,,A:${msgBody.lng},${msgBody.lat}&key=${AMAP_KEY}`"
    />
  </view>

第三步:点击位置消息气泡跳转详细位置地图

 openMap() {
      uni.openLocation({
        latitude: this.msgBody.lat,
        longitude: this.msgBody.lng,
        success: function () {
          console.log('success');
        },
      });

相关效果展示

选择位置

点击选择位置
在这里插入图片描述

位置消息在消息列表的渲染效果

在这里插入图片描述

点击消息气泡查看详细位置

在这里插入图片描述

遇到的问题

问题一: getLocation失败,不支持gcj02坐标系。

在这里插入图片描述

{
    "errMsg": "getLocation:fail not support gcj02",
    "errCode": 18,
    "code": 18
}

解决方式:进行了重新自定义调试基座。

问题二:地图依赖模块未勾选导致的问题。

在这里插入图片描述

解决方式:在mainifest.json勾选地图依赖模块,并重新打包自定义调试基座。

问题三:获取安卓高德 key SHA1 指纹。

为了获取安卓高德 key SHA1 指纹的获取

在这里插入图片描述

以 Mac 举例

1. 下载并安装 Java JDK

如果你还没有安装 Java JDK,可以通过以下步骤安装:

  1. 打开 Oracle JDK 下载页面。
  2. 下载并安装适合你操作系统的 JDK。
2. 使用 keytool 工具获取 SHA1

keytool 工具是 Java 开发工具包 (JDK) 中的一个命令行工具,用于管理密钥和证书。

假设你的 APK 文件名为 your_app.apk 并且存放在 ~/Downloads 目录中。

  1. 打开终端(Terminal)。
  2. 运行以下命令来提取 APK 包中的证书信息:
keytool -printcert -jarfile ~/Downloads/your_app.apk

该命令会显示 APK 包的证书详细信息,包括 SHA1 指纹。

示例输出

  Signature:

  Owner: CN=Your Name, OU=Your Organization, O=Your Company, L=Your City, ST=Your State, C=Your Country
  Issuer: CN=Your Name, OU=Your Organization, O=Your Company, L=Your City, ST=Your State, C=Your Country
  Serial number: 1234567890abcdef
  Valid from: Mon Jul 01 00:00:00 PDT 2021 until: Wed Jun 26 00:00:00 PDT 2041
  Certificate fingerprints:
       SHA1:  AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:00:AA:BB:CC
       SHA256: AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:00:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99
       Signature algorithm name: SHA256withRSA
       Version: 3

从输出中找到 Certificate fingerprints 下的 SHA1 指纹,即为 APK 包的 SHA1 安全码。

注意事项
  1. 确保你使用的 keytool 是 Java JDK 中的工具,默认情况下,keytool 会安装在 /usr/bin 目录中。
  2. 如果你在使用命令时遇到问题,可以尝试指定 keytool 的完整路径,例如 /Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Home/bin/keytool,具体路径根据你安装的 JDK 版本而定。

通过上述步骤,你可以在 Mac 上获取 UniApp 云打包的 APK 包的 SHA1 安全码。

问题四:uni.chooseLocation无法定位的问题。

在这里插入图片描述

该问题在安卓以及 iOS 均有发现,触发时机是在调用选择地图时高频复现,目前暂不确定是否是uni.chooseLocationapi 的异步调用而产生的 bug,在产生时,选择位置界面无法展示设备所在位置。

解决方案:

经测试该方案使该情况有所好转,但是偶尔还是能复现无法定位的情况,如果你知道原因以及解决方案可以评论区留言。

调用uni.chooseLocation时将通过uni.getLocation经纬度坐标一并传入,代码如下:

    chooseLocationData() {
      uni.chooseLocation({
      //获取到的经纬度
        latitude: this.location.latitude,
        longitude: this.location.longitude,
        success: (res) => {
          console.log('位置名称:' + res.name);
          console.log('详细地址:' + res.address);
          console.log('纬度:' + res.latitude);
          console.log('经度:' + res.longitude);
          this.location = Object.assign(this.location, { ...res });
        },
        fail: (err) => {
          console.error(err);
        },
      });
    },

相关文档:

  • 注册环信即时通讯IM:https://console.easemob.com/user/register
  • 如实战中有任何问题,欢迎到IMGeek社区沟通讨论。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

puppeteersharp爬取网页数据

官网 https://github.com/hardkoded/puppeteer-sharp 安装 创建控制台项目&#xff0c;安装PuppeteerSharp 18.1.0 编写代码 安装chrome async static Task Main(string[] args) {//如果Chromium不存在则先下载var browserFetcher new BrowserFetcher();//获取安装的浏览…

redis面试(十三)公平锁排队代码剖析

我们来看一下第二种redis分布式锁 第一种锁是可重入锁&#xff0c;非公平可重入锁&#xff0c;所谓的非公平可重入锁是什么意思呢&#xff1f;胡乱的争抢&#xff0c;根本没有任何公平性和顺序性可言 第二种锁&#xff0c;可重入锁&#xff0c;公平锁 通过公平锁&#xff0c…

haproxy七层代理总结

一、HAProxy概念 1.1 什么是HAProxy&#xff1f; HAProxy是一款开源、高性能的负载均衡器和代理服务器&#xff0c;专为TCP和HTTP应用而设计。它可以将客户端的请求分发到多台后端服务器&#xff0c;从而提高应用的可用性和性能。HAProxy支持多种负载均衡算法和健康检查机制&a…

一篇文章带你学会向量数据库Milvus

一篇文章带你学会向量数据库Milvus 索引管理 Milvus 提供多种索引类型来对字段值进行排序&#xff0c;以实现高效的相似性搜索。它还提供三种度量类型&#xff1a;余弦相似度 (COSINE)、欧几里得距离 (L2) 和内积 &#xff08;IP&#xff09;来测量向量嵌入之间的距离。 建议…

零基础学会机器学习,到底要多久?

这两天啊&#xff0c;有不少朋友和我说&#xff0c;想学机器学习&#xff0c;但是之前没有基础&#xff0c;不知道能不能学得会。 首先说结论&#xff0c;只要坚持&#xff0c;就能学会&#xff0c;但是一定不能三天打鱼两天晒网&#xff0c;要持之以恒&#xff0c;至少每隔两…

小白零基础学数学建模系列-Day4-线性规划基础与案例分析

文章目录 1. 线性规划基础1.1 基本概念1.2 求解方法 2 线性规划经典问题2.1 生产计划问题2. 2 运输问题 案例1&#xff1a;生产计划问题背景模型建立模型求解 案例2&#xff1a;运输问题背景模型建立模型求解 案例3&#xff1a;货机货物装载问题问题背景假设条件问题要求模型建…

【微信小程序】WXSS 模板样式

1. 什么是 WXSS WXSS (WeiXin Style Sheets)是一套样式语言,用于美化 WXML 的组件样式,类似于网页开发中的 CSS。 2. WXSS 和 CSS 的关系 3.rpx (1). 什么是 rpx 尺寸单位 rpx(responsive pixel)是微信小程序独有的,用来解决屏适配的尺寸单位。 (2). rpx 的实现原理 …

哈希表 -四数相加II

454. 四数相加II 方法一&#xff1a;分组哈希表 /*** param {number[]} nums1* param {number[]} nums2* param {number[]} nums3* param {number[]} nums4* return {number}*/ var fourSumCount function(nums1, nums2, nums3, nums4) {const twoSumMap new Map();let coun…

【机器学习之深度学习】深度学习和机器学习的关系以及深度学习的应用场景

引言 深度学习和机器学习是人工智能领域的两个重要分支&#xff0c;它们之间既有联系也有区别 文章目录 引言一、深度学习和机器学习的关系1.1 联系1.2 区别1.2.1 模型复杂度1.2.2 数据需求1.2.3 特征提取1.2.4 训练速度和计算资源 二、深度学习有哪些应用场景2.1 计算机视觉2.…

Unity | AmplifyShaderEditor插件基础(第一集:简单了解ASE和初识)

前言 我本来老老实实的写着我的Shader&#xff0c;群里的小伙伴强烈建议我开始讲ASE&#xff0c;我只能说&#xff0c;我是一个听话的Up。 一、什么是ASE 全称AmplifyShaderEditor&#xff0c;是一个unity插件&#xff0c;存在于unity商城中&#xff0c;售价看他们心情。&am…

deepin V23 前瞻丨深度适配RISC-V架构,打造全面兼容与高性能的开源桌面操作系统

查看原文 中国工程院院士倪光南曾表示&#xff0c;RISC-V架构因其开放性和灵活性&#xff0c;已成为中国CPU领域最受欢迎的选择之一&#xff0c;并有望成为推动新一代信息技术发展的关键驱动力。目前&#xff0c;deepin&#xff08;深度&#xff09;社区已与RISC-V生态系统建立…

ECMAScript6语法:类

在 ES6 中新增了类的概率&#xff0c;多个具有相同属性和方法的对象就可以抽象为类。类和对象的关系如下&#xff1a; &#xff08;1&#xff09;类抽象了对象的公共部分&#xff0c;它泛指某一大类&#xff08;class&#xff09;。 &#xff08;2&#xff09;对象特指通过类…

haproxy 7000字配图超详细教程 从小白到入门

简介&#xff1a;HAProxy是一个免费的负载均衡软件&#xff0c;可以运行于大部分主流的Linux操作系统上。HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力&#xff0c;具备丰富的功能。HAProxy的社区非常活跃&#xff0c;版本更新快速,HAProxy具备媲美商用负载均衡器的性能和稳…

基于python理解最大似然MLE-(简单正态分布估计、高斯混合模型GMM)

最大似然法&#xff08;Maximum Likelihood Estimation&#xff0c;简称MLE&#xff09;是一种统计方法&#xff0c;用于估计概率模型的参数。其基本思想是寻找一组参数值&#xff0c;使得在这组参数下&#xff0c;观测数据出现的概率&#xff08;即似然性&#xff09;最大。这…

ARM64 在线仿真器

今天在晚上找到一个简单的ARM64在线仿真器&#xff0c;它非常适合学习ARM64的指令&#xff0c;在教学中应该很好用。网址ARM64 Online Simulatorhttp://163.238.35.161/~zhangs/arm64simulator/ 它是由康涅狄格州立大学的Shuqun Zhang教授开发的。软件基于Alexandro Sanchez开…

评价算法(topsis熵权法)

评价算法 熵权法 上面箭头的一步用到了带权重的距离公式。 上面是某种求权重的方法&#xff0c;合理就行。 但是在使用熵权法的时候&#xff0c;一定要注意用的是规范化矩阵再用熵权法求权重。 规范化之前一定要判断每一列的性质 #熵权法&#xff1a;import xlrd import num…

巴黎奥运会背后的8K国际公用信号制作

北京时间2024年8月12日凌晨3时&#xff0c;举世瞩目的巴黎奥运会闭幕式在法兰西体育场举行&#xff0c;闭幕式演出部分的主题为“记录”。BOSMA博冠首款8K 50P小型化广播级摄像机B1跟随中央广播电视总台“中国红”8K转播车&#xff0c;为田径比赛和闭幕式提供8K国际公用信号制作…

【Ajax使用说明】Ajax、Axios以及跨域

目录 一、原生Ajax 1.1 Ajax简介 1.2 XML简介 1.3 AJAX 的特点 1.3.1 AJAX的优点 1.3.2 AJAX 的缺点 1.4 AJAX 的使用 1.4.1AJAX的基本操作 1.4.2AJAX的传参 1.4.3 AJAX的post请求及设置请求体 1.4.4 AJAX响应json数据 1.4.5 AJAX请求超时与网络异常处理 1.4.5 AJ…

windows 使用Clion开发FreeSWITCH源码

1.准备环境 window安装clion可以编译freeswitch的docker镜像 2.clion配置ssh和Toolchain的配置 去这里看吧 3.makefile配置 Toolchain记得选ssh的 成功之后左下角有这个小锤子&#xff0c;这个小锤子就是生成makefile文件的&#xff0c;记得点击 同时就会出现这个东西 这样…

长文_ZATA

文章目录 环境配置问题miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 环境配置问题 miniconda安装torch报错OSError: [WinError 126] 找不到指定的模块。 CSDN 原因&#xff1a;fbegmm.dll文件出现问题 解决方案&#xff1a; 使用依赖分析工具https:/…