使用带有两个目标的Google登录

时间:2015-07-28 18:06:30

标签: ios google-signin

我有一个我无法弄清楚的问题,我到处搜索过。

我最近在我的应用中添加了Google登录,但它在主要目标上工作正常,但是,因为我使用多个目标来部署我的应用的辅助版本,所以第二个捆绑标识符无法添加到“GoogleService-Info.plist”。 Google登录代码按名称引用此文件,因此我不能像我为其他plist所做的那样简单地更改每个应用版本的名称。

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

谢谢!

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

3 个答案:

答案 0 :(得分:27)

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

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

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


答案 1 :(得分:7)

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

PlistBuddy是Apple提供的免费工具,内置于OSX中。!

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

首先,您要检查GoogleService-Info.plist文件是否列在每个目标的Build Phases> Copy Bundle资源下。这应该已经到位,但重新检查不会受到伤害。如果文件不存在,请添加该文件。

您需要做的下一件事是为每个目标创建一个新的构建阶段。转到您的项目>目标>选择您的目标>构建阶段 检查Build Phases屏幕的左上角区域是否有+按钮。

添加新的自定义阶段。 (您可能已经有Run Script阶段,在这种情况下,只需在现有命令之后继续添加命令)

选择新建运行脚本阶段,然后在打开的新框中输入您的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

您可能需要清理它才能正常工作。在设备上构建和运行。 您可能需要检查“运行脚本”下的小方框,其中显示“仅在安装'时运行脚本”。在设备上安装时。当我未选中此框时,XCode会继续引用我的旧Derived数据。

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

答案 2 :(得分:0)

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