programing

다른 빌드 구성표에 다른 Google Service-Info.plist 사용

lovejava 2023. 6. 13. 21:53

다른 빌드 구성표에 다른 Google Service-Info.plist 사용

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

감사합니다!

세부 사항

테스트 대상:

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

해결책

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

여기에 이미지 설명 입력

  1. 실행 스크립트 추가

여기에 이미지 설명 입력

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

코드

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_Production" | "AdHoc_Production" | "Distribution" | "Test_Production" )
        cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-prod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;

    *)
        ;;
esac

빌드 구성표 이름

여기에 이미지 설명 입력

@이니도나의 대답은 저에게 효과가 있었습니다.내가 스위프트로 바꾼 후에

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!)

에 약에만.GoogleService-Info.plist이름이 달라 분석 결과에 영향을 미칩니다.소방서에서 이에 대해 경고할 것입니다.이러한 이유로 이러한 런타임 솔루션은 최상의 분석 결과를 제공하지 않습니다.

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사용자 설정에 적합합니다.

빌드 단계 스크립트

다음 문서를 확인하십시오. https://medium.com/ @how-how-to-how-a-different-firebase-project for-detailand-release-environments-sysb40512164

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:

빌드 단계 > 번들 리소스 복사

바로 그거야 :)

이 방법을 사용하여 Google Service-Info.plist를 동적으로 구성하고 다른 번들 식별자에 다른 이름을 사용할 수 있습니다.

ciao 안드레아스

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];

이 대답은 @abbod의 대답에서 매우 영감을 얻었지만, 어떻게 해야 하는지에 대해서는 조금 더 구체적입니다.

각 대상(예: dev, stg, prod)에 대해:

  • 하는 해당다를 합니다.GoogleService-Info.plist을 딴 합니다.
  • 오른쪽 버튼으로 하고 Xcode 서폴를마우오스른쪽단추선다다택니합음을클고릭하로에앱더▁x▁in다▁and▁folder니를 선택합니다.Add files to "your app" 여기에 이미지 설명 입력
  • 상의폴대가 들어 있는 합니다.GoogleService-Info.plist 확인하세요Copy items if needed그리고.Create groups한 후 목록에서 하고 를 누릅니다.Add 여기에 이미지 설명 입력

바로 그겁니다.이제 당신은 이 구조와 비슷한 것을 가져야 합니다.

여기에 이미지 설명 입력

목표를 구축할 때 올바른GoogleService-Info.plist사용됩니다.

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

핵심 문구는 이것입니다.

앱 대상과 함께 제공되는 Google Services-Info.plist 파일을 읽어 보십시오.

그래서 저는 같은 파일을 복사해서 다른 디렉토리에 넣고 다른 대상으로 제한했습니다.

여기에 이미지 설명 입력

이 할 것, 저는 제 하는 매우 될 것을 합니다. :) 었지만새개을돕게늦할다같니것습저해야매좋는제약문기것될당찾도그속합신에사이를게도을다니이움것고았은제를 :)
문제를 해결하는 이 문서도 확인하십시오.

1단계:
Firebase 개발 환경에 해당하는 Google Service-Info.plistDev 디렉토리에 복사합니다.마찬가지로 Prod 디렉토리에 Firebase 운영 환경에 해당하는 Google Service-Info.plist를 복사합니다."필요한 경우 항목 복사" 및 "대상에 추가"에서 모든 대상을 선택 취소해야 합니다.

