使用 swift4 在 xcode 中对单个项目使用不同的 GoogleService-Info.plist

2024-02-01

我有一个项目,但有 4 个不同的环境(开发、暂存、质量检查、生产)。我已经从移动设备的设置中给出了他们的(环境的网络服务 URL)路径。现在我想为所有这些不同的环境使用不同的 GoogleService-info.plist 。就像当我从后端选择 Dev 时,该项目应该仅采用 Dev 项目的 GoogleService-Info.plist 。这些 GoogleService-Info.plist 是在 4 个不同的帐户上创建的。项目应以编程方式采用 GoogleService-info.plist 的路径。我尝试过以下代码

1]通过参考this https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164url ,我创建了两个文件夹 Dev 和 QA (目前)并尝试通过编程方式给出它们的路径

#if DEV
    print("[FIREBASE] Development mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", 
ofType: "plist", inDirectory: "Dev")
    #elseif QA
    print("[FIREBASE] QA mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", 
ofType: "plist", inDirectory: "QA")
    #endif
    let options = FirebaseOptions.init(contentsOfFile: filePath)!
    FirebaseApp.configure(options: options)

但它会抛出一个错误

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

on

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

这条线

2]其次,我通过 GoogleService-Info-QA.plist 更改了 GoogleService-Info.plist 的名称,并尝试以编程方式访问该文件

private func configureFirebase() {
    guard   let plistPath = Bundle.main.path(forResource: 
"GoogleService-Info-QA", ofType: "plist"),
        let options =  FirebaseOptions(contentsOfFile: plistPath)
        else { return }
    FirebaseApp.configure(options: options)
}

但它会抛出一个错误

Terminating app due to uncaught exception 'FIRAppNotConfigured', 
reason: 'Failed to get default Firebase Database instance. Must 
call `[FIRApp configure]` (`FirebaseApp.configure()` in Swift) 
before using Firebase Database.

对于此确认,您必须执行以下步骤:

  1. 转到项目设置
  2. 选择您的开发目标
  3. 转到构建阶段
  4. 单击图标并创建名为 GOOGLESERVICE_INFO_PLIST 的新运行脚本
  5. 使用以下脚本
//Name of the resource we're selectively copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist

//Get references to dev and prod versions of the GoogleService-Info.plist
//NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/projectFolder/Firebase/Dev/${GOOGLESERVICE_INFO_PLIST}
GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/projectFolder/Firebase/Prod/${GOOGLESERVICE_INFO_PLIST}

//Make sure the dev version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"

if [ ! -f $GOOGLESERVICE_INFO_DEV ]
then
echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1
fi

//Make sure the prod version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
if [ ! -f $GOOGLESERVICE_INFO_PROD ]
then
echo "No Production 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
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
if [ "${CONFIGURATION}" == "Release" ]
then
echo "Using ${GOOGLESERVICE_INFO_PROD}"
cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
else
echo "Using ${GOOGLESERVICE_INFO_DEV}"
cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
fi
  • 最后一步:确保您已将 GoogleService-Info.plist 放置在项目中正确的位置路径中,您可以找到附图作为参考。

GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/项目文件夹/Firebase/Dev/${GOOGLESERVICE_INFO_PLIST} GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/项目文件夹/Firebase/Prod/${GOOGLESERVICE_INFO_PLIST}

