尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

google_maps_flutter_ios 演进全解析:从联邦插件拆分到 SDK 版本兼容与迁移路线图

google_maps_flutter_ios 演进全解析:从联邦插件拆分到 SDK 版本兼容与迁移路线图 google_maps_flutter_ios 演进全解析从联邦插件拆分到 SDK 版本兼容与迁移路线图【免费下载链接】packagesA collection of useful packages maintained by the Flutter team项目地址: https://gitcode.com/GitHub_Trending/pac/packages本指南以google_maps_flutter_ios的版本变更记录为主线系统梳理该包从 2.1.10 被拆分为google_maps_flutter的 iOS 联邦实现到 2.18.6 为止的全部关键能力演进、SDK 兼容策略、隐私清单处理与架构重构细节同时结合仓库中的 README、Podspec、Pigeon 接口定义与 Objective-C 源码帮助你理解当前维护状态并做出正确的迁移决策。读完本文你将掌握该包的 SDK 选型规则、iOS 版本支持边界、Pigeon 化改造路径以及为何官方建议转向google_maps_flutter_ios_sdk*系列包。一、包的定位默认 iOS 实现与联邦化拆分google_maps_flutter_ios是google_maps_flutter的默认 iOS 实现这一点在其 README 开篇即被明确。该包属于endorsed背书联邦插件当你在pubspec.yaml中直接依赖google_maps_flutter时本包会被自动带入 iOS 构建无需显式声明。拆分发生在版本2.1.10其变更记录写道Splits iOS implementation out ofgoogle_maps_flutteras a federated implementation.——这是理解整个包历史的关键起点此前 iOS 代码直接内嵌在主包中此后则成为独立的联邦实现。对应的 Dart 侧入口 lib/src/google_maps_flutter_ios.dart 中GoogleMapsFlutterIOS extends GoogleMapsFlutterPlatform并实现registerWith()通过GoogleMapsFlutterPlatform.instance GoogleMapsFlutterIOS()完成注册这正是联邦插件标准机制。从 pubspec.yaml 可以确认其插件声明方式flutter: plugin: implements: google_maps_flutter platforms: ios: pluginClass: FGMGoogleMapsPlugin dartPluginClass: GoogleMapsFlutterIOS即原生侧入口为FGMGoogleMapsPluginObjective-C 类见 FGMGoogleMapsPlugin.mDart 侧入口为GoogleMapsFlutterIOS。二、版本演进主线SDK 兼容矩阵与 iOS 部署目标CHANGELOG 中最具决策价值的信息是该包如何跟随 Google Maps iOS SDKGoogleMaps 框架版本与 iOS 系统版本演进。整理如下包版本GoogleMaps SDK 支持iOS 部署目标关键说明2.2.0—iOS 11更新最小 Flutter 版本为 3.32.3.3SDK 8iOS 14 应用—引入 SDK 8 支持2.4.0—移除 iOS 11新增 arm64 模拟器支持2.6.0最低 SDK 8.4不再支持 iOS 13/14 应用为隐私清单支持抬高下限2.8.0SDK 9.xiOS 15 应用—引入 SDK 9 支持2.16.0SDK 10.xiOS 16 应用—引入 SDK 10 支持2.18.xSDK 8.4 / 9.x / 10.x 自适应iOS 14.0Podspec停止新功能迭代2.1 自动选择 SDK 版本的机制README 明确指出This package will use Google Maps SDK 8.4, 9.x, or 10.x, depending on your applications minimum deployment target. 这一动态选择逻辑写入 google_maps_flutter_ios.podspecs.dependency GoogleMaps, 8.4, 11.0 s.dependency Google-Maps-iOS-Utils, 5.0, 7.0 s.platform :ios, 14.0 s.swift_version 5.9依赖约束的含义GoogleMaps 8.48.4 是首个支持隐私清单privacy manifest的 SDK 版本见 2.6.0 的说明GoogleMaps 11.010.x 是预期中最后一个通过 CocoaPods 发布的 SDK 大版本2.2.2 首次设置 SDK 上限to avoid future breakageGoogle-Maps-iOS-Utils是静态框架s.static_framework true且包含 Swift 类因此需要swift_version与LIBRARY_SEARCH_PATHS等 xcconfig 支持在未开启use_frameworks!时找到 Swift 运行时。2.2 Podspec 中的工具库版本配比Podspec 注释给出了 Google-Maps-iOS-Utils 与 GoogleMaps SDK 的对应关系5.x 支持 GoogleMaps 8.x 与 iOS 14.06.0 / 6.1.0 支持 GoogleMaps 9.x 与 iOS 15.06.1.3 支持 GoogleMaps 10.x 与 iOS 16.0。依赖上限 7.0保证工具库与 SDK 组合始终落在已验证的范围内。三、为什么停止新功能迭代SDK 发布渠道与 SwiftPM 的冲突CHANGELOG 2.18.5 与 README 都明确宣告该包进入维护冻结状态不再接收新功能更新。原因在 README 中讲得很清楚Google Maps iOS SDK 预计不再通过 CocoaPods 发布 10.x 之后的版本本包依赖 Podspec 的s.dependency自动按部署目标选择 SDK 版本而Swift Package ManagerSwiftPM不支持这种按最低部署目标自动选版本的机制因此本包无法支持 SwiftPM只能继续使用 CocoaPods。CHANGELOG 2.17.0 的 Restructures code to prepare for SwiftPM support 与 2.17.3 的 README 补充说明是这一进程的过渡痕迹最终结论是要使用 SwiftPM、要跟上未来 SDK 大版本必须迁移到 SDK 专属包。3.1 推荐的替代实现README 明确推荐的迁移目标google_maps_flutter_ios_sdk9面向 iOS 15 应用google_maps_flutter_ios_sdk10面向 iOS 16 应用。选择逻辑除非你的应用必须支持 iOS 14否则应优先使用 SDK 专属包。迁移后可以改用 SwiftPM 代替 CocoaPods并可在未来使用 10.x 之后的新 SDK 大版本。四、接入与配置API Key 设置与示例工程本包是自动包含的正常使用google_maps_flutter即可。只有当你直接import本包以使用其 API 时才需要显式加入pubspec.yaml。API Key 在 iOS 应用委托中配置。仓库示例工程 AppDelegate.swift 展示了两种取值方式import Flutter import GoogleMaps import UIKit main objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) - Bool { var mapsApiKey ProcessInfo.processInfo.environment[MAPS_API_KEY] ?? YOUR KEY HERE GMSServices.provideAPIKey(mapsApiKey) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) { GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry) } }即优先从环境变量MAPS_API_KEY读取便于 CI 注入回退到占位字符串。同时注意该工程采用了FlutterImplicitEngineDelegate形式的插件注册。五、能力演进图谱按功能梳理的版本里程碑CHANGELOG 记录了大量功能增量按主题归并如下便于对照升级5.1 地图对象与图层2.11.0热力图图层heatmap layers2.12.0标记聚类marker clustering2.14.0地面覆盖物ground overlay并附带 iOS 特有约束2.6.1折线图案patterns in polylines。地面覆盖物在 iOS 上有明确的平台约束Dart 侧在 google_maps_flutter_ios.dart 中通过assert强制执行On iOS zoom level must be set when position is set for ground overlays.——即 iOS 上position与zoomLevel必须成对设置否则触发断言失败_buildView中同样有此断言。5.2 标记Marker能力2.18.0高级标记advanced markers支持2.15.4弃用zIndex参数改用zIndexInt避免 32 位整型精度问题源码中_platformMarkerFromMarker已直接读取marker.zIndexInt2.17.2修复自定义标记图标回归2.15.2修复更新标记时信息窗口info window被隐藏的回归2.15.1修复信息窗口显示回归2.3.2修复标记onDragEnd回调不触发的 bug2.7.0新增AssetMapBitmap与BytesMapBitmap位图描述符。5.3 相机与样式2.15.0支持带时长的相机动画animateCameraWithConfigurationDart 侧将configuration.duration以毫秒传入 Pigeon 接口2.5.0MapConfiguration.style与getStyleError支持2.3.0cloudMapId参数支持云端地图样式。地图样式错误处理在 Dart 侧有明确实现setMapStyle调用 Pigeon 的setStyle若返回非空错误描述则抛出MapStyleException。5.4 截图与瓦片2.4.2修复 iOS 17 上takeSnapshot返回空白图的 bug2.5.1瓦片回调改为在平台线程调用平台通道2.5.2修复真机上瓦片覆盖层显示异常2.18.4修复瓦片降采样tile downscaling潜在编译问题。瓦片请求链路可从 google_maps_flutter_ios.dart 的HostMapMessageHandler.getTileOverlayTile看到原生侧回调请求瓦片 → Dart 侧从_tileOverlays缓存查找对应TileOverlay→ 调用其tileProvider.getTile(x, y, zoom)返回Tile找不到 provider 时返回TileProvider.noTile。5.5 事件与交互事件模型基于 Dart 侧广播流StreamControllerMapEventObject?.broadcast()每个 mapId 通过_events(mapId)过滤出对应事件流。CHANGELOG 中与事件相关的主要是2.10.0 / 2.9.0 / 2.8.2将 Obj-C → Dart 调用、额外平台调用、inspector 接口平台调用逐步转为 Pigeon最终HostMapMessageHandler implements MapsCallbackApi统一承载相机事件、标记事件、聚合事件、瓦片请求等回调。六、架构重构Pigeon 化与测试性改造CHANGELOG 呈现出清晰的架构演进脉络2.8.1改进 Objective-C 类型处理2.8.2 → 2.10.0分三批将平台调用迁移到 Pigeon 生成代码2.13.0地图配置与平台视图创建参数改为 Pigeon 结构2.13.1Pigeon 支持非空集合类型2.15.7更新至 Pigeon 262.17.0为 SwiftPM 支持重构代码结构2.17.1重构以提升可测试性2.17.4标准化 Objective-C 类名统一FGM前缀2.18.6Pigeon dev_dependency 更新至 ^27.3.2兼容 analyzer 14。Pigeon 定义位于 pigeons/messages.dart配置要点ConfigurePigeon( PigeonOptions( dartOut: lib/src/messages.g.dart, objcHeaderOut: ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/include/ google_maps_flutter_ios/google_maps_flutter_pigeon_messages.g.h, objcSourceOut: ios/google_maps_flutter_ios/Sources/google_maps_flutter_ios/ google_maps_flutter_pigeon_messages.g.m, objcOptions: ObjcOptions(prefix: FGM), copyrightHeader: pigeons/copyright.txt, dartPackageName: google_maps_flutter_ios, ), )其中 ObjC 前缀FGMFlutter Google Maps贯穿所有原生类名。Dart 侧通过MapsApi(messageChannelSuffix: mapId.toString())按 mapId 建立独立通道UnknownMapIDError在访问未注册 mapId 时抛出。测试侧相应建设了 mock 体系test/google_maps_flutter_ios_test.mocks.dart与原生单测如 RunnerTests 下的MarkerControllerTests.swift、HeatmapControllerTests.swift等。6.1 视图工厂注册原生入口 FGMGoogleMapsPlugin.m 完成两件事[registrar registerViewFactory:googleMapFactory withId:plugins.flutter.dev/google_maps_ios gestureRecognizersBlockingPolicy: FlutterPlatformViewGestureRecognizersBlockingPolicyWaitUntilTouchesEnded]; if ([GMSServices respondsToSelector:selector(addInternalUsageAttributionID:)]) { [GMSServices addInternalUsageAttributionID:gmp_flutter_googlemapsflutter_ios]; }注册平台视图工厂plugins.flutter.dev/google_maps_ios与 Dart 侧UiKitView(viewType: plugins.flutter.dev/google_maps_ios, ...)对应采用等待触摸结束的手势识别器阻塞策略通过respondsToSelector条件判断调用 SDK 9.2 才有的addInternalUsageAttributionID:对应 CHANGELOG2.18.2的Adds attribution ID for Google Maps SDK usage。七、隐私清单Privacy Manifest的完整处理隐私清单是 iOS 14.5 以来 App Store 审核的硬性要求CHANGELOG 记录了两个关键节点2.3.6新增隐私清单2.6.0将 Google Maps SDK 的GoogleMapsPrivacybundle 清单条目直接内联进插件客户端无需手动添加该隐私 bundle同时将最低 SDK 抬升至 8.4首个带隐私清单的版本这也意味着发布应用不能再支持 iOS 13/14对应版本 SDK 无隐私清单无法通过新审核执行。仓库中的 PrivacyInfo.xcprivacy 是这一内联策略的实现证据其注释明确写道这些条目并非插件自身收集数据而是内联了随 Google Maps 8.4 分发的补充清单。内容包含NSPrivacyTracking false无跟踪域NSPrivacyCollectedDataTypes声明 5 类数据崩溃数据CrashData、设备 IDDeviceID、性能数据PerformanceData、产品交互ProductInteraction、用户 IDUserID用途为 Analytics / App Functionality其中仅 UserID 标记为Linked trueNSPrivacyAccessedAPITypes声明 4 类 API 访问及合规理由磁盘空间85F4.1、文件时间戳C617.1、系统启动时间35F9.1、UserDefaults1C8F.1。在 Podspec 中该清单被打包为独立资源 bundles.resource_bundles {google_maps_flutter_ios_privacy [google_maps_flutter_ios/Sources/google_maps_flutter_ios/Resources/PrivacyInfo.xcprivacy]}八、平台兼容性细节与构建注意事项8.1 arm64 模拟器与 iOS 12 的波折2.4.0新增 arm64 模拟器支持同时移除 iOS 11 支持2.4.1恢复排除 arm64 模拟器构建的 workaround因为对iOS 12目标的应用仍然必要。这提醒我们arm64 模拟器支持并非无条件可用仍取决于应用部署目标。8.2 SDK 版本约束2.2.2为 GoogleMaps SDK 设置上限避免未来版本破坏构建2.6.0Google-Maps-iOS-Utils依赖随之调整2.15.6修复向地图添加对象时默认属性值的闪烁问题。8.3 UIScene 与 add-to-app2.17.5增加 UIScene 兼容2.18.1移除破坏 add-to-app 构建的条件头文件逻辑2.1.13从示例工程 Podfile 移除多余的RunnerUITeststarget。九、数据通信的演进从手写通道到类型化 PigeonCHANGELOG 中反复出现 typed data 与 Pigeon 字样反映数据层逐步类型化的过程2.13.2大多数从 Dart 传到原生的对象改用类型化数据2.16.1Dart 与原生间传递的热力图数据改用类型化数据对应PlatformHeatmap中data字段为ListPlatformWeightedLatLng2.13.0地图配置与平台视图创建参数改为 Pigeon 生成结构对应 Dart 侧_buildView中PlatformMapViewCreationParams携带 initialMarkers / initialPolygons / initialCircles / initialHeatmaps / initialTileOverlays / initialClusterManagers / initialGroundOverlays 等全部初始对象。这种类型化改造的收益从 google_maps_flutter_ios.dart 可见一斑每个平台对象都有对应的转换函数_platformMarkerFromMarker、_platformCircleFromCircle、_platformHeatmapFromHeatmap等以及针对跨包枚举值如MarkerCollisionBehavior、MapBitmapScaling的防御性 fallback——The enum comes from a different package, which could get a new value at any time在 switch 之外提供兜底值避免平台接口包新增枚举时破坏本包。十、维护状态小结与升级建议综合 CHANGELOG 与 README当前状态可总结为本包2.18.x处于维护冻结仅接收 bug 修复与必要的工具链更新不再添加新功能SDK 天花板为 10.x受限于 GoogleMaps SDK 未来不再通过 CocoaPods 发布新版本不支持 SwiftPM只能使用 CocoaPods适用场景需要支持 iOS 14 的存量应用、暂时无法迁移到 SDK 专属包的工程迁移路径iOS 15 选google_maps_flutter_ios_sdk9iOS 16 选google_maps_flutter_ios_sdk10迁移后获得 SwiftPM 支持与未来 SDK 大版本跟进能力。版本选择方面若你正在使用google_maps_flutter可通过本包的 CHANGELOG 反查能力边界需要高级标记至少 2.18.0需要地面覆盖物至少 2.14.0需要标记聚类至少 2.12.0需要热力图至少 2.11.0需要带时长相机动画至少 2.15.0。这些能力基线可作为依赖升级与功能规划的直接依据。【免费下载链接】packagesA collection of useful packages maintained by the Flutter team项目地址: https://gitcode.com/GitHub_Trending/pac/packages创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表