विभिन्न बिल्ड योजनाओं के लिए अलग-अलग GoogleService-Info.plist का उपयोग करें


110

मैं ठेस के लिए एक बिल्ड योजना का उपयोग कर रहा हूं और एक मंचन के लिए (2 अलग बंडल पहचानकर्ताओं के साथ) और मैं प्रत्येक योजना के लिए एक अलग GoogleService-Info.plist का उपयोग करने का प्रयास कर रहा हूं। क्या GCM (और goole लॉगिन) को इनिशियलाइज़ करने के लिए प्लिस्ट फ़ाइल को मैन्युअल रूप से चुनने का कोई तरीका है? या क्या इसका उपयोग प्लेस्ट से बचने और मैन्युअल रूप से सेटअप करने से संभव है?

धन्यवाद!


3
आप दो अलग-अलग लक्ष्यों का उपयोग करते हैं? फिर अलग-अलग कॉपी बंडल रिसोर्सेज में अलग-अलग फाइल (एक ही नाम के साथ) (कि बिल्ड चरणों में)।
अलेक्जेंडर झिमिन

6
वह लेख मेरे लिए मददगार था मध्यम . com/rocket-fuel/…
यूजनी

पूरी तरह से मेरे लिए काम किया stackoverflow.com/a/58709334/11537677
नाइट फाइटर

जवाबों:


142

विवरण

पर परीक्षण किया गया:

  • 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
मेरा दिन बचाने के महान जवाब
सिद्ध

1
यह सही जवाब है। जाहिरा तौर पर फायरबेस एनालिटिक्स को आपके ऐप की रूट डायरेक्टरी में उस फ़ाइल की आवश्यकता होती है, भले ही आप कॉल करें configure(options:)github.com/firebase/quickstart-ios/issues/5
Rob Bajorek

2
यह एक बहुत अच्छा समाधान है और इसे उत्तर के रूप में स्वीकार किया जाना चाहिए।
ल्यूक ब्रैंडन फैरेल

1
बहुत हल्का और स्मार्ट, शानदार जवाब। धन्यवाद!
गाबुचन

1
@smileBot को आप छोड़ सकते हैं -r, अधिक जानकारी: Linux / Unix में cp कमांड
Vasily Bodnarchuk

74

@inidona के जवाब ने मेरे लिए काम किया। बाद मैंने इसे स्विफ्ट में बदल दिया

स्विफ्ट 2.3 के लिए:

let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info", ofType: "plist")
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configureWithOptions(options)

स्विफ्ट 3.0 के लिए:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configure(with: options)

स्विफ्ट 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अलग स्थानों पर दो अलग-अलग फाइलें हैं या अलग-अलग नामों वाली दो फाइलें हो सकती हैं। क्या आप वास्तविक फ़ाइल नाम क्या हैं और उन्हें कहाँ रखा गया है, इसके बारे में कुछ और जानकारी प्रदान कर सकते हैं?
वरुण गुप्ता

1
मेरे पास GoogleService-Info-dev.plist नाम की 2 फाइलें हैं। GoogleService-Info-live। अपनी फ़ाइलों के बीच वैकल्पिक करने के लिए झंडे लक्षित करें
Essam Elmasry

yup, 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-en environment-157b40512164

Xcode पर, अपनी परियोजना के अंदर दो निर्देशिकाएँ बनाएँ: Debugऔर Release। प्रत्येक GoogleService-Info.plistफ़ाइल वहाँ रखो ।

पर AppDelegate.m, अंदर didFinishLaunchingWithOptionsविधि, कोड डाल:

उद्देश्य सी

  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किसको लोड किया जा रहा है।
नॉवेल

