prod와 스테이징을위한 빌드 체계 (2 개의 다른 번들 식별자 포함)를 사용하고 있으며 각 체계에 대해 별도의 GoogleService-Info.plist를 사용하려고합니다. GCM (및 goole 로그인)을 초기화 할 때 사용할 plist 파일을 수동으로 선택하는 방법이 있습니까? 아니면 plist 사용을 피하고 수동으로 설정하는 것이 가능합니까?
감사!
답변
세부
테스트 대상 :
- Xcode 9.2
- Xcode 10.2 (10E125)
- Xcode 11.0 (11A420a)
해결책
- 프로젝트의 모든 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
구성표 이름 작성
답변
@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!)
답변
이 문서를 확인하십시오 : https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164
Xcode에서 프로젝트 내에 두 개의 디렉토리 ( Debug
및 Release
. GoogleService-Info.plist
거기에 각 파일을 넣으십시오 .
에 AppDelegate.m
, didFinishLaunchingWithOptions
메서드 내부 에 코드를 입력합니다.
목표 -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
:
그게 다야 🙂
답변
이 방법을 사용하여 GoogleService-Info.plist를 동적으로 구성하고 다른 번들 식별자에 다른 이름을 사용할 수 있다고 생각합니다.
챠오 안드레아스
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];
답변
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의 오른쪽 에있는 File inspector 에서 Target Membership 을 참조하십시오 . 자세한 내용은이 질문을 참조하십시오 . -
빌드 단계 스크립트를 사용하여 올바른 버전 을
GoogleService-Info.plist
빌드 디렉토리 에 복사하십시오 . 스테이징 및 프로덕션에 다른 번들 ID를 사용합니다. 이를 통해 두 버전의 앱을 동시에 설치할 수 있습니다. 또한 아래 스크립트를GoogleService-Info.plist
사용하면 번들 ID로 다른 파일의 이름을 지정할 수 있습니다 . 예를 들면 :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
설정에 맞게 변경 해야합니다.
답변
Firebase와 함께 plist를 사용하는 것을 피할 수 없습니다. 지금까지 찾은 최고의 솔루션은 두 파일을 모두 추가하고 이름을 지정하는 것입니다.
GoogleService-Info_stage.plist
과
GoogleService-Info_prod.plist
그런 다음 코드에서 올바른 파일을 호출 할 수 있습니다. 이렇게하면 파일이없는 경우 앱이 충돌하지 않습니다. FILENAME을 GoogleService-Info_prod 또는 GoogleService-Info_stage로 바꾸면됩니다.
if let configFile = Bundle.main.path(forResource: "FILENAME", ofType: "plist"),
let options = FirebaseOptions(contentsOfFile: configFile)
{
FirebaseApp.configure(options: options)
}
