对不同的构建方案使用不同的GoogleService-Info.plist

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对不同的构建方案使用不同的GoogleService-Info.plist相关的知识,希望对你有一定的参考价值。

我正在使用prod的构建方案和一个用于暂存的构建方案(具有2个不同的bundle标识符),我正在尝试为每个方案使用单独的GoogleService-Info.plist。在初始化GCM(和goole登录)时,有没有办法手动选择要使用的plist文件?或者是否可以避免使用plist并手动进行设置?

谢谢!

答案

细节

测试:

  • Xcode 9.2
  • Xcode 10.2(10E125)

  1. 在项目中创建包含所有Google.plist文件(具有不同名称)的文件夹

enter image description here

  1. 添加运行脚本

enter image description here

不要忘记更改PATH_TO_GOOGLE_PLISTS值

PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/SM2/Application/Firebase"

case "${CONFIGURATION}" in

   "Debug_Staging" | "AdHoc_Staging" )
        cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-dev.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;

   "Debug_Poduction" | "AdHoc_Poduction" | "Distribution" | "Test_Poduction" )
        cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-prod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;

    *)
        ;;
esac

构建方案名称

enter image description here

另一答案

使用Xcode 9.2,我需要将两个目标的文件命名为“googleServiceInfo.plist”,但放在不同的目录中,并在“Build Phases”,“Copy Bundle Resources”中指定每个目标的目录/文件。

以上不是我的首选解决方案,但我之前尝试使用@ inidona的答案中的不同文件名,转换为Swift 4:

 let filePath = Bundle.main.path(forResource: "googleServiceInfo-Pro", ofType: "plist")!
 let options = FirebaseOptions(contentsOfFile: filePath)
 FirebaseApp.configure(options: options!)

不幸的是,这并没有纠正Firebase错误消息。在这个问题:Firebase iOS SDK - Using configuration file other than GoogleService-Info.plist generates console warning原始海报似乎已通过更新Firebase Pod修复,但我还没有证实这一点。

另一答案

@inidona的回答对我有用。我把它转换成Swift之后

对于Swift 2.3:

let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info", ofType: "plist")
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configureWithOptions(options)

对于Swift 3.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configure(with: options)

对于Swift 4.0:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)
FirebaseApp.configure(options: options!)
另一答案

我认为您可以使用这种方式动态配置您的GoogleService-Info.plist,并为不同的捆绑标识符使用不同的名称。

安德烈亚斯

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];
另一答案

查看这篇文章:https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164

在Xcode上,在项目中创建两个目录:DebugRelease。把每个GoogleService-Info.plist文件放在那里。

AppDelegate.m上,在didFinishLaunchingWithOptions方法内,输入代码:

Objective-C的

  NSString *filePath;
#ifdef DEBUG
  NSLog(@"[FIREBASE] Development mode.");
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Debug"];
#else
  NSLog(@"[FIREBASE] Production mode.");
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Release"];
#endif

  FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
  [FIRApp configureWithOptions:options];

斯威夫特4

var filePath:String!
#if DEBUG
    print("[FIREBASE] Development mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Debug")
#else
    print("[FIREBASE] Production mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Release")
#endif

let options = FirebaseOptions.init(contentsOfFile: filePath)!
FirebaseApp.configure(options: options)

DebugRelease文件夹拖放到Build Phases > Copy Bundle Resources

Build Phases > Copy Bundle Resources

而已 :)

另一答案

我注意到google希望代码中的文件名为GoogleServiceInfo.plist:

 * The method |configureWithError:| will read from the file GoogleServices-Info.plist bundled with
 * your app target for the keys to configure each individual API. To generate your
 * GoogleServices-Info.plist, please go to https://developers.google.com/mobile/add
 *
 * @see GGLContext (Analytics)
 * @see GGLContext (SignIn)
 */
@interface GGLContext : NSObject

关键词是这一个

从与您的应用目标捆绑在一起的文件GoogleServices-Info.plist中读取

所以我只是复制了同一个文件并将其放入不同的目录,并将其绑定到不同的目标:

enter image description here

另一答案

如果GoogleService-Info.plist具有不同的名称,则会影响您的分析结果。 Firebase会警告你这件事。 https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-327138180。因此,这些运行时解决方案都不会提供最佳的分析结果。

有两种解决方案不会破坏Analytics。

  1. 对每个方案使用不同的目标,并将每个版本的GoogleService-Info.plist与其自己的目标相关联。请参阅Xcode右侧文件检查器中的目标成员资格。有关更多信息,请访问See this question
  2. 使用构建阶段脚本将正确版本的GoogleService-Info.plist复制到构建目录中。我使用不同的包ID进行分段和生产。这使我可以并行安装两个版本的应用程序。它也意味着使用下面的脚本我可以用捆绑ID命名我的不同GoogleService-Info.plist文件。例如: GoogleService-Info-com.example.app.plist GoogleService-Info-com.example.app.staging.plist

构建阶段脚本

PATH_TO_CONFIG=$SRCROOT/Config/GoogleService-Info-$PRODUCT_BUNDLE_IDENTIFIER.plist
FILENAME_IN_BUNDLE=GoogleService-Info.plist
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"
cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"

注意:您必须更改PATH_TO_CONFIG以适合您的设置。

Build Phase Script

另一答案

这是我的解决方案!

NSString *filePath;
if([self isProduction]){
    filePath = [[NSBund

以上是关于对不同的构建方案使用不同的GoogleService-Info.plist的主要内容,如果未能解决你的问题,请参考以下文章

如何将不同的构建参数传递给一个解决方案的项目

分析与归档 - 不同的代码签名要求?

为不同的部署场景设置maven pom文件

为不同的构建方案(调试、分发、发布)添加“WKAppBundleIdentifier”和“WKCompanionAppBundleIdentifier”键

如何使用在不同项目中构建的分类模型对新文本进行分类?

Bamboo 随机运行不同版本的 msbuild.exe 并构建失败