在地图上看到好友:Messenger + Mapbox实现iOS好友位置共享完整教程(含隐私模式)
【免费下载链接】MessengeriOS - Real-time messaging app 🎨项目地址: https://gitcode.com/gh_mirrors/messe/Messenger
Messenger(内部项目名 mChat)是一款基于 Swift 的 iOS 实时即时通讯 App,除了聊天、好友申请和共享媒体外,它还内置了一个很实用的功能——在 Mapbox 地图上实时看到好友的位置。只要好友没有开启「Incognito 隐私模式」,他们的头像标记就会出现在你的地图上,并且位置每 20 秒自动刷新一次。本教程带你完整跑通这一 iOS 好友位置共享功能,并讲清楚隐私模式的开关逻辑。
一、功能全貌:地图页能做什么?
打开底部 Tab 栏的地图入口,你会看到一个全屏的 Mapbox 地图(MGLMapView),其中包含:
- 🔵你自己的位置:一个蓝色定位点,点击后弹出个人信息卡片,显示当前匿名模式状态
- 📍好友的位置标记:每个开放位置共享的好友都会显示为头像图钉,副标题实时显示「Online」或「最后上线时间」
- 💬一键跳转聊天:点击好友图钉后,底部会弹出一张信息卡,直接点进去就能开始私聊
- ⚙️地图设置:右上角齿轮按钮可切换 6 种地图样式、开关隐私模式
二、技术架构:实时位置共享是怎么实现的?
整个位置共享功能由三个模块协作完成,理解它们的关系是读懂源码的关键:
| 模块 | 文件路径 | 职责 |
|---|---|---|
| 地图主界面 | Messenger/mChat/Controllers/Maps/MapsVC.swift | 展示全屏地图、管理定位权限、渲染好友标记 |
| 实时订阅 | Messenger/mChat/Controllers/Maps/MapsNetworking.swift | 监听 Firebase 中好友位置变化,动态增删图钉 |
| 位置上报 | Messenger/mChat/Networking/ChatKit.swift | 每 20 秒把「我」的经纬度写入 Firebase 的user-Location节点 |
数据流非常简洁:你的 App 每隔 20 秒向 Firebase 写入一次经纬度;好友端订阅同一个节点,数据一变就收到推送,然后更新地图上的图钉位置。整个过程无需轮询,天然实时。
三、运行项目:配置 Mapbox 令牌完整步骤
想让地图真正渲染出来,只需完成两步配置:
- 注册 Mapbox 账号:前往 Mapbox 官网创建一个 Access Token(免费额度即可用于开发调试)
- 写入 Info.plist:在项目的
Messenger/mChat/Info.plist中新增一个名为MGLMapboxAccessToken的 Key,把 Token 粘贴为 Value
💡 完整运行指南见项目根目录的
README.md,其中还列出了 Firebase 配置等前置步骤。
配置完成后用 Xcode 打开Messenger/mChat.xcodeproj,Podfile 会自动拉取 Mapbox、Firebase 等依赖,直接运行即可。

四、隐私模式(Incognito):位置共享的安全开关
很多人最关心的就是隐私问题。Messenger 的设计是:位置共享默认关闭——用户注册时isMapLocationEnabled字段初始值就是false(见Messenger/mChat/Controllers/Auth Controllers /Auth Helpers/AuthNetworking.swift)。
打开地图设置页(Messenger/mChat/Controllers/Maps/MapsSettings/MapsSettingsVC.swift),顶部有一行灰色说明文字:
If Incognito mode is turned on, your location won't be visible on the map to your friends.
操作逻辑一目了然:
- 📴Incognito 开启→ 不向 Firebase 写入位置,好友地图上看不到你
- 📡Incognito 关闭→ 启动 20 秒定时器上报位置,你的标记才会出现在好友地图上
开关状态会实时同步到云端users节点,好友端拉取到该字段变化后,会自动把对应图钉从地图上移除或保留,不需要互相打招呼。
五、进阶玩法:6 种 Mapbox 地图样式一键切换
地图页右上角的齿轮按钮进入设置后,可以选择你偏好的地图皮肤。样式定义在Messenger/mChat/Controllers/Maps/MapsSettings/MapStylesCell.swift中,共 6 种:
| 样式名称 | Mapbox Style |
|---|---|
| Streets Style | streets-v11 |
| Light Style | light-v10 |
| Dark Style | dark-v10 |
| Satellite Style | satellite-v9 |
| Satellite Light Style | navigation-preview-day-v4 |
| Satellite Dark Style | navigation-preview-night-v4 |
选择后立即生效,偏好会保存到本地 CoreData(selectedMapUrl字段),下次启动自动沿用。

六、总结:这个实现值得学习的 3 个点
- 实时性设计:用 Firebase 实时数据库 +
observe(.value)订阅代替轮询,代码少且延迟低(参考 MapsNetworking.swift 中的observeFriendLocation方法) - 隐私优先:默认关闭共享、开关与上报解耦,是位置类功能的标准姿势
- 体验闭环:地图 → 好友图钉 → 聊天页的跳转路径只有两步,位置信息直接转化为社交动作
如果你正在做自己的 iOS 社交 App,这套「Mapbox + Firebase + 隐私开关」的组合可以直接借鉴。打开Messenger/mChat/Controllers/Maps/目录,所有相关源码都在里面,欢迎深入研读 🚀
【免费下载链接】MessengeriOS - Real-time messaging app 🎨项目地址: https://gitcode.com/gh_mirrors/messe/Messenger
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考