ใช้ GoogleService-Info.plist ที่แตกต่างกันสำหรับแผนการสร้างที่แตกต่างกัน


111

ฉันใช้โครงร่างการสร้างสำหรับ prod และอีกหนึ่งรายการสำหรับการจัดเตรียม (ที่มีตัวระบุบันเดิลที่แตกต่างกัน 2 รายการ) และฉันกำลังพยายามใช้ GoogleService-Info.plist แยกต่างหากสำหรับแต่ละรูปแบบ มีวิธีใดในการเลือกไฟล์ plist ด้วยตนเองเพื่อใช้เมื่อเริ่มต้น GCM (และเข้าสู่ระบบ goole) หรือเป็นไปได้หรือไม่ที่จะหลีกเลี่ยงการใช้ plist และทำการตั้งค่าด้วยตนเอง?

ขอบคุณ!


3
คุณใช้สองเป้าหมายที่แตกต่างกัน? จากนั้นให้มีไฟล์อื่น (ที่มีชื่อเดียวกัน) ใน Copy Bundle Resources ที่ต่างกัน (ซึ่งอยู่ในขั้นตอนการสร้าง)
Alexander Zimin

6
บทความนั้นมีประโยชน์สำหรับฉันmedium.com/rocket-fuel/… .
Eugeny

ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันstackoverflow.com/a/58709334/11537677
Knight Fighter

คำตอบ:


145

รายละเอียด

ทดสอบเมื่อ:

  • 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

สร้างชื่อโครงร่าง

ใส่คำอธิบายภาพที่นี่


2
บันทึกคำตอบที่ดีสำหรับวันของฉัน
Siddh

1
นี่คือคำตอบที่ใช่ เห็นได้ชัดว่า Firebase Analytics ต้องการไฟล์ plist ในไดเรกทอรีรากของแอปแม้ว่าคุณจะเรียกconfigure(options:)ก็ตาม github.com/firebase/quickstart-ios/issues/5
Rob Bajorek

2
นี่เป็นทางออกที่ดีมากและควรได้รับการยอมรับว่าเป็นคำตอบ
Luke Brandon Farrell

1
คำตอบที่เบาและฉลาดมาก ขอบคุณ!
gabuchan

1
@smileBot คุณสามารถข้าม-rไปได้ข้อมูลเพิ่มเติม: คำสั่ง cp ใน Linux / Unix
Vasily Bodnarchuk

74

คำตอบของ @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!)

1
ด้วยรหัสข้างต้นคุณมีไฟล์สองGoogleService-Info.plistไฟล์ที่แตกต่างกันในตำแหน่งที่ต่างกันหรืออาจมีสองไฟล์ที่มีชื่อต่างกัน คุณช่วยกรุณาให้ข้อมูลเพิ่มเติมเกี่ยวกับชื่อไฟล์ที่แท้จริงคืออะไรและวางไว้ที่ไหน
Varun Gupta

1
ฉันมีไฟล์ 2 ไฟล์ชื่อ GoogleService-Info-dev.plist GoogleService-Info-live.plist รหัสนี้ช่วยให้คุณสามารถบอกแอปของคุณว่าไฟล์ข้อมูลใดที่คุณต้องการใช้งานแทน GoogleService-Info-dev.plist เริ่มต้นใช้คำสั่งเงื่อนไขหรือ กำหนดแฟล็กเพื่อสลับระหว่างไฟล์ของคุณ
Essam Elmasry

ใช่ใน AppDelegate
Essam Elmasry

1
ให้ฉัน 'ไม่พบไฟล์การกำหนดค่า:' GoogleService-Info.plist ''
orium

เอกสารล่าสุดระบุว่า "คำเตือน: วิธีนี้อาจส่งผลต่อการรวบรวม Analytics ในบางสถานการณ์" firebase.google.com/docs/projects/multiprojects
Shingo Fukuyama

30

ตรวจสอบบทความนี้: https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environment-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:

