【问题标题】:Add Firebase Analytics and Crashlytics to iOS project with multiple schemes使用多种方案将 Firebase Analytics 和 Crashlytics 添加到 iOS 项目
【发布时间】:2022-09-26 16:52:14
【问题描述】:

我有一个项目有多个方案(不是目标)。 我有 Dev、QA 和 Prod,我想将 Firebase Analytics 和 Crashlytics 添加到所有方案中,注意每个方案都有自己的 Bundle id 和不同的名称。

我怎样才能做到这一点?

    标签: ios xcode firebase analytics crashlytics


    【解决方案1】:

    在 Xcode 13.3.X 上测试

    假设您已经有一个 Google Firebase 帐户并在 Firebase 控制台中打开了一个应用程序,请在 iOS 控制台中添加一个应用程序。

    现在按照步骤为每个方案(Dev、QA 和 Prod)注册应用程序的 Bundle id,您需要使用不同的 Bundle id 注册不同的应用程序并下载 GoogleService-Info.plist 文件不要重命名 Plist 文件。

    在您的 Xcode 项目中,为每个环境创建单独的文件夹,将每个 GoogleService-Info.plist 文件拖到其文件夹并取消选中复制到目标。

    在您的 pod 文件中添加 pod 'Firebase/Crashlytics'(如果您还使用分析添加 pod)并在终端中运行 pod install。

    在此之后转到 pods 目标(这是 google 建议的解决方法的错误)并搜索 Apple Clang - 警告 - 所有语言并将 Quoted include in Framework Header 设置为 NO)。

    在此之后转到构建选项下的目标构建设置 - >调试信息格式设置为:

    带有 dSYM 文件的 DWARF

    在目标中的构建阶段选项卡上添加 2 个运行脚本。

    第一次调用 Firebase Plist 选择器(或您想要的任何其他名称,只要确保它在上传 dSYM 的脚本之前运行)并添加以下脚本:

    INFO_PLIST=GoogleService-Info.plist
    
    DEVELOPMENT_INFO_PLIST=${PROJECT_DIR}/${TARGET_NAME}/Environment/Dev/${INFO_PLIST}
    
    QA_INFO_PLIST=${PROJECT_DIR}/${TARGET_NAME}/Environment/QA/${INFO_PLIST}
    
    PROD_INFO_PLIST=${PROJECT_DIR}/${TARGET_NAME}/Environment/Prod/${INFO_PLIST}
    
    echo "DEV -> CHECKING in development! ${INFO_PLIST} in ${DEVELOPMENT_INFO_PLIST}"
    if [ ! -f $DEVELOPMENT_INFO_PLIST ] ; then
        echo "DEV GoogleService-Info.plist not found."
        exit 1
    fi
    
    echo "QA -> CHECKING in QA ${INFO_PLIST} in ${QA_INFO_PLIST}"
    if [ ! -f $QA_INFO_PLIST ] ; then
        echo "QA GoogleService-Info.plist not found."
        exit 1
    fi
    
    echo "PROD -> CHECKING in PROD ${INFO_PLIST} in ${PROD_INFO_PLIST}"
    if [ ! -f $PROD_INFO_PLIST ] ; then
        echo "PROD GoogleService-Info.plist not found."
        exit 1
    fi
        
    PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
    echo "Copying ${INFO_PLIST} to final destination: ${PLIST_DESTINATION}"
        
    elif [ "${CONFIGURATION}" == "QA MyProject" ] ; then
        echo "QA -> Copied FILE : ${QA_INFO_PLIST}."
        cp "${QA_INFO_PLIST}" "${PLIST_DESTINATION}"
        
    elif [ "${CONFIGURATION}" == "Prod MyProject" ] ; then
        echo "PROD -> Copied FILE : ${PROD_INFO_PLIST}."
        cp "${PROD_INFO_PLIST}" "${PLIST_DESTINATION}"
        
    else
        echo "DEV -> Copied ${DEVELOPMENT_INFO_PLIST}."
        cp "${DEVELOPMENT_INFO_PLIST}" "${PLIST_DESTINATION}"
    fi
    

    在这里,您正在检查每个方案的 GoogleService-Info.plist 文件(注意它说 /Environment/Dev QA Prod 等将其更改为您的文件夹路径)如果找到该文件,那么它将在构建时添加并且正确每次都会将 Plist 文件添加到构建中。

    现在在第二个脚本中添加:

    "${PODS_ROOT}/FirebaseCrashlytics/run"
    

    在输入文件下添加这两个:

    $(SRCROOT)/${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}
    
    $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
    

    如果在控制台中输入 Crashlytics 部分并模拟崩溃(您可以将 fatalError 放在 IBAction 或 Button 操作上进行模拟)时一切正确,则清理并构建项目,您将能够看到您配置的每个方案的崩溃。

    请注意,如果您希望复制文件夹,请使用:

    cp -R
    

    这将复制文件夹及其所有内容。

    在名称末尾添加 / 非常重要,例如更改

    INFO_PLIST=GoogleService-Info.plist
    

    INFO_PLIST=MYFOLDERNAME/
    

    最亲切的问候。

    【讨论】:

    • 如果我已将 Firebase 配置为 dart-only 模式(即没有我必须下载的 GoogleService-Info.plist),我该如何继续?
    【解决方案2】:

    如果您仅在一个目标上有多个架构: 您可以按照这样的方案更改 plist 文件:

    #if DEV_DEBUG || DEV_RELEASE
        let filePath = Bundle.main.path(forResource: "GoogleService-Info-Dev", ofType: "plist")
    #else
        let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")
    #endif
        guard let fileopts = FirebaseOptions(contentsOfFile: filePath!)
        else { assert(false, "Couldn't load config file") }
        FirebaseApp.configure(options: fileopts)
    

    在这段代码中,我有两个方案,一个是 Dev,另一个是 Prod

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-09
      • 2022-12-01
      • 2020-07-03
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多