(Step 1 image link(1단계 영상 링크)(평판이 적어 영상을 추가할 수 없음)

2단계:
Xcode 프로젝트 탐색기에서 앱 대상을 선택합니다. 위에 있는 빌드 단계 탭으로 전환한 다음 새 실행 스크립트 단계를 추가합니다."Setup Firebase Environment Google Service-Info.plist" 단계 또는 이와 유사한 단계의 이름을 지정하고 "Copy Bundle Resources" 단계 앞에 배치합니다.

3단계:
빌드 구성에 따라 적절한 GoogleService-Info.plist를 앱 번들에 복사하는 셸 스크립트를 구현합니다.다음 셸 스크립트를 복사하여 방금 만든 실행 스크립트 단계에 붙여넣습니다.

# Name of the resource we're selectively copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist

# Get references to dev and prod versions of the GoogleService-Info.plist
# NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Dev/${GOOGLESERVICE_INFO_PLIST}
GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Prod/${GOOGLESERVICE_INFO_PLIST}

# Make sure the dev version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"
if [ ! -f $GOOGLESERVICE_INFO_DEV ]
then
    echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
    exit 1
fi

# Make sure the prod version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
if [ ! -f $GOOGLESERVICE_INFO_PROD ]
then
    echo "No Production GoogleService-Info.plist found. Please ensure it's in the proper directory."
    exit 1
fi

# Get a reference to the destination location for the GoogleService-Info.plist
PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}"

# Copy over the prod GoogleService-Info.plist for Release builds
if [ "${CONFIGURATION}" == "Release" ]
then
    echo "Using ${GOOGLESERVICE_INFO_PROD}"
    cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
else
    echo "Using ${GOOGLESERVICE_INFO_DEV}"
    cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
fi

단일 대상의 경우 100% 실행 가능한 유일한 방법은 빌드 중 빌드 구성에 해당하는 plist를 복사하는 것입니다. 하지만 여기에서 답변하는 방법은 세부적으로 다르며, 저에게 편리한 사람은 아무도 없었습니다.제 답변은 @KnightFighter의 답변과 Medium에 대한 이 기사를 기반으로 합니다.


먼저 다른 이름을 가진 프로젝트에 다른 모든 목록을 추가합니다(대상에 리소스로 추가해서는 안 됨).

여기에 이미지 설명 입력

그런 다음 각 빌드 구성에 특정 plist를 할당할 수 있는 사용자 정의 빌드 설정을 만듭니다.

여기에 이미지 설명 입력

마지막으로 코드를 사용하여 "스크립트 실행" 단계를 추가합니다.

GOOGLE_SERVICE_INFO_PLIST_SOURCE=${PROJECT_DIR}/${TARGET_NAME}/${GOOGLE_SERVICE_INFO_PLIST_FILENAME}

if [ ! -f $GOOGLE_SERVICE_INFO_PLIST_SOURCE ]
then
    echo "${GOOGLE_SERVICE_INFO_PLIST_SOURCE} not found."
    exit 1
fi

GOOGLE_SERVICE_INFO_PLIST_DESTINATION="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

cp "${GOOGLE_SERVICE_INFO_PLIST_SOURCE}" "${GOOGLE_SERVICE_INFO_PLIST_DESTINATION}"

저는 그러한 방법이 몇 가지 이점을 가지고 있다고 생각합니다.

  • 목록을 저장하기 위해 폴더 계층 구조를 가질 필요가 없습니다.
  • 여러 구성에 대해 단일 plist를 사용하는 경우 파일을 복제할 필요가 없습니다.
  • 특히 프로그래머가 아닌 사람(즉, 빌드 관리자)의 경우 구성을 추가하거나 목록을 재할당해야 할 경우에는 빌드 설정에서 파일 이름을 변경하는 것이 스크립트를 편집하는 것보다 쉽습니다.

되어 있다고해 보겠습니다.develop그리고.production당신은 두 가지를 만들어야 합니다.

  1. 지정된 구성에 맞게 두 목록의 이름을 변경합니다.
  • Google 서비스-정보-개발.플리스터
  • Google 서비스-정보-프로덕션.플리스터
  1. 선택한 구성에 대한 올바른 목록을 복사하는 실행 스크립트를 추가합니다.
FIREBASE_PLIST_PATH="${PROJECT_DIR}/App/Resources/Plists/GoogleService-Info-${CONFIGURATION}.plist"
echo "Firebase plist path: ${FIREBASE_PLIST_PATH}"
cp -r ${FIREBASE_PLIST_PATH} "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"