สร้างขั้นตอน> คัดลอกทรัพยากรบันเดิล

แค่นั้นแหละ :)


1
สิ่งนี้ได้ผลสำหรับฉัน คุณต้องเพิ่มโฟลเดอร์เหล่านี้ไว้ที่นั่นเพื่อเป็นข้อมูลอ้างอิงมิฉะนั้นมันจะพังแน่นอน ขอบคุณ!
Eironeia

วิธีนี้ยังไม่สามารถแก้ปัญหาสำหรับAnalyticsกรอบงานคุณไม่สามารถบอกได้ว่า.plistกำลังโหลดใด
ไลฟ์สด

@ Bruno Lemos ฉันสามารถใช้โครงการ Firebase สองโครงการจากโครงการ xcode พร้อมกันได้หรือไม่ ไม่เป็นDebug& Release? เพราะเมื่อฉันพยายามทำสิ่งนี้ฉันมักจะจบลงด้วยการalready configured crash.ทำตามคำแนะนำล่าสุดจากเอกสารอย่างเป็นทางการของ Firebase ขอบคุณ
Tulon

24

ฉันคิดว่าคุณสามารถใช้วิธีนี้เพื่อกำหนดค่า GoogleService-Info.plist แบบไดนามิกและใช้ชื่อที่แตกต่างกันสำหรับตัวระบุกลุ่มต่างๆ

Ciao Andreas

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

5
ด้วยรหัสด้านบนคุณมีไฟล์ GoogleService-Info.plist สองไฟล์ที่ต่างกันหรือไม่หรืออาจมีสองไฟล์ที่มีชื่อต่างกัน คุณช่วยกรุณาให้ข้อมูลเพิ่มเติมเกี่ยวกับชื่อไฟล์ที่แท้จริงคืออะไรและวางไว้ที่ไหน
Varun Gupta

4
ฉันได้รับข้อผิดพลาดนี้ในบันทึกระหว่างการโทรCould not locate configuration file: 'GoogleService-Info.plist'
configWithOptions

14

ฉันสังเกตเห็นว่า 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 ที่มาพร้อมกับเป้าหมายแอปของคุณ

ดังนั้นฉันเพียงแค่คัดลอกไฟล์เดียวกันและใส่ลงในไดเร็กทอรีต่างกันและผูกไว้กับเป้าหมายที่แตกต่างกัน:

ใส่คำอธิบายภาพที่นี่


ขอบคุณง่ายมากและใช้งานได้ดีสำหรับฉัน Xcode 10.1, FirebaseCore (5.3.1)
infinity_coding7

วิธีหลีกเลี่ยงข้อผิดพลาด "สร้างคำสั่งหลายคำสั่ง" ซึ่งเกิดขึ้นหลังจาก Plist หลายไฟล์หรือไฟล์อื่น ๆ ภายในแอพ
Wahab Khan Jadon

11

หากGoogleService-Info.plistมีชื่ออื่นจะส่งผลต่อผลการวิเคราะห์ของคุณ Firebase จะเตือนคุณเกี่ยวกับเรื่องนี้ https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-327138180https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-327138180ด้วยเหตุนี้จึงไม่มีโซลูชันรันไทม์เหล่านี้ที่จะให้ผลการวิเคราะห์ที่ดีที่สุด

