对不同的构建方案使用不同的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)
解
- 在项目中创建包含所有Google.plist文件(具有不同名称)的文件夹
- 添加运行脚本
不要忘记更改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
构建方案名称
使用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];
在Xcode上,在项目中创建两个目录:Debug
和Release
。把每个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)
将Debug
和Release
文件夹拖放到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中读取
所以我只是复制了同一个文件并将其放入不同的目录,并将其绑定到不同的目标:
如果GoogleService-Info.plist
具有不同的名称,则会影响您的分析结果。 Firebase会警告你这件事。 https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-327138180。因此,这些运行时解决方案都不会提供最佳的分析结果。
有两种解决方案不会破坏Analytics。
- 对每个方案使用不同的目标,并将每个版本的
GoogleService-Info.plist
与其自己的目标相关联。请参阅Xcode右侧文件检查器中的目标成员资格。有关更多信息,请访问See this question。 - 使用构建阶段脚本将正确版本的
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
以适合您的设置。
这是我的解决方案!
NSString *filePath;
if([self isProduction]){
filePath = [[NSBund以上是关于对不同的构建方案使用不同的GoogleService-Info.plist的主要内容,如果未能解决你的问题,请参考以下文章
为不同的构建方案(调试、分发、发布)添加“WKAppBundleIdentifier”和“WKCompanionAppBundleIdentifier”键