如何在MAUI应用中实现页面打开时通过SMS分享谷歌地图实时位置追踪?
MAUI实现页面打开时自动通过SMS分享谷歌地图实时位置链接方案
权限配置
首先需要在各平台配置必要的权限:
Android (Platforms/Android/AndroidManifest.xml)
添加以下权限声明:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.SEND_SMS" /> <!-- 如需后台持续获取位置,添加以下权限 --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
iOS (Platforms/iOS/Info.plist)
添加权限描述:
<key>NSLocationWhenInUseUsageDescription</key> <string>需要获取您的位置以分享实时位置</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>需要在后台获取您的位置以保持实时分享</string> <key>NSMessagesUsageDescription</key> <string>需要发送SMS分享位置链接</string>
核心实现代码
创建一个位置共享服务类,封装权限检查、位置获取、链接生成和SMS发送逻辑:
using Microsoft.Maui.Devices.Sensors; using Microsoft.Maui.ApplicationModel; using System; using System.Threading.Tasks; public class LocationSharingService { private bool _isSharing; private readonly string _recipientPhoneNumber = "替换为接收方手机号"; // 修改为目标手机号 // 检查并请求必要权限 private async Task<bool> ValidatePermissions() { // 位置权限 var locationStatus = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>(); if (locationStatus != PermissionStatus.Granted) { locationStatus = await Permissions.RequestAsync<Permissions.LocationWhenInUse>(); if (locationStatus != PermissionStatus.Granted) return false; } // SMS权限 var smsStatus = await Permissions.CheckStatusAsync<Permissions.Sms>(); if (smsStatus != PermissionStatus.Granted) { smsStatus = await Permissions.RequestAsync<Permissions.Sms>(); if (smsStatus != PermissionStatus.Granted) return false; } return true; } // 获取当前位置并生成谷歌地图链接 private async Task<string> GenerateGoogleMapsLink() { var location = await Geolocation.GetLastKnownLocationAsync(); if (location == null) { location = await Geolocation.GetLocationAsync(new GeolocationRequest { DesiredAccuracy = GeolocationAccuracy.High, Timeout = TimeSpan.FromSeconds(10) }); } if (location == null) return null; // 注意:此为静态位置链接,若要实现真正的实时追踪,需结合谷歌Location Sharing API // 谷歌实时共享API需要用户授权并生成专属共享链接,需自行对接谷歌开发者服务 return $"https://www.google.com/maps?q={location.Latitude},{location.Longitude}&ll={location.Latitude},{location.Longitude}&z=15"; } // 发送SMS消息 private async Task SendLocationSms(string link) { try { await Sms.Default.SendAsync(_recipientPhoneNumber, $"我的实时位置:{link}"); } catch (Exception ex) { Console.WriteLine($"SMS发送失败:{ex.Message}"); } } // 启动位置共享流程 public async Task StartSharing() { if (_isSharing) return; if (!await ValidatePermissions()) { Console.WriteLine("权限不足,无法启动位置分享"); return; } _isSharing = true; var locationLink = await GenerateGoogleMapsLink(); if (string.IsNullOrEmpty(locationLink)) { Console.WriteLine("无法获取有效位置"); _isSharing = false; return; } await SendLocationSms(locationLink); // 如需持续更新位置,取消注释以下代码监听位置变化 // Geolocation.LocationChanged += OnLocationUpdated; } // 位置更新事件处理(可选) private void OnLocationUpdated(object sender, GeolocationLocationChangedEventArgs e) { var updatedLink = $"https://www.google.com/maps?q={e.Location.Latitude},{e.Location.Longitude}&ll={e.Location.Latitude},{e.Location.Longitude}&z=15"; // 建议添加频率控制,避免频繁发送SMS // SendLocationSms(updatedLink); } // 停止位置共享 public void StopSharing() { _isSharing = false; // Geolocation.LocationChanged -= OnLocationUpdated; } }
页面触发逻辑
在目标页面的生命周期方法中调用共享服务:
public partial class ShareLocationPage : ContentPage { private readonly LocationSharingService _sharingService; public ShareLocationPage() { InitializeComponent(); _sharingService = new LocationSharingService(); } protected override async void OnAppearing() { base.OnAppearing(); await _sharingService.StartSharing(); } protected override void OnDisappearing() { base.OnDisappearing(); _sharingService.StopSharing(); } }
关键说明
- 实时追踪的局限性:上述代码生成的是静态位置链接,若要实现接收方实时追踪发起方位置,需对接谷歌Location Sharing API,该API允许生成用户专属的实时共享链接,接收方打开后可查看动态位置更新。
- SMS发送频率:若启用位置持续更新,需添加频率控制(如定时发送),避免因频繁发送SMS被运营商限制。
- 平台兼容性:部分Android机型可能需要额外配置SMS发送权限,iOS上需确保用户授予消息发送权限。
内容的提问来源于stack exchange,提问作者vineeth pv
相关产品推荐
相关产品推荐