มีสองวิธีที่จะไม่ยุ่งกับ Analytics

  1. ใช้เป้าหมายที่แตกต่างกันกับแต่ละแบบแผนและเชื่อมโยงแต่ละเวอร์ชันGoogleService-Info.plistกับเป้าหมายของตนเอง ดูการเป็นสมาชิกเป้าหมายในตัวตรวจสอบไฟล์ทางด้านขวามือใน Xcode สำหรับข้อมูลเพิ่มเติมโปรดดูคำถามนี้

  2. ใช้สคริปต์สร้างขั้นตอนการคัดลอกรุ่นที่ถูกต้องของการGoogleService-Info.plistเข้าไปสร้างไดเรกทอรี ฉันใช้รหัสบันเดิลอื่นสำหรับการจัดเตรียมและการผลิต สิ่งนี้ทำให้ฉันสามารถติดตั้งแอปทั้งสองเวอร์ชันพร้อมกันได้ นอกจากนี้ยังหมายความว่าด้วยสคริปต์ด้านล่างฉันสามารถตั้งชื่อGoogleService-Info.plistไฟล์ต่างๆของฉันด้วยรหัสบันเดิล ตัวอย่างเช่น:

    • 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 Crashlytics สามารถใช้เฉพาะไฟล์ GoogleService-Info.plist เพื่ออัปโหลดไฟล์ dSYM โดยใช้สคริปต์ "สัญลักษณ์การอัปโหลด" - โซลูชันนี้ทำงานได้อย่างสมบูรณ์แบบ!
Alexey Galishnikov

7

สาย แต่ฉันคิดว่าฉันต้องโพสต์คำตอบนี้เพื่อช่วยนักพัฒนาใหม่ฉันพบบทความที่ดีมากที่ช่วยแก้ปัญหาของฉันและฉันสัญญาว่ามันจะช่วยคุณได้เช่นกัน :)
ตรวจสอบสิ่งนี้บทความที่แก้ปัญหาของคุณได้เป็นอย่างดี

ขั้นตอนที่ 1:
คัดลอกGoogleService-Info.plist ที่ตรงกับสภาพแวดล้อมการพัฒนา Firebase ของคุณไปยังไดเรกทอรีDev ในทำนองเดียวกันให้คัดลอกไฟล์ GoogleService-Info.plist ที่ตรงกับสภาพแวดล้อมการใช้งานจริง Firebase ของคุณในไดเรกทอรีProd ให้แน่ใจว่าจะยกเลิกการทำรายการ“คัดลอกถ้าจำเป็น”และเป้าหมายทั้งหมดภายใต้“เพิ่มเป้าหมาย”

(ลิงก์รูปภาพขั้นตอนที่ 1 (ฉันไม่สามารถเพิ่มรูปภาพได้เนื่องจากมีชื่อเสียงน้อยกว่า))

ขั้นตอนที่ 2:
ในตัวนำทางโครงการ Xcode ให้เลือกเป้าหมายของแอป สลับไปที่รูปร่างเฟสแท็บที่ด้านบนแล้วเพิ่มใหม่เรียกใช้สคริปต์เฟส ตั้งชื่อเฟสว่า“ Setup Firebase Environment GoogleService-Info.plist”หรืออะไรบางอย่างที่มีผลและวางไว้หน้า“ คัดลอกทรัพยากร Bundle”ขั้นตอน

ขั้นตอนที่ 3:
ติดตั้งเชลล์สคริปต์ที่จะคัดลอกGoogleService-Info.plistที่เหมาะสมลงใน App Bundle ตามการกำหนดค่าวด์ คัดลอกและวางเชลล์สคริปต์ต่อไปนี้ลงในเฟสสคริปต์การรันที่คุณเพิ่งสร้าง:

# 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

6

คุณไม่สามารถหลีกเลี่ยงที่จะใช้ plist กับ Firebase ทางออกที่ดีที่สุดที่ฉันพบสำหรับคุณคือการเพิ่มทั้งสองไฟล์และตั้งชื่อ

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

การกำหนดค่า Runtime สามารถนำไปสู่การวิเคราะห์รายงานปัญหาตามที่กล่าวไว้ในเอกสาร
Alex

3

คำตอบนี้ได้รับแรงบันดาลใจมากจาก@abboodคำตอบของแต่มีความเฉพาะเจาะจงมากขึ้นเกี่ยวกับวิธีการทำ

