새로운 Firebase에서 xcode에서 다중 구성 파일을 사용하는 방법은 무엇입니까?
안녕하세요, 저는 새로운 Firebase iOS SDK를 가지고 놀고 있습니다. 제 프로젝트에서 저는 하나의 대상만 가지고 있습니다. 저는 두 가지 구성인 Debug와 Release를 다른 번들 식별자로 만들었습니다. 하지만 Firebase에서 다운로드한 구성 파일은 하나의 번들 식별자만 지원하는 것 같습니다.
다중 번들 식별자 xcode 프로젝트 내에서 파이어베이스를 사용하는 방법을 아는 사람이 있습니까?
감사합니다!
업데이트: Firebase 공식 문서 참조 https://firebase.google.com/docs/projects/multiprojects
보다 간편한 솔루션으로 업데이트:
- 두 GoogleService-Info.plist에 대해 동일한 이름 유지
- 하위 폴더에 GoogleService-Info.plist 하나를 "staging"이라고 입력합니다.
- Xcode의 두 파일 모두에 참조를 추가하고 해당 대상에 연결
- 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 프로젝트에 파일을 추가합니다.
이제 빌드 단계에서 실행 스크립트를 추가해야 합니다.소스 컴파일 단계 전에 추가해야 합니다.
이 스크립트 실행은 적절한 위치에 있는 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 서비스 목록을 프로젝트에 다른 이름으로 추가합니다.
그런 다음 각 빌드 구성표에 대해 구성표 편집을 선택하고 다음과 같은 환경 변수에 고유한 값을 추가합니다.
따라서 다른 빌드 구성표의 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
'IT' 카테고리의 다른 글
레스크 vs 사이드키크? (0) | 2023.07.17 |
---|---|
데이터 프레임의 모든 문자열 제거/잘라내기 (0) | 2023.07.17 |
C에서 데이터 구조 직렬화 (0) | 2023.07.12 |
모든 출력을 Bash의 파일로 리디렉션 (0) | 2023.07.12 |
git/git-shell 관련 문제를 디버그하려면 어떻게 해야 합니까? (0) | 2023.07.12 |