[ios] 빌드 체계마다 다른 GoogleService-Info.plist 사용

prod와 스테이징을위한 빌드 체계 (2 개의 다른 번들 식별자 포함)를 사용하고 있으며 각 체계에 대해 별도의 GoogleService-Info.plist를 사용하려고합니다. GCM (및 goole 로그인)을 초기화 할 때 사용할 plist 파일을 수동으로 선택하는 방법이 있습니까? 아니면 plist 사용을 피하고 수동으로 설정하는 것이 가능합니까?

감사!



답변

세부

테스트 대상 :

  • Xcode 9.2
  • Xcode 10.2 (10E125)
  • Xcode 11.0 (11A420a)

해결책

  1. 프로젝트의 모든 Google.plist 파일 (다른 이름)으로 폴더를 만듭니다.

여기에 이미지 설명 입력

  1. 실행 스크립트 추가

여기에 이미지 설명 입력

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에서 프로젝트 내에 두 개의 디렉토리 ( DebugRelease. 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)

둘 다 드래그 앤 드롭 DebugRelease폴더를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를 엉망으로 만들지 않는 두 가지 솔루션이 있습니다.

  1. 각 체계에 다른 대상을 사용하고의 각 버전을 GoogleService-Info.plist고유 한 대상 과 연결합니다 . Xcode의 오른쪽 에있는 File inspector 에서 Target Membership 을 참조하십시오 . 자세한 내용은이 질문을 참조하십시오 .

  2. 빌드 단계 스크립트를 사용하여 올바른 버전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)
}