สำหรับแต่ละเป้าหมายของคุณเช่น dev, stg, prod:

  • ดาวน์โหลดไฟล์ที่เกี่ยวข้องGoogleService-Info.plistกับโฟลเดอร์แยกที่ตั้งชื่อตามเป้าหมายของคุณ
  • ใน Xcode ให้คลิกขวาที่โฟลเดอร์แอปของคุณแล้วเลือก Add files to "your app" ใส่คำอธิบายภาพที่นี่
  • เลือกโฟลเดอร์ที่มีเป้าหมายGoogleService-Info.plistตรวจสอบให้แน่ใจCopy items if neededและCreate groupsถูกเลือกตรวจสอบเฉพาะเป้าหมายที่เกี่ยวข้องในรายการเป้าหมายแล้วกดAdd ใส่คำอธิบายภาพที่นี่

แค่นั้นแหละ. ตอนนี้คุณควรมีสิ่งที่คล้ายกับโครงสร้างนี้

ใส่คำอธิบายภาพที่นี่

เมื่อคุณสร้างเป้าหมายระบบGoogleService-Info.plistจะใช้ที่ถูกต้อง


ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน
Şafak Gezer

2

วิธีดำเนินการใน Xamarin C # มีดังนี้

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

อย่าลืมรวมเนมสเปซ Firebase:

using Firebase.Analytics;

2

นี่คือทางออกของฉัน!

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];

เท่านี้เอง!


1

ฉันคิดว่าเป็นไปไม่ได้ที่จะบรรลุโดยไม่ใช้GoogleService-Info.plist.เนื่องจากก่อนที่คุณจะเริ่มรวมแอป iOS ของคุณเข้ากับส่วนประกอบการลงชื่อเข้าใช้ Google คุณต้องดาวน์โหลดการอ้างอิงและกำหนดค่าโครงการ Xcode ของคุณ และกระบวนการนี้แสดงให้เห็นว่าGoogleService-Info.plistมีปัจจัยใหญ่ในนั้น

ดังนั้นคำตอบและแนวคิดในคำถาม SOนี้สามารถช่วยคุณแก้ปัญหาของคุณได้ เพิ่งย้ายสำเนาหลักของไฟล์GoogleService-Info plistแอปออกเป็น 2 โฟลเดอร์แยกกันจากนั้นใช้ Build Phases "Copy Files" ในแต่ละเป้าหมายเพื่อนำเข้า plist เฉพาะเป้าหมายไปยังโฟลเดอร์ Resources

ตรวจสอบคำถาม SOนี้ด้วยอาจให้ข้อมูล / แนวคิดเพิ่มเติมเกี่ยวกับปัญหาของคุณ


เป้าหมายหมายถึงโครงการอื่นสำหรับโครงการเดียวกันหรือไม่ หลังจากอ่านคำถามฉันรวบรวมว่าเป้าหมายหมายถึงเป้าหมายการสร้างที่แตกต่างกันโดยสิ้นเชิงไม่ใช่แค่โครงร่างการสร้างที่แตกต่างกันสำหรับเป้าหมายเดียวกัน
Varun Gupta

1
แต่ถ้าคุณมีเป้าหมายเดียวที่มีการกำหนดค่าที่แตกต่างกันสำหรับแต่ละรูปแบบ?
evya

1

ด้วย Xcode 9.2 ฉันต้องการไฟล์สำหรับเป้าหมายทั้งสองเพื่อตั้งชื่อว่า "googleServiceInfo.plist" แต่วางไว้ในไดเร็กทอรีต่างกันโดยมีไดเร็กทอรี / ไฟล์สำหรับแต่ละเป้าหมายที่ระบุใน "Build Phases", "Copy Bundle Resources"

ข้างต้นไม่ใช่วิธีแก้ปัญหาที่ฉันต้องการ แต่ก่อนหน้านี้ฉันได้ลองใช้ชื่อไฟล์ที่แตกต่างกันตามบรรทัดของคำตอบของ @ inidona แปลงเป็น Swift 4:

 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 แต่ฉันยังไม่ได้ยืนยันสิ่งนี้


