Codemagic 不适用于 iOS 中的自定义运行脚本?

Posted

技术标签:

【中文标题】Codemagic 不适用于 iOS 中的自定义运行脚本?【英文标题】:Codemagic not working for custom run script in iOS? 【发布时间】:2020-05-25 16:49:03 【问题描述】:

我正在尝试在 Codemagic 上构建一个颤振应用程序。该应用程序使用多个 firebase 项目,因此我已相应地对其进行了配置。我能够在本地运行适用于 androidios 的所有版本。 android 构建在 Codemagic 上也成功,但 iOS 构建失败。

在下面的屏幕截图中,您可以在到达 Firebase 设置运行脚本文件后看到 iOS 构建失败

我的 Firebase 设置文件的代码是

environment="default"

# Regex to extract the scheme name from the Build Configuration
# We have named our Build Configurations as Debug-dev, Debug-prod etc.
# Here, dev and prod are the scheme names. This kind of naming is required by Flutter for flavors to work.
# We are using the $CONFIGURATION variable available in the XCode build environment to extract 
# the environment (or flavor)
# For eg.
# If CONFIGURATION="Debug-prod", then environment will get set to "prod".
if [[ $CONFIGURATION =~ -([^-]*)$ ]]; then
environment=$BASH_REMATCH[1]
fi

echo $environment

# Name and path of the resource we're copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
GOOGLESERVICE_INFO_FILE=$PROJECT_DIR/config/$environment/$GOOGLESERVICE_INFO_PLIST

# Make sure GoogleService-Info.plist exists
echo "Looking for $GOOGLESERVICE_INFO_PLIST in $GOOGLESERVICE_INFO_FILE"
if [ ! -f $GOOGLESERVICE_INFO_FILE ]
then
echo "No GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1
fi

# Get a reference to the destination location for the GoogleService-Info.plist
# This is the default location where Firebase init code expects to find GoogleServices-Info.plist file
PLIST_DESTINATION=$BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app
echo "Will copy $GOOGLESERVICE_INFO_PLIST to final destination: $PLIST_DESTINATION"

# Copy over the prod GoogleService-Info.plist for Release builds
cp "$GOOGLESERVICE_INFO_FILE" "$PLIST_DESTINATION"

我正在关注https://medium.com/@animeshjain/build-flavors-in-flutter-android-and-ios-with-different-firebase-projects-per-flavor-27c5c5dac10b 文章进行设置。

这是我按照 Codemagic 团队的建议采用的另一种方法

我没有创建风味,而是将我的 firebase 文件作为环境变量上传到 codemagic。一切都适用于 android,但 iOS 构建失败,提示无法获取 GOOGLE_APP_ID。我知道很多人在堆栈上就这个问题提出过问题,但没有一个对我有用,因为它们与代码魔术无关,而是手动将文件拖到 Xcode。 我还做了一个 SSH 来检查 firebase 文件是否已添加到 iOS 文件夹中,并且确实是在预构建脚本的帮助下添加的,但 iOS 构建仍然失败。

【问题讨论】:

【参考方案1】:

我使用相同的 Medium 文章在本地计算机上设置风味(产品和开发)。 我按照 Codemagic 教程为 Google 服务文件设置环境变量,但一直遇到相同的 Could not get GOOGLE_APP_ID 错误。

对我来说,关键的见解是尽可能在 Codemagic 中复制我的本地环境,并在 Codemagic 构建期间利用 Xcode 中的 Firebase 设置脚本。

就我而言,这意味着为 Runner/Firebase/prod/GoogleService-Info.plist 重新创建完全相同的文件夹和文件结构,以便构建阶段中的 Firebase 设置脚本可以毫无问题地运行。

首先,我更改了 Codemagic 中的预构建脚本,以确保 Firebase 设置脚本可以找到 GoogleService-Info.plist

#!/bin/bash

set -e # exit on first failed commandset

rm -rf $FCI_BUILD_DIR/iOS/Runner/GoogleService-Info.plist

mkdir -p “$FCI_BUILD_DIR/iOS/Runner/Firebase/$FCI_FLUTTER_SCHEME”

echo $IOS_FIREBASE_SECRET | base64 —decode > $FCI_BUILD_DIR/iOS/Runner/Firebase/prod/GoogleService-Info.plist

其次,Xcode 必须知道这些文件。目录中存在的文件并不意味着它在 Xcode 上。通过 File -> Add files to “Runner..” 将Firebase/ 目录添加到 Xcode 中,并确保取消选中“Copy if required”。

如果您已经在本地构建并且没有任何问题,则可以跳过此步骤。

Here is how my folders appear in Xcode

然后使用 FCI_FLUTTER_SCHEME=prod 在 Codemagic 上运行构建。

最后,通读 Codemagic 构建工件中的 xcodebuild.log 可能会为您提供更多详细信息。

【讨论】:

以上是关于Codemagic 不适用于 iOS 中的自定义运行脚本?的主要内容,如果未能解决你的问题,请参考以下文章

iOS本地化在Xcode中不适用于Objective-C中的自定义标签[关闭]

为啥 jQuery .html() 方法不适用于 IE8 中的自定义标签?

`convertFromSnakeCase` 策略不适用于 Swift 中的自定义 `CodingKeys`

JWT 身份验证不适用于 Django 中的自定义控制器

HTTPS 不适用于 Amazon Cloudfront 中的自定义域

UITapGestureRecognizer 不适用于 UITextField 的自定义子类