C# Maui iOS调用Google Roads API遇「该平台不支持操作」错误
我尝试使用Google API Roads库实现道路匹配功能,调用异步方法:
GoogleMaps.Roads.SnapToRoad.QueryAsync(request).GetAwaiter();
运行代码时触发错误:Operation is not supported on this platform
最初的代码写法是:
var response = await GoogleMaps.Roads.SnapToRoad.QueryAsync(request).Result;
但这要求调用该代码的方法必须标记为async,只是把问题转移到了调用栈更早的位置。
我也无法使用OnCompleted,因为它需要先调用GetAwaiter,完全搞不清问题出在哪里。
设备环境:iOS 16.7.4、Xcode 15.2、Visual Studio 17.8.6
编辑:已更新为异步Task函数
依然在以下代码处触发相同错误:
var response = await GoogleMaps.Roads.SnapToRoad.QueryAsync(request);
当前完整代码如下:
public static async Task<List<Position>> snapToRoad(List<Position> gpsPos) { List<Position> result = new List<Position>(); List<List<Position>> subLists = ListExtensions.ChunkBy<Position>(gpsPos, 100); foreach (List<Position> gPos in subLists) { Coordinate[] requestPath = gPos .Select(geo => new Coordinate((double)geo.Latitude, (double)geo.Longitude)) .ToArray(); SnapToRoadsRequest request = new SnapToRoadsRequest { Key = MAPS_KEY, Path = requestPath }; var response = await GoogleMaps.Roads.SnapToRoad.QueryAsync(request); foreach (SnappedPoint sp in response.SnappedPoints) { result.Add(new Position(sp.Location.Latitude, sp.Location.Longitude)); } } return result; }
该方法由按钮点击事件启动的新线程调用:
async void btnSomething_Click(object sender, EventArgs e) { Thread trd = new Thread(async () => { var snapped = await MapUtils.snapToRoad(rawCordList); }); trd.IsBackground = true; trd.Start(); }
移除手动创建的Thread,改用原生异步等待
你在Thread内部使用异步委托会破坏异步上下文,iOS平台对非UI线程的异步操作有严格限制。直接在按钮事件中异步调用即可,无需手动开线程:async void btnSomething_Click(object sender, EventArgs e) { var snapped = await MapUtils.snapToRoad(rawCordList); // 此处可处理返回结果,Xamarin.Forms的await会自动切回UI线程更新界面 }检查Google Maps Roads库的平台兼容性
错误提示“Operation is not supported on this platform”大概率是库版本与iOS 16.7.4不兼容:- 更新对应NuGet包到最新稳定版
- 查看库文档,确认是否支持iOS 16.x版本
禁止混用
.Result和await
最初代码中的await ... .Result是错误用法,会导致死锁,直接使用await即可,这也是你更新代码的正确方向,但要保证调用链的异步上下文正确。确认API密钥权限
登录Google Cloud控制台,检查API密钥是否开启了Roads API权限,并且允许当前iOS应用的Bundle ID访问(若设置了应用限制)。部分库会将权限错误包装为平台不支持的异常。
内容的提问来源于stack exchange,提问作者Pontus Holmberg