는 실스립는다이배합야다니해치 앞에 배치해야 .FirebaseCrashlytics대본.

스킴에 할 수 있습니다: "Firebase"입니다.FirebaseApp.configure()

Flist는 Firebase와 함께 사용하지 않을 수 없습니다.내가 지금까지 찾은 가장 좋은 해결책은 두 개의 파일을 추가하고 이름을 짓는 것입니다.

Google 서비스-Info_stage입니다.플리스터

그리고.

Google 서비스-Info_prod.plist

그런 다음 코드에서 올바른 파일을 호출할 수 있습니다.이렇게 하면 파일이 없어도 앱이 손상되지 않습니다.파일 이름을 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)
}

그래서 저는 같은 질문을 고민했고 이전 게시물의 아이디어를 사용했습니다. 그 중 일부는 앱을 게시합니다.GoogleServices-Info.plist모든 앱의 모든 환경에 적용할 수 있으며 이는 약간의 우려 사항입니다.

다음을 복사하는 확장 가능한 솔루션을 개발했습니다.GoogleSerives-Info.plist파일을 빌드 시간에 저장합니다.또한 이 접근 방식은 사용자 지정 기능을 통해 원하는 만큼의 환경을 지원할 수 있으며 간단한 관례에 따라 쉽게 관리할 수 있습니다.

무엇보다도, 저는 세 가지 환경을 가지고 있습니다.debug및 및 코드의 ), (시뮬레이터및장휘코실능경절우로는단하으적동드고를하행서에디깅버)staging비행을 ) 및 (시험 비행용)release생산용의

1단계는 구성을 만드는 것입니다.

여기에 이미지 설명 입력

"제품" -> "구성표" -> "구성표 편집"을 선택하고 필요에 따라 복제/새로 만듭니다.각 구성표를 살펴보고 각 범주의 "구성 작성" 드롭다운에서 해당 구성을 할당합니다.

여기에 이미지 설명 입력

한 단계 더 나아가 배포해야 하는 구성(예: 릴리스 및 스테이징)에 대해 "실행"을 선택 취소하고, 반대로 디버그에 대해 "보관"을 선택 취소합니다.당신은 당신에게 합당한 일을 해야 합니다.

여기에 이미지 설명 입력

에서 다음 스크립트를 합니다.CONFIGURATIONS_FOLDER원하는 대로 변수를 사용자 지정할 수 있습니다. 다음 단계에서 동일한 폴더 이름을 사용해야 합니다.):