项目文件夹是你当前的项目文件夹

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 swift4 在 xcode 中对单个项目使用不同的 GoogleService-Info.plist 的相关文章

  • NumberFormatter 分组未按预期工作

    在进行货币格式化工作时 我在尝试格式化智利比索时发现了一个问题 按照此代码 let priceFormatter NumberFormatter priceFormatter locale Locale identifier es CL p
  • 无效的 Swift 支持 - 文件位置不正确

    我一直在尝试将新版本上传到 iTunes Connect 来更新应用程序 我第一次使用 xCode 6 但收到了一封来自 Apple 的电子邮件 内容如下 亲爱的开发者 我们发现您最近交付的 应用程序 存在一个或多个问题 要处理您的交货 必
  • 快速更改日期选择器语言

    我想更改 UIDatePicker 中月份表示的格式 我试过 self datePicker UIDatePicker self datePicker backgroundColor white self datePicker datePi
  • SwiftUI 图像 ClipsToBounds

    尝试使用 SwiftUI Xcode 11 0 beta 2 我尝试用图像填充视图 Image large resizable aspectRatio contentMode fill frame width 80 height 80 al
  • 使用 Google Apps 脚本从 Firebase 读取数据

    因此 正如标题所示 我目前正在解决一个相当麻烦的问题 这是场景 我有一个 Google 电子表格 其中包含一个包含姓名 电子邮件和到期日期的模板 但是 它不包含实际数据 数据本身位于 Firebase 中并且不断变化 那么 我的目标是让sc
  • 修改多张照片时只有一个 iOS 权限对话框

    我的应用程序允许用户从相机胶卷中选择多个图像并对这些图像应用编辑 但是 它会提示用户获得每个图像编辑的权限 编辑用户图像时是否可以只显示一个权限对话框 如果是 我该如何将我的编辑分组为一项权限 这是我的应用程序的屏幕截图 我在应用商店中发现
  • iOS Swift 多维数组 - 编译需要很长时间。我应该改变什么?

    我是斯威夫特的新人 以前从未使用过 ObjC 编程 我在使用 iOS 应用程序时遇到了问题 通过选择器查询数组非常简单 我有 4 个多维数组 如下所示 let Setting 0 0 0 0 0 0 2230 0 0 0 0 0 2230
  • 如何显示启动图像

    我是 iOS 新手 我的 Xcode 版本是 7 2 1 我尝试使用 Swift 在 iOS9 上运行 我的问题是我对如何创建启动屏幕图像感到非常困惑 我发现有很多方法可以为不同版本的 iOS 创建启动屏幕图像 有人可以向我解释一下如何设置
  • 在 wkwebview 中启用摄像头和麦克风访问

    我有一个针对移动设备优化的网络应用程序 它利用getUserMedia访问网络摄像头和麦克风资源 我正在将这个应用程序包装在WKWebView因为我想提供原生应用程序体验 我知道 iOS 不允许通过浏览器访问相机 但是有什么方法可以使用本机
  • SwiftUI:如何更新由一组静态数据驱动的列表并从另一组动态数据中提取一些信息?

    我什至不确定标题问题是否有意义 不管怎样 请继续阅读 编辑 交叉链接到苹果开发者论坛 https developer apple com forums thread 663208 编辑 这是源代码 http git morpheu5 net
  • CoreBluetooth 功能无法从 Singleton 运行

    所以我目前在 iPad 和 iPhone 之间建立了蓝牙连接 我已经在中创建了我的测试代码ViewController一切正常 现在我把它移到了 2 个经理类 第一个是CBCentralManager和一个用于CBPeripheralMan
  • firestore sdk 是否使用连接的套接字发出请求或单独的 http 请求?

    我正在使用 React Native Firebase sdk 并且想知道底层网络调用是如何实现的 当进行 firestore get 查询时 sdk 是否只是在初始化时保持套接字打开并通过打开的套接字发出请求 还是向端点发出单独的 htt
  • 如何获取firebase数据库中所有孩子的数据?

    我有这个 firebase 数据库 我需要获取用户的所有电话号码 我应该使用哪个侦听器来获取所有孩子 每个用户都作为一个对象添加 其中用户 ID 作为该对象的名称 我需要在不知道用户 ID 的情况下检索该对象 我搜索了文档 它与DataSn
  • 缓存 Firebase 请求的云函数并且仅在成功编辑配置文件后重新缓存的示例

    在我的应用程序中 用户个人资料向公众开放 并且仅由个人资料所有者更新 个人资料网址是example com email protected cdn cgi l email protection 并根据文档https firebase goo
  • 如何在 Swift 3 中记录函数闭包参数的参数?

    在 Xcode 8 beta 和 Swift 3 中 当您有一个采用闭包作为参数的方法时 例如 func foo bar String gt Void bar Hello world 如何记录闭包所采用的参数 例如 如果我这样写 Calls
  • 标题的宏定义,放在哪里?

    定义头文件依赖的宏时 例如 FILE OFFSET BITS FUSE USE VERSION GNU SOURCE其中 放置它们的最佳位置在哪里 我考虑过的一些可能性包括 位于依赖于该文件中包含的标头公开的定义的任何源文件的顶部 紧接在相
  • 身份验证后如何退出 Google

    所以我的应用程序可以选择使用 Google 登录 单击 Google 提供的按钮后 将打开一个 Web 视图并让用户输入其凭据 允许应用程序访问其信息后 应用程序将用户登录并将 SignInViewController 更改为 TabBar
  • 在 UIScrollView Swift 中禁用垂直滚动

    不要将此问题标记为重复 我读了很多问题 但没有找到问题的答案 我的问题如下 我有一个UIScrollView它应该只水平滚动 这里它垂直滚动 20px 奇怪的事实 它似乎与状态栏的高度相同 我尝试打印内容大小 y 偏移量和高度UIScrol
  • SwiftUI 中的计算 (NSObject) 属性不会更新视图

    所以 我想要一个Text它根据我的 CoreData 模型的内容更改其内容 为此 我在 Xcode beta 4 中使用了计算属性 但它似乎不再起作用了 这是一个错误还是还有其他我没有看到的问题 我真正遇到的问题是我的视图 和计算的属性 似
  • 在 IBAction 中调用其他函数之前,如何使函数完成?

    我无法理解完成处理程序 我有一个 textFieldEditingDidChange IBAction 首先调用verify 文本字段输入上的函数然后是 if 语句在 apply 返回的布尔值上 问题是 if 语句在 verify 完成之前

