使用 Google 登录两个目标

Using Google Sign-in with two targets

有个问题想不通,到处找了找

我最近添加了 Google 登录到我的应用程序,它在主要目标上运行良好,但是,由于我使用多个目标来部署我的应用程序的第二个版本,第二个包无法将标识符添加到 "GoogleService-Info.plist"。 Google 登录代码按名称引用此文件,因此我不能像为其他 plist 所做的那样简单地更改应用程序每个版本的名称。

我已经尝试向每个方案添加环境变量并在 plist 中使用 ${BUNDLE_ID} 以根据所选方案进行更改,但它也不起作用。有什么我想念的吗?具有多个目标的工作区应该如何使用相同的 plist 为每个目标使用不同的变量?

谢谢!

编辑:尝试使用 XCConfig 文件将 plist 中的静态值替换为编译时变量。运气不好,可能是因为我认为 Google 登录正在直接访问文件。我假设任何使用 Google 登录具有多个目标(广告支持与付费高级)的应用程序的人都必须有办法解决这个问题。请帮忙。

我遇到了同样的问题。我有四个不同的目标,它们需要使用相同的 GoogleService-Info.plist 文件但具有不同的 bundleID。 我偶然发现了这个 excellent article from Restless Thinker,它为这个确切的问题提供了解决方案。

PlistBuddy 是 Apple 和 built-in 在 OSX.!

中提供的免费工具

PlistBuddy 可以创建和修改 plist 文件。 Here's a great tutorial by Fotis。他让它看起来像小菜一碟。

首先检查 GoogleService-Info.plist 文件是否列在每个目标的构建阶段>复制包资源下。这应该已经到位,但重新检查不会有什么坏处。如果文件不存在,请添加该文件。

接下来您需要为每个目标创建一个新的构建阶段。转到您的项目>目标>Select您的目标>构建阶段 检查构建阶段屏幕的 top-left 区域是否有 + 按钮。

添加一个新的自定义阶段。 (您可能已经有了 运行 脚本阶段,在这种情况下,只需在现有命令之后继续添加命令)

Select New 运行 Script Phase 然后在打开的新框中输入您的 PlistBuddy 命令

/usr/libexec/PlistBuddy -c "Set :BUNDLE_ID ${PRODUCT_BUNDLE_IDENTIFIER}" $BUILT_PRODUCTS_DIR/$TARGET_NAME.app/GoogleService-Info.plist

确保您的 .app(在产品下)文件名与您的目标名称相同,否则这将不起作用。您可以 $TARGET_NAME.app 使其与您的 project.app 名称相同。

您可以通过这种方式更改更多值,只需在脚本中添加另一行。 您至少需要再添加两行才能更改 CLIENT_ID 和 REVERSE_CLIENT_ID.

/usr/libexec/PlistBuddy -c "Set :CLIENT_ID 123456789012-abcdefghijklmnopqrstuvwxyzabcdefghijklm.apps.googleusercontent.com" $BUILT_PRODUCTS_DIR/$TARGET_NAME.app/GoogleService-Info.plist
/usr/libexec/PlistBuddy -c "Set :REVERSED_CLIENT_ID com.googleusercontent.apps.123456789012-abcdefghijklmnopqrstuvwxyzabcdefghijklm" $BUILT_PRODUCTS_DIR/$TARGET_NAME.app/GoogleService-Info.plist

您可能需要清洁它才能正常工作。在设备上构建和 运行。 在设备上安装时,您可能需要选中 运行 脚本下方的小方框,其中显示 'Run script only when installing'。当我未选中此框时,XCode 一直引用我的旧派生数据。

使用 PlistBuddy,您可以根据目标更改任何 plist 值。希望这对您有所帮助。

我遇到了同样的问题,我找到了一个非常简单的解决方案。

只需复制 GoogleServices-Info.plist 并将其放在不同的文件夹中。该文件夹必须是物理上不同的文件夹,因为文件系统不会接受同一文件夹中的相同文件名。所以在finder中创建一个真正的文件夹并将其添加到XCode,不要使用XCode组。

然后根据每个plist文件更改目标成员。而已!


为每个目标制作一个单独的 plist 文件并在它们之间动态切换。 为此,您可以查看答案 here