# Get a reference to the folder which contains the configuration subfolders.
CONFIGURATIONS_FOLDER=Firebase
# Get a refernce to the filename of a 'GoogleService-Info.plist' file.
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
# Get a reference to the 'GoogleService-Info.plist' for the current configuration.
GOOGLESERVICE_INFO_PLIST_LOCATION=${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/${CONFIGURATION}/${GOOGLESERVICE_INFO_PLIST}
# Check if 'GoogleService-Info.plist' file for current configuration exist.
if [ ! -f $GOOGLESERVICE_INFO_PLIST_LOCATION ]
then
  echo "No '${GOOGLESERVICE_INFO_PLIST}' file found for the configuration '${CONFIGURATION}' in the configuration directory '${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/${CONFIGURATION}'."
  exit 1
fi
# Get a reference to the destination location for the GoogleService-Info.plist.
GOOGLESERVICE_INFO_PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
# Copy 'GoogleService-Info.plist' for current configution to destination.
cp "${GOOGLESERVICE_INFO_PLIST_LOCATION}" "${GOOGLESERVICE_INFO_PLIST_DESTINATION}"
echo "Successfully coppied the '${GOOGLESERVICE_INFO_PLIST}' file for the '${CONFIGURATION}' configuration from '${GOOGLESERVICE_INFO_PLIST_LOCATION}' to '${GOOGLESERVICE_INFO_PLIST_DESTINATION}'."

여기에 이미지 설명 입력

폴더의 "Firebase에서 각 구분의 각 합니다. 그 에는 각 의 "Firebase"("Firebase")가 .에서 각 구성(대소문자 구분)과 정확히 동일한 이름을 가진 각 구성에 대한 폴더를 각 구성의 내부에 중첩합니다.GoogleServices-Info.plist다음과 같은 파일:

여기에 이미지 설명 입력

마지막으로, 저는 또한 루트 레벨을 확인하고 싶습니다.GoogleServices-Info.plist실수로 프로젝트에 추가되지 않았기 때문에 다음 사항을 .gitignore에 추가합니다.

# Ignore project level GoogleService-Info.plist
/[Project Name]/GoogleService-Info.plist

@Essam의 솔루션 버전은 다음과 같습니다.

  1. 구성표("Google Services")에 Services 버전을 생성합니다.Google-Services.plist ( 포함) 를 사용합니다.
  2. 체계Google Services)에 두 번째 합니다("Google Services"().Google-Services-debug.plist합니다.
  3. 프로젝트 루트에 둘 다 추가합니다(가이드에서 지시하는 위치).

구성을 추가할 위치에 이 코드를 추가합니다.

        let bundleID = Bundle.main.bundleIdentifier
        if (bundleID!.contains("debug")) {
            let resource: String = "GoogleService-Info-debug"
            let filePath = Bundle.main.path(forResource: resource, ofType: "plist")!
            let options = FirebaseOptions(contentsOfFile: filePath)
            FirebaseApp.configure(options: options!)
        } else {
            FirebaseApp.configure()
        }

이를 통해 해결했습니다.

    #if STAGING
        if let filePath = Bundle.main.path(forResource: "GoogleService-Info-Dev", ofType: "plist"),
            let options = FirebaseOptions(contentsOfFile: filePath) {
                FirebaseApp.configure(options: options)
        } else {
            fatalError("GoogleService-Info-Dev.plist is missing!")
        }
    #else
        if let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist"),
            let options = FirebaseOptions(contentsOfFile: filePath) {
                FirebaseApp.configure(options: options)
        } else {
            fatalError("GoogleService-Info.plist is missing!")
        }
    #endif

이게 내 해결책입니다!

NSString *filePath;
if([self isProduction]){
    filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
}else{
    filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Sandbox" ofType:@"plist"];
}
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];

그리고 그게 다야!

저는 그것을 사용하지 않고는 달성할 수 없다고 생각합니다.GoogleService-Info.plist.iOS 앱을 Google Sign-In 구성 요소와 통합하기 전에 종속성을 다운로드하고 Xcode 프로젝트를 구성해야 합니다.그리고 이 과정은 다음과 같은 것을 보여줍니다.GoogleService-Info.plist큰 요인이 있습니다.

SO 질문의 해결책과 아이디어는 여러분의 문제를 해결하는 데 도움이 됩니다.방금 메인 복사본을 옮겼습니다.GoogleService-Info plist앱에서 두 개의 개별 폴더로 이동한 다음 각 대상의 빌드 단계 "파일 복사"를 사용하여 대상 특정 목록을 리소스 폴더로 가져옵니다.

또한 이 SO 질문을 확인하십시오. 문제에 대한 자세한 정보/아이디어를 제공할 수 있습니다.

일부 오류가 발생하여 Xcode에서 불만을 제기하는 경우

"여러 명령을 실행하면 Google Service-Info.plist가 생성됩니다."

@Knight Fighter 응답을 적용한 후 다음을 수행할 수 있습니다.

  • 빌드 단계 확인 > 번들 리소스 복사
  • 이름이 지정된 파일에 대한 필터GoogleService-Info.plist
  • 스크립트를 통해 이미 복사되고 있으므로 해당 참조를 제거합니다.

다음은 Xamarin C#에서 수행하는 방법입니다.

string plistPath = NSBundle.MainBundle.PathForResource ("GoogleService-Info", "plist");
Options options = new Options (plistPath);
App.Configure (options);

