我目前正在尝试使用环境变量向我的 Flutter 应用程序中的 iOS 和 Android 添加 Google Maps API 密钥,而无需对其进行硬编码。
为此,我遵循了使用 shell 脚本 extract-defines.sh 的指南来解码 DART_DEFINES 并将变量输出到 .xcconfig 文件。我已将此脚本设置为 Xcode 中的预构建操作,但这不起作用。
我不知道如何调试它来检查脚本是否正常工作。
应该提取 dart 定义并将其添加到 xconfig 的 shell 脚本。
#!/bin/sh
OUTPUT_FILE="${SRCROOT}/Flutter/Dart-Defines.xcconfig"
: > $OUTPUT_FILE
function decode_url() { echo "${*}" | base64 --decode; }
IFS=',' read -r -a define_items <<<"$DART_DEFINES"
for index in "${!define_items[@]}"
do
item=$(decode_url "${define_items[$index]}")
# Dart definitions also include items that are automatically defined on the Flutter side.
# However, if we export those definitions, we will not be able to build due to errors, # so we do not output items that start with flutter or FLUTTER.
lowercase_item=$(echo "$item" | tr '[:upper:]' '[:lower:]')
if [[ $lowercase_item != flutter* ]]; then
echo "$item" >> "$OUTPUT_FILE"
fi
done
我将此密钥添加到 Info.plist
<key>GOOGLE_MAPS_API</key> <string>$(GOOGLE_MAPS_API)</string>
现在我正在尝试使用相同的键在 AppDelegate.swift 中配置 Google 地图
import Flutter
import UIKit
import GoogleMaps
@main
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
if let googleMapsApiKey = Bundle.main.object(forInfoDictionaryKey: "GOOGLE_MAPS_API") as? String {
GMSServices.provideAPIKey(googleMapsApiKey)
}
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
我主要遵循我在网上找到的唯一的指南。但我想我可能错过了一些东西。
注意:我也想在 Android 上这样做,但我从 IOS 开始,但遇到了困难
最好的方法是什么?解决了吗