1

ฉันแก้ไขสิ่งนี้โดยสิ่งนี้:

    #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

1

หากบางท่านเกิดข้อผิดพลาดและ Xcode บ่น

"คำสั่งหลายคำสั่งสร้าง GoogleService-Info.plist"

หลังจากใช้การตอบกลับของ @Knight Fighter คุณอาจต้องการ:

  • ตรวจสอบขั้นตอนการสร้าง> คัดลอกทรัพยากรบันเดิล
  • กรองไฟล์ชื่อ GoogleService-Info.plist
  • ลบการอ้างอิงใด ๆ ที่คุณต้องการเนื่องจากมีการคัดลอกผ่านสคริปต์แล้ว

0

ดังนั้นฉันจึงได้ไตร่ตรองคำถามเดียวกันและใช้แนวคิดบางอย่างจากโพสต์ก่อนหน้านี้ซึ่งบางส่วนเผยแพร่แอปGoogleServices-Info.plistสำหรับทุกสภาพแวดล้อมในทุกแอปและนั่นเป็นเรื่องที่น่ากังวลเล็กน้อย

ฉันได้หาโซลูชันที่ขยายได้ซึ่งคัดลอกGoogleSerives-Info.plistไฟล์ในเวลาสร้าง ยิ่งไปกว่านั้นวิธีนี้ยังรองรับสภาพแวดล้อมได้มากเท่าที่คุณต้องการด้วยความสามารถในการปรับแต่งและทำตามหลักการง่ายๆทำให้ง่ายต่อการจัดการ

อันดับแรกและสำคัญที่สุดฉันมีสภาพแวดล้อมสามแบบdebug(สำหรับการทำงานในโปรแกรมจำลองและการดีบักของอุปกรณ์และการตัดรหัสอย่างกระตือรือร้น) staging(สำหรับการปรับใช้เพื่อทดสอบเที่ยวบิน) และreleaseสำหรับการผลิต

ขั้นตอนที่หนึ่งคือการสร้างการกำหนดค่าของคุณ:

ใส่คำอธิบายภาพที่นี่

เลือก "Product" -> "Scheme" -> "Edit Scheme" และทำซ้ำ / สร้างใหม่ตามต้องการ สำรวจแต่ละโครงการและกำหนดการกำหนดค่าตามลำดับจากเมนูแบบเลื่อนลง "Build Configuration" ในแต่ละหมวดหมู่:

ใส่คำอธิบายภาพที่นี่

ฉันก้าวไปอีกขั้นและยกเลิกการเลือก "run" สำหรับ Schemes ที่ต้องแจกจ่ายเช่น release และ staging และยกเลิกการเลือก "archive" เพื่อแก้ไขข้อบกพร่อง คุณควรทำในสิ่งที่เหมาะสมสำหรับคุณ

ใส่คำอธิบายภาพที่นี่

ภายใต้ขั้นตอนการสร้างให้เพิ่ม run scrip ต่อไปนี้ ( 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" ในตัวอย่างด้านบน) ซ้อนโฟลเดอร์สำหรับการกำหนดค่าแต่ละรายการที่มีชื่อเหมือนกันทุกประการกับการกำหนดค่าตามลำดับ (คำนึงถึงตัวพิมพ์เล็กและใหญ่) ซึ่งภายในจะวางGoogleServices-Info.plistไฟล์ตามลำดับดังนี้:

ใส่คำอธิบายภาพที่นี่

สุดท้าย แต่ไม่GoogleServices-Info.plistท้ายสุดฉันต้องการให้แน่ใจว่าไม่ได้เพิ่มระดับรูทลงในโปรเจ็กต์โดยไม่ได้ตั้งใจดังนั้นฉันจึงเพิ่มสิ่งต่อไปนี้ใน. gitignore ของฉัน

# Ignore project level GoogleService-Info.plist
/[Project Name]/GoogleService-Info.plist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.