随机推荐

  • 多个 svn 项目合并到一个 git 存储库中?

    我已经开始使用 git svn 来完成我的一些工作 以便能够进行本地提交 这对于使用标准 svn 布局的项目非常有用 最近 我开始开发一个 Java 项目 该项目分为多个连接的模块 20 25 每个模块在同一个 svn 存储库中都有自己的根
  • 我怎样才能让 Decimal.TryParse 解析 0.0?

    有没有办法让 Decimal TryParse 将字符串值 0 0 或 00 00 或 000 000 解析为 0 我尝试将 NumberStyles 设置为 Any 使用 InvariantCulture decimal TryParse
  • 如何忽略 Subclipse 中的构建目录?

    构建后 我在自动生成的构建目录中得到了大量的类文件 我不想提交它们 所以我尝试使用忽略它们Team gt Add to svn ignore 但它们已经变灰了 我尝试删除构建目录Project gt Clean 但有趣的是 当我尝试提交时
  • new String(char[]) 和 char[].toString 之间的区别

    Java 中以下两个代码块的输出是不同的 我试图理解为什么 private String sortChars String s char arr s toCharArray creating new char Arrays sort arr
  • Resteasy一般启用GZIP

    我有一个 RestEasy Java EE 应用程序 当我将 GZIP 添加到组件类时 如果客户端发送 accepts gzip 则服务器答案将被压缩 有没有办法为所有组件普遍启用 gzip 我不喜欢为每个类添加注释 我正在使用 RestE
  • 十六进制增量/循环直到 FFF

    我有一个包含十六进制数字的字符串 我想增加该十六进制数字 直到达到最大数字 FFF 我如何循环才能获得起始十六进制和 FFF 之间的每个数字 我尝试将字符串转换为字节数组 但之后陷入困境 string stringHex 7A string
  • 使用 BigQuery 获取 Firebase Analytics 历史数据

    我已将 firebase 分析应用程序链接到 BigQuery 并在 app events 和 app events intraday 表下获取原始数据 使用 BigQuery 的主要要求是获取在 Firebase 分析仪表板下获得的分析数
  • 如何将Gitlab项目复制到另一个Gitlab存储库?

    我想将 GitLab 项目复制到另一个存储库 该存储库应该是完全独立来自原始项目 为此 我尝试将原来的项目fork到另一个项目中 但在原始项目中 维护者仍然可以看到分叉列表 并知道其他分叉的维护位置 我想要一个完整的副本 没有任何到主项目的
  • WinSCP .NET 程序集拒绝 RSA/DSA 密钥指纹

    我正在尝试使用 WinSCP NET 程序集连接到 WinSCP 服务器 我遇到的问题是它会轰炸检查主机密钥指纹 我已经创建了 RSA 密钥 我的代码如下 var server new WinSCP SessionOptions serve
  • 将某些指标与 Google Analytics API v4 中的会话和产品相关联

    我在 GA api 中需要获取一些非常具体类型的指标 站点级别 使用购物车进行的站点访问添加 这是会话次数的计数 发生在会话中发生购物车添加的时间范围内 产品视图的站点访问 这是对在会话中出现产品详细信息视图的时间范围内发生的会话数量的计数
  • 材质按钮在预览中未正确显示

    这个问题与我的另一个问题相关 材质按钮 样式应用不正确 丑陋极了 https stackoverflow com questions 53224903 material button styles not being applied cor
  • TFS 2010:当我可以使用 XamlReader 进行反序列化时,为什么无法使用 XamlWriter.Save 反序列化 Dictionary

    public static string GetXml Dictionary
  • Python ctypes 可以在 x86-64 上加载 32 位 C 库吗?

    我有一台安装了 32 位库的 64 位 RHEL 主机 一个供应商有 32 位 所以我想使用 ctypes 加载到 Python 中 from ctypes import CDLL CDLL 32bitdinosaur so OSError
  • 运行应用程序期间的 Grails 警告/错误

    目前 当我尝试在 Eclipse 中运行我的 Google App Engine Grails 测试应用程序时 我看到了以下警告 警告 目标导致名称覆盖 startLogging 警告 找不到 C Users Some Person gra
  • 如何知道子列表中某个元素的索引

    如何知道子列表中元素的索引 类似的问题在这里被问到 https stackoverflow com questions 176918 finding the index of an item given a list containing
  • UIAutomator Facebook 登录

    我为我的应用程序创建了一个 UIAutomator 登录测试 它适用于某些模拟器 问题是 它并不适用于所有人 UiObject input mDevice findObject new UiSelector instance 0 class
  • SPARQL 查询根据语句的顺序返回不同的结果

    我有一个 SPARQL 查询 它返回两个资源的最具体的常见类 当我尝试运行它时https dbpedia org sparql https dbpedia org sparql 有时它什么也不返回 有时它返回我想要的类 我注意到它与查询中语
  • Spring MVC + Hibernate:数据验证策略

    我们都知道 Spring MVC 通常与 Hibernate Validator 和 JSR 303 集成得很好 但正如有人所说 Hibernate Validator 只是用于 Bean Validation 的东西 这意味着更复杂的验证
  • ES6 类执行多态性的能力

    我试图通过 ES6 类来模拟多态性 以便能够更好地理解这个理论 概念很清楚 设计对象以共享行为并能够用特定行为覆盖共享行为 但恐怕我上面的代码不是一个有效的多态性示例 由于我缺乏经验 如果您能全面地回答以下问题 我将不胜感激 事实上 两个类
  • 使用 swift4 在 xcode 中对单个项目使用不同的 GoogleService-Info.plist

    我有一个项目 但有 4 个不同的环境 开发 暂存 质量检查 生产 我已经从移动设备的设置中给出了他们的 环境的网络服务 URL 路径 现在我想为所有这些不同的环境使用不同的 GoogleService info plist 就像当我从后端选