Firebase 네임스페이스를 포함해야 합니다.

using Firebase.Analytics;

Xcode 9.2에서는 두 대상의 파일이 모두 "googleServiceInfo.plist"로 지정되어야 하지만 각 대상의 디렉터리/파일이 "빌드 단계", "번들 리소스 복사"에 지정된 서로 다른 디렉터리에 배치되어야 합니다.

위의 내용은 제가 선호하는 해결책은 아니었지만, 저는 이전에 스위프트 4로 변환된 @inidona의 답변에 따라 다른 파일 이름을 사용하려고 시도했습니다.

 let filePath = Bundle.main.path(forResource: "googleServiceInfo-Pro", ofType: "plist")!
 let options = FirebaseOptions(contentsOfFile: filePath)
 FirebaseApp.configure(options: options!)

안타깝게도 Firebase 오류 메시지는 수정되지 않았습니다.이 질문의 내용:Firebase iOS SDK - GoogleService-Info.plist 이외의 구성 파일을 사용하면 Firebase Pod를 업데이트하여 원래 포스터가 수정된 것으로 보인다는 콘솔 경고가 생성되지만 확인되지 않았습니다.

@바실리 보드나르추크의 대답은 저에게 효과가 있었습니다.주의해야 할 것은 Xcode의 스크립트가 정확한 순서를 가지고 있다는 것입니다. 따라서 이 스크립트를 첫 번째 순서로 지정해야 합니다.

${PODS_ROOT}/FirebaseCrashlytics/run

그리고.

"${PODS_ROOT}/FirebaseCrashlytics/upload-symbols" -gsp "${PROJECT_DIR}/<yourapp>/Configuration Files/GoogleService-Info-dev.plist" -p ios "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"

Fastlane에서 하고 싶은 사람들을 위해.

fastlane용 파일 관리자 플러그인(fastlane-plugin-file_manager)을 사용하여 간단한 복사 명령을 실행할 수 있습니다.

  1. 표준 방식으로 xcode 프로젝트에 GoogleService-info-app.plist를 추가하여 올바르게 연결할 수 있습니다.

  2. 복사 파일을 사용하여 이 링크된 파일을 빌드/베타 레인에 원하는 파일로 덮어씁니다.

    copy_files(소스: "firebase/GoogleService-Info-" + ENV["APP_IDTIFIER""] + ".plist", 대상: "GoogleService-Info.plist")

파티에 늦었지만, 저는 이것을 위한 해결책이 있습니다.목록의 이름은 다음과 같습니다.Google 서비스-Info-target1

Google 서비스-Info-target2

Google 서비스-Info-target3

그런 다음 새 실행 스크립트 단계를 추가하여 각 대상의 빌드 단계 탭에 다음 스크립트를 추가합니다.

PATH_TO_PLISTS="${PROJECT_DIR}/${PROJECT_NAME}/(모든 플리스트를 포함하는 폴더 이름)" 대소문자 "${TARGET_NAME}"

"target1 name" ) cp -r "$PATH_TO_PLIST/Google Service-Info-target1.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Google Service-Info.plist";

"target2 name" ) cp -r "$PATH_TO_PLISTS/Google 서비스-Info-target2.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist";

"target3 name" ) cp -r "$PATH_TO_PLISTS/Google 서비스-Info-target3.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist";

*);; esac

드디어 macOS 앱에서 작동합니다.

@vasly-bodnarchuk의 iOS 앱용 솔루션에 감사드립니다.그러나 macOS 앱의 경우 스크립트 파일에서 추가 수정이 거의 필요하지 않습니다.

macOS "Contents\Resources"에 대해 지정된 리소스 디렉토리를 추가하기만 하면 됩니다.번들 리소스 복사에 대한 자세한 내용을 확인하십시오.

코드

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/Contents/Resources/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/Contents/Resources/GoogleService-Info.plist" ;;

    *)
        ;;
esac

Stage, QA, UAT 및 PROD와 같은 여러 계획의 경우 아래 스크립트 하나를 사용할 수 있습니다.또한 구성 이름으로 .xccconfig 파일을 유지 관리했습니다.

 # Get a reference to the folder which contains the configuration 
   subfolders.
    CONFIGURATIONS_FOLDER=Firebase
 # Get a refernce to the filename of a 'GoogleService-Info.plist' file.
    GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
 # Get a reference to the 'GoogleService-Info.plist' for the current 
   configuration. ENV_NAME name is the folder name(Dev,QA,Uat,Prod) 
   which i have in my .xcconfig file for each environment.
    GOOGLESERVICE_INFO_PLIST_LOCATION=${PROJECT_DIR}/${TARGET_NAME}
    /${CONFIGURATIONS_FOLDER}/${ENV_NAME}/${GOOGLESERVICE_INFO_PLIST}
 # Check if 'GoogleService-Info.plist' file for current configuration 
   exist.
    if [ ! -f $GOOGLESERVICE_INFO_PLIST_LOCATION ]
   then
    echo "No '${GOOGLESERVICE_INFO_PLIST}' file found for the 
    configuration '${CONFIGURATION}' in the configuration directory 

    '${PROJECT_DIR}/${TARGET_NAME}/${CONFIGURATIONS_FOLDER}/
    ${CONFIGURATION}'."
   exit 1
 fi
  # Get a reference to the destination location for the GoogleService- 
    Info.plist.
     GOOGLESERVICE_INFO_PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}
     /${PRODUCT_NAME}.app
  # Copy 'GoogleService-Info.plist' for current configution to 
    destination.
     cp "${GOOGLESERVICE_INFO_PLIST_LOCATION}" 
     "${GOOGLESERVICE_INFO_PLIST_DESTINATION}"
     echo "Successfully coppied the '${GOOGLESERVICE_INFO_PLIST}' file 
     for the '${CONFIGURATION}' configuration from 
     '${GOOGLESERVICE_INFO_PLIST_LOCATION}' to 
     '${GOOGLESERVICE_INFO_PLIST_DESTINATION}'."

Google 서비스-Info-dev.plist, Google 서비스-Info-prod를 배치합니다.루트 디렉토리의 일부 폴더에 있는 plist 파일

예:

빌드 단계 스크립트 추가

# Set the path to the googleServiceInfo folder
GOOGLE_SERVICE_INFO_PATH="${PROJECT_DIR}/googleServiceInfo"

GENERATED_INFO_FILE_PATH="${PROJECT_DIR}/${PRODUCT_NAME}"

# Determine the appropriate GoogleService-Info.plist file based on the environment
if [[ "${CONFIGURATION}" == "Debug-dev" || "${CONFIGURATION}" == "Release-dev" ]]; then
    cp -r "$GOOGLE_SERVICE_INFO_PATH/GoogleService-Info-dev.plist" "$GENERATED_INFO_FILE_PATH/GoogleService-Info.plist"
elif [[ "${CONFIGURATION}" == "Debug-production" || "${CONFIGURATION}" == "Release-production" || "${CONFIGURATION}" == "Profile-production" ]]; then
    cp -r "$GOOGLE_SERVICE_INFO_PATH/GoogleService-Info-prod.plist" "$GENERATED_INFO_FILE_PATH/GoogleService-Info.plist"
fi

이 스크립트 내에서 빌드 변형을 확인할 수 있습니다. 섹션 등에서 확인할 수 있습니다.

빌드 단계 스크립트 내에 출력 파일을 추가하는 것을 잊지 마십시오.

빌드 단계 스크립트에 출력 파일 배치

컴파일 소스 위에서 빌드 단계 스크립트(여기서 GoogleServiceInfo로 이름 변경)를 이동합니다.

키노트:빌드 스크립트를 실행하는 동안 로그를 확인합니다.여기서 대상 이름은 Runner입니다. 그에 따라 변경할 수 있습니다.

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/37615405/use-different-googleservice-info-plist-for-different-build-schemes