@ ब्रूनो लेमोस, क्या मैं एक साथ एक xcode प्रोजेक्ट से दो फायरबेस प्रोजेक्ट्स का उपयोग कर सकता हूं? नहीं के रूप में Debugऔर Release? जब मैं ऐसा करने की कोशिश करता हूं, तो मैं हमेशा समाप्त होता already configured crash.हूं, मैंने फायरबेस आधिकारिक दस्तावेज से नवीनतम निर्देश का पालन किया है। धन्यवाद
Tulon

24

मुझे लगता है कि आप अपने GoogleService-Info.plist को गतिशील रूप से कॉन्फ़िगर करने के लिए इस तरह का उपयोग कर सकते हैं और विभिन्न बंडल पहचानकर्ताओं के लिए विभिन्न नामों का उपयोग कर सकते हैं।

सियाओ एंड्रियास

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

5
उपरोक्त कोड के साथ, क्या आपके पास अलग-अलग स्थानों पर दो अलग-अलग फाइलें GoogleService-Info.plist हैं या अलग-अलग नामों वाली दो फाइलें हो सकती हैं। क्या आप वास्तविक फ़ाइल नाम क्या हैं और उन्हें कहाँ रखा गया है, इसके बारे में कुछ और जानकारी प्रदान कर सकते हैं?
वरुण गुप्ता

4
मुझे यह त्रुटि कॉन्फ़िगर करने के दौरान लॉग में मिल रही है। कॉल कॉल:Could not locate configuration file: 'GoogleService-Info.plist'
बबकेन वर्दयान

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

"मल्टिपल कमांड प्रोडक्शन" एरर से कैसे बचें क्योंकि ऐप के भीतर कई प्लिस्ट या अन्य फाइलों के कारण होता है
वहाब खान जादोन

11

यदि GoogleService-Info.plistएक अलग नाम है तो यह आपके विश्लेषिकी परिणामों को प्रभावित करेगा। फायरबेस आपको इस बारे में चेतावनी देगा। https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-327138180 । इस कारण से, इनमें से कोई भी रनटाइम-समाधान सर्वश्रेष्ठ विश्लेषण परिणाम प्रदान नहीं करेगा।

दो समाधान हैं जो विश्लेषिकी के साथ गड़बड़ नहीं करेंगे।

  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 फ़ाइलों को अपलोड कर सकता है - यह समाधान पूरी तरह से काम करता है!
एलेक्सी गैलिशनिकोव

6

आप फायरबेस के साथ प्लिस्ट का उपयोग करने से बच नहीं सकते। आपके लिए अब तक का सबसे अच्छा समाधान मैंने इसे दोनों फाइलों को जोड़ने और नाम देने के लिए किया

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

रनटाइम कॉन्फ़िगरेशन में डॉक्स में बताए अनुसार एनालिटिक्स रिपोर्टिंग समस्याओं को जन्म दे सकता है ।
एलेक्स

6

देर से लेकिन मुझे लगता है कि मुझे नए डेवलपर्स की मदद करने के लिए इस उत्तर को पोस्ट करना होगा, मुझे एक बहुत अच्छा लेख मिला जो मेरी समस्या को हल करता है और मैं वादा करता हूं कि यह आपकी भी मदद कर सकता है :) इस लेख की
जांच करें जो आपकी समस्या को भी हल करता है।

चरण 1: अपने फायरबेस विकास वातावरण के अनुरूप GoogleService-Info.plist को देव निर्देशिका में
कॉपी करें । इसी तरह, कॉपी GoogleService-Info.plist में अपने Firebase उत्पादन वातावरण के लिए इसी प्रॉड निर्देशिका। "यदि आवश्यक हो तो कॉपी आइटम" और " लक्ष्य में जोड़ें" के तहत सभी लक्ष्यों को अनचेक करने के लिए सुनिश्चित करें ।

(चरण 1 छवि लिंक (मैं कम प्रतिष्ठा के कारण छवि जोड़ने में सक्षम नहीं हूं))

चरण 2:
Xcode प्रोजेक्ट नेविगेटर में, एप्लिकेशन लक्ष्य चुनें। शीर्ष पर चरण बिल्ड टैब में स्विच करें, तो एक जोड़ने के लिए नई भागो स्क्रिप्ट चरण । चरण का नाम “सेटअप फायरबेस पर्यावरण GoogleService-Info.plist” , या उस प्रभाव के लिए कुछ, और इसे “कॉपी बंडल संसाधन” कदम से पहले रखें।

चरण 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

3

यह उत्तर @abbood के उत्तर से बहुत प्रेरित है , लेकिन इसे कैसे किया जाए, इस पर थोड़ा और विशिष्ट।

अपने प्रत्येक लक्ष्य के लिए, जैसे देव, एसटीजी, ठेस:

  • GoogleService-Info.plistअपने लक्ष्य के नाम पर एक अलग फ़ोल्डर में संबंधित को डाउनलोड करें
  • Xcode में, अपने ऐप फ़ोल्डर पर राइट-क्लिक करें और चुनें Add files to "your app" यहां छवि विवरण दर्ज करें
  • लक्ष्य युक्त फ़ोल्डर का चयन करें GoogleService-Info.plist, सुनिश्चित करें Copy items if neededऔर Create groupsचयनित हैं, लक्ष्य की सूची में केवल उसी लक्ष्य को जांचें, और दबाएंAdd यहां छवि विवरण दर्ज करें

बस। अब आपके पास इस संरचना के समान कुछ होना चाहिए

यहां छवि विवरण दर्ज करें

जब आप एक लक्ष्य बनाते हैं, तो सही GoogleService-Info.plistका उपयोग किया जाएगा।


मेरे लिए पूरी तरह से काम किया।
.फाक गीजर

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 अलग-अलग फ़ोल्डरों में ले जाया गया , फिर संसाधन फ़ोल्डर में लक्ष्य विशिष्ट plist को आयात करने के लिए प्रत्येक लक्ष्य पर बिल्ड चरणों "कॉपी फाइलें" का उपयोग किया।

इस SO प्रश्न को भी देखें , इससे आपको अपनी समस्या के बारे में अधिक जानकारी / विचार मिल सकता है।


यहां, क्या लक्ष्य एक ही परियोजना के लिए एक अलग योजना का मतलब है? प्रश्नों को पढ़ने के बाद, मैं इकट्ठा हुआ कि लक्ष्य का मतलब है एक अलग निर्माण लक्ष्य पूरी तरह से और न केवल एक ही लक्ष्य के लिए एक अलग निर्माण योजना।
वरुण गुप्ता

1
लेकिन क्या होगा यदि आपके पास प्रत्येक योजना के लिए एक अलग कॉन्फ़िगरेशन के साथ एक लक्ष्य है?
वाया

1

Xcode 9.2 के साथ, मुझे "googleServiceInfo.plist" नाम के दोनों लक्ष्यों के लिए फ़ाइलों की आवश्यकता है, लेकिन "बिल्ड चरणों", "कॉपी बंडल संसाधन" में निर्दिष्ट प्रत्येक लक्ष्य के लिए निर्देशिका / फ़ाइल के साथ विभिन्न निर्देशिकाओं में रखा गया है।

उपरोक्त मेरा पसंदीदा समाधान नहीं था, लेकिन मैंने पहले @ इनडोना के उत्तर की तर्ज पर अलग-अलग फ़ाइलनामों का उपयोग करने की कोशिश की थी, जो स्विफ्ट 4 में बदल गया:

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

दुर्भाग्य से, यह फायरबेस त्रुटि संदेशों को ठीक नहीं करता था। इस प्रश्न में: फायरबेस आईओएस एसडीके - GoogleService-Info.plist के अलावा अन्य कॉन्फ़िगरेशन फ़ाइल का उपयोग करके कंसोल को चेतावनी देता है कि मूल पोस्टर फ़ायरबॉस् पॉड को अपडेट करके ठीक किया गया लगता है, लेकिन मैंने इसकी पुष्टि नहीं की है।


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 का उत्पादन करते हैं"

@ रात सेनानी प्रतिक्रिया लागू करने के बाद , आप निम्न करना चाहते हैं:

  • बिल्ड चरणों की जाँच करें > बंडल संसाधनों की प्रतिलिपि बनाएँ
  • नामित फ़ाइलों के लिए फ़िल्टर करें GoogleService-Info.plist
  • अपने पास मौजूद किसी भी संदर्भ को हटा दें, क्योंकि यह पहले से ही स्क्रिप्ट के माध्यम से कॉपी किया जा रहा है।

0

इसलिए मैंने एक ही सवाल किया है और पहले के पोस्ट से कुछ विचारों का उपयोग कर रहा हूं, जिनमें से कुछ एप्लिकेशन में GoogleServices-Info.plistसभी वातावरणों के लिए एप्लिकेशन प्रकाशित करते हैं और यह थोड़ा चिंता का विषय है।

मैं एक एक्स्टेंसिबल समाधान के साथ आया हूं जो GoogleSerives-Info.plistबिल्ड समय पर फ़ाइल की प्रतिलिपि बनाता है । आगे यह दृष्टिकोण कई वातावरणों का समर्थन कर सकता है जैसा कि आप अनुकूलित करने की क्षमता के साथ पसंद करते हैं और एक साधारण सम्मेलन का अनुसरण करते हैं, जिससे इसे प्रबंधित करना आसान हो जाता है।

सबसे पहले और सबसे पहले मेरे पास तीन वातावरण हैं, debug(सिम्युलेटर और डिवाइस व्हिस्ट डिबगिंग में सक्रिय रूप से और कोड काटने के लिए), staging(परीक्षण उड़ान के लिए तैनाती के लिए) और releaseउत्पादन के लिए।

अपना कॉन्फ़िगरेशन बनाने के लिए चरण एक है:

यहां छवि विवरण दर्ज करें

"उत्पाद" -> "योजना" -> "योजना संपादित करें" का चयन करें और आवश्यकतानुसार नया / डुप्लिकेट बनाएं। प्रत्येक योजना के माध्यम से जाओ और "संबंधित कॉन्फ़िगरेशन बनाएँ" से संबंधित कॉन्फ़िगरेशन को प्रत्येक श्रेणी में छोड़ दें:

यहां छवि विवरण दर्ज करें

मैं उन योजनाओं के लिए एक कदम आगे और अनचेक करता हूं, जिन्हें स्कीम के लिए "रन" वितरित करना पड़ता है, अर्थात डिबग के लिए रिलीज और स्टैजिंग और "संग्रह" को अनचेक करना। आपको वही करना चाहिए जो आपके लिए मायने रखता है।

यहां छवि विवरण दर्ज करें

बिल्ड चरणों के तहत निम्नलिखित रन लाभांश जोड़ें ( 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}'."

यहां छवि विवरण दर्ज करें

आपके चुने हुए कॉन्फ़िगरेशन फ़ोल्डर (उपरोक्त उदाहरण में "फायरबेस") में प्रत्येक कॉन्फ़िगरेशन के लिए नेस्ट फ़ोल्डर हैं, जिसका नाम इसके संबंधित कॉन्फ़िगरेशन (केस संवेदी) के समान है, जिसके अंदर संबंधित GoogleServices-Info.plistफाइल जैसे हैं:

यहां छवि विवरण दर्ज करें

अंतिम लेकिन कम से कम, मैं यह भी सुनिश्चित करना पसंद करता हूं कि GoogleServices-Info.plistपरियोजना में एक जड़ स्तर को दुर्घटना से नहीं जोड़ा जाए इसलिए मैं निम्नलिखित को अपने .Itoreore में जोड़ता हूं।

# Ignore project level GoogleService-Info.plist
/[Project Name]/GoogleService-Info.plist
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.