IT

새로운 Firebase에서 xcode에서 다중 구성 파일을 사용하는 방법은 무엇입니까?

itgroup 2023. 7. 17. 20:52
반응형

새로운 Firebase에서 xcode에서 다중 구성 파일을 사용하는 방법은 무엇입니까?

안녕하세요, 저는 새로운 Firebase iOS SDK를 가지고 놀고 있습니다. 제 프로젝트에서 저는 하나의 대상만 가지고 있습니다. 저는 두 가지 구성인 Debug와 Release를 다른 번들 식별자로 만들었습니다. 하지만 Firebase에서 다운로드한 구성 파일은 하나의 번들 식별자만 지원하는 것 같습니다.

다중 번들 식별자 xcode 프로젝트 내에서 파이어베이스를 사용하는 방법을 아는 사람이 있습니까?

감사합니다!

업데이트: Firebase 공식 문서 참조 https://firebase.google.com/docs/projects/multiprojects

보다 간편한 솔루션으로 업데이트:

  1. 두 GoogleService-Info.plist에 대해 동일한 이름 유지
  2. 하위 폴더에 GoogleService-Info.plist 하나를 "staging"이라고 입력합니다.
  3. Xcode의 두 파일 모두에 참조를 추가하고 해당 대상에 연결
  4. AppDelegate에서 FIRApp.configure()를 사용하면 됩니다.

문제를 해결하지 못한 첫 번째 시도:

두 번째 GoogleService-Info.json의 이름을 다른 이름으로 바꾸고 다음 코드를 사용하여 AppDelegate에서 Firebase를 구성했습니다.

// Swift code
#if STAGING
    let firebasePlistFileName = "GoogleService-Staging-Info"
#else
    let firebasePlistFileName = "GoogleService-Info"
#endif
let firbaseOptions = FIROptions(contentsOfFile: NSBundle.mainBundle().pathForResource(firebasePlistFileName, ofType: "plist"))
FIRApp.configureWithOptions(firbaseOptions)

스테이징 대상을 실행하면 '구성 파일을 찾을 수 없음: 'GoogleService-Info.plist'에 대한 Firebase의 불만이 표시됩니다.그러나 '<FIR Analytics/INFO> Firebase Analytics v.3300000이 시작되었습니다.'라고 표시됩니다.

Firebase 대시보드에서 확인한 결과, 프로덕션 및 스테이징 앱 모두 수신 사용자 이벤트가 기록됩니다.

위에서 언급한 configureWithOptions 메서드는 Firebase 설명서에 나와 있지 않습니다. 소스 코드를 확인하여 확인했습니다.저는 이것을 부르는 것의 단점이 무엇인지 잘 모르겠습니다.저는 다른 접근법을 듣고 싶습니다.

번들 식별자가 다른 단일 대상에 대해 두 가지 계획을 세웠기 때문에 비슷한 것을 구현했습니다.아래의 예에서는 UAT용과 PROD용 두 가지 계획이 있습니다.

두 개의 GoogleService-Info.json 파일을 만든 다음 다른 폴더(예: Xcode 프로젝트가 아님)의 프로젝트 디렉터리에 넣습니다.

ROOT/config/UAT/GoogleService-Info.json
ROOT/config/PROD/GoogleService-Info.json

그런 다음 다음과 같이 Xcode 프로젝트에 파일을 추가합니다.

Xcode project advised folder structure

이제 빌드 단계에서 실행 스크립트를 추가해야 합니다.소스 컴파일 단계 전에 추가해야 합니다.

Drag the Run Script to above Compile Sources

이 스크립트 실행은 적절한 위치에 있는 json 파일을 가져와 빌드 앱 디렉터리에 복제합니다. 즉, Firebase/Google은 단일 식별자 설정에서 파일을 식별하는 방법과 동일하게 식별합니다.

isUAT=`expr "$GCC_PREPROCESSOR_DEFINITIONS" : ".*UAT=\([0-9]*\)"`

RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/PROD

if [ $isUAT = 1 ]; then
    RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/UAT
fi

BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app

echo "Copying all files under ${RESOURCE_PATH} to ${BUILD_APP_DIR}"
cp -v "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"

유사한 json 구성 파일 설정을 사용하는 Google Analytics에도 동일한 로직을 사용할 수 있을 것으로 예상됩니다.

단일 대상이 있는 경우에는 구성 이름을 적절하게 지정하고 아래와 같이 로드하는 것이 좋습니다.UAT 환경에 적합한 것으로 보임 예: Swift 3.0

    var fireBaseConfigFile = Bundle.main.path(forResource: "GoogleService-Info-PROD", ofType: "plist")
   #if UAT
       fireBaseConfigFile = Bundle.main.path(forResource: "GoogleService-Info-UAT", ofType: "plist")
   #endif

   guard let firOptions = FIROptions(contentsOfFile: fireBaseConfigFile) else {
       assert(false, "Failed to load Firebase config file")
       return
   }

   FIRApp.configure(with: firOptions)

나는 2개의 Google 서비스 정보를 다른 이름으로 저장했습니다.

  • GoogleService-Info.plist생산용의
  • GoogleService-Info-Debug.plist발전을 위하여

다음으로 이동합니다.Build Phases새 실행 스크립트 추가:

if [ "${CONFIGURATION}" == "Release" ]; then
cp -r "${PROJECT_DIR}/PathToYourGoogleServiceInfoFile/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

echo "Production plist copied"

elif [ "${CONFIGURATION}" == "Debug" ]; then

cp -r "${PROJECT_DIR}/PathToYourGoogleServiceInfoFile/GoogleService-Info-Debug.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

echo "Development plist copied"
fi

두 Google 서비스 목록을 프로젝트에 다른 이름으로 추가합니다.

enter image description here

그런 다음 각 빌드 구성표에 대해 구성표 편집을 선택하고 다음과 같은 환경 변수에 고유한 값을 추가합니다.

enter image description here

따라서 다른 빌드 구성표의 BUILD_FOR 환경 변수는 예를 들어 "DEV"로 설정됩니다.

그런 다음 App Delegate에서 이 변수를 확인하고 빌드된 구성표에 따라 FIR App을 구성합니다.

    let buildFor = ProcessInfo.processInfo.environment["BUILD_FOR"]! as String
    var firebasePlistFileName = "GoogleService-Info"

    if buildFor == "PROD" {
        firebasePlistFileName = "GoogleService-Prod-Info"
    }

    let firbaseOptions = FIROptions(contentsOfFile: Bundle.main.path(forResource: firebasePlistFileName, ofType: "plist"))
    FIRApp.configure(with: firbaseOptions!)

AppDelete에서 Objective-C를 사용합니다.m:

NSString *filePath;
#ifdef DEBUG
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Debug" ofType:@"plist"];
#else
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Production" ofType:@"plist"];
#endif

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

대상을 사용하는 응답이 많이 표시되지만 체계별로 구분하려면 다음으로 이동할 수 있습니다.

구성표 편집...> 스킴 선택 > 빌드 > 사후 조치

  • 실행 스크립트 추가
  • 빌드 설정 제공 위치: (원하는 대상 선택)
  • 다음 스크립트 추가
PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/MVCVMRC/Supporting Files/FirebasePlist"

cp -r "$PATH_TO_GOOGLE_PLISTS/Brazil/GoogleService-Info-preprod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

변경하는 것을 잊지 마십시오.PATH_TO_GOOGLE_PLISTS

샘플:

Firebase에는 이 작업을 수행하는 방법에 대한 공식 문서가 포함되어 있습니다.저는 제 앱에서 이 방법을 사용했고 잘 작동합니다.

보다 구체적으로 XCode에서 사용자 지정 Swift 플래그 "BUILD_TYPE"을 정의했으며 각 스키마에 대해 해당 플래그에 대한 고유한 값을 정의합니다.그런 다음, 앱 대표자에서 Firebase에 다음과 같이 말합니다.GoogleService-___.plist다음 Swift 플래그 값으로 런타임에 로드할 파일:

    let filePath = Bundle.main.path(forResource: "GoogleService-" + Bundle.main.infoDictionary!["BUILD_FLAVOR"] as! String, ofType: "plist")
    guard let fileopts = FirebaseOptions.init(contentsOfFile: filePath!) else {
        fatalError("Couldn't load config file")
    }
    FirebaseApp.configure(options: fileopts)

최신 구문은 2개의 대상(2개의 Plist 파일)에 대한 Firebase를 구성하기 위한 것입니다.

func configureFirebase() {
        let firebasePlistFileName = ConfigurationManager.sharedManager().firebasePlistName()
        if let path = Bundle.main.path(forResource: firebasePlistFileName, ofType: "plist") {
            if let firbaseOptions = FirebaseOptions(contentsOfFile: path) {
                FirebaseApp.configure(options: firbaseOptions)
            }
        }
    }

firebasePlistFileName 변수가 현재 구성을 기반으로 PList 이름을 가져오는 중입니다.개발 또는 운영.

Swift 5의 경우 환경이 서로 다른 경우 다음을 수행합니다.

    guard let options = FirebaseOptions(contentsOfFile: Bundle.main.path(forResource: MYConstants.myFileName, ofType: "plist") ?? "") else {
        fatalError(false, "Failed to load Firebase config file")
    }
    
    FirebaseApp.configure(options: options)

언급URL : https://stackoverflow.com/questions/37472090/in-new-firebase-how-to-use-multiple-config-file-in-xcode

반응형