2010-12-21 3 views
12

मैं की जरूरत है कि किसी मौजूदा ऐप विभिन्न ग्राहकोंअनुकूलित iphone अनुप्रयोग

प्रत्येक ग्राहक को अपने स्वयं के चिह्न और स्प्लैश स्क्रीन की आवश्यकता के लिए संकलित की है।
मैं सशर्त रूप से विभिन्न सुविधाओं को शामिल करने में सक्षम होना चाहूंगा कि क्या विशिष्ट ग्राहक को उनकी आवश्यकता है या नहीं।

मैंने प्रत्येक ग्राहक के लिए अलग-अलग लक्ष्य निर्धारित करने का प्रयास किया है, लेकिन अब तक बहुत भाग्य नहीं है।
एक ही नाम के साथ विभिन्न संसाधन, लेकिन एक अलग पथ मिश्रित हो रहा है।

आदर्श रूप से मैं एक और क्लाइंट को डुप्लिकेट करके एक ऐप बनाने में सक्षम होना चाहता हूं जो कि समान है और फिर नए क्लाइंट के लिए ऐप बनाने के लिए केवल न्यूनतम संख्या में बदलाव करें।

इस ऐप को सेट करने का सबसे अच्छा तरीका क्या है?

+0

इस के लिए एक इनाम डाल के लिए धन्यवाद। यहां भी यही समस्या। एफडब्ल्यूआईडब्लू, एक ही विषय पर मेरा प्रश्न देखें: http://stackoverflow.com/questions/4112483/how-does-xcode-handle-import-header-statements-in-with- बहुविध-लक्ष्य – makdad

उत्तर

9

प्रत्येक क्लाइंट के लिए अलग-अलग लक्ष्य जाने का तरीका होना चाहिए। विशेषताओं के लिए, मैं पहले लक्ष्य सेटिंग्स में क्लाइंट को पहचानने वाले मैक्रो को स्थापित करने का सुझाव दूंगा (बिल्ड टैब पर "प्रीप्रोसेसर मैक्रोज़" के तहत), फिर फ़ीचरडिफाइन रखें।ज फ़ाइल है कि इस तरह दिखता है:

#ifdef macroClientA // assume client A wants features 1 and 3 
# define macroFeature1 
# define macroFeature3 
#endif 

// and similarly for the other clients 

अब आप

#import featureDefines 
#ifdef macroFeature1 

किसी भी जगह आप अगर सुविधा 1 या वांछित नहीं है परीक्षण की आवश्यकता का उपयोग कर सकते हैं।

अलग-अलग आइकन के लिए, आपकी लक्ष्य सेटिंग्स प्रत्येक क्लाइंट के लिए एक अलग info.plist फ़ाइल निर्दिष्ट कर सकती हैं, और वे फ़ाइलें आइकन के लिए एक अलग फ़ाइल नाम निर्दिष्ट कर सकती हैं।

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

संसाधनों के लिए, मैं इस तरह अपने संसाधन फ़ाइलों का नामकरण सुझाव है: यदि कोई ग्राहक विशिष्ट एक
ResourceName-clientName.ext

resourceName.ext // सामान्य संसाधन प्रयोग की जाने वाली // ग्राहक विशिष्ट संसाधन

अगला एक सामान्य संसाधन की खोज करने वाली विधि है कि कुछ इस तरह दिखता की स्थापना की: कि विधि आप की अनुमति देगा के माध्यम से

-(NSString *) resourcePathForResourceName: (NSString *) resourceName extension: (NSString *) ext { 
    NSString *clientName; 
    #ifdef macroClientA 
    clientName = @"clientA"; 
    #endif // and similarly for the other clients 
    NSString *clientSpecificName = [NSString stringWithFormat: @"%@-%@.%@", resourceName, clientName, ext]; 
    NSString *genericName = [NSString stringWithFormat: @"%@.%@"]; 
    if ([[NSFileManager defaultManager] fileExistsAtPath: clientSpecificName]) 
    return clientSpecificName; 
    else if ([[NSFileManager defaultManager] fileExistsAtPath: genericName]) 
    return genericName; 
    else 
    // handle the error 
} 

अपने सभी संसाधन फ़ाइल रनिंग पकड़ लेता है कोड की एक पंक्ति को बदले बिना अपने प्रोजेक्ट में क्लाइंट-विशिष्ट संसाधन जोड़ने के लिए।

+0

धन्यवाद, मैं इस जवाब को स्वीकार कर रहा हूं क्योंकि यह समस्या को हल करने के लिए सोचने/उम्मीद करने के तरीके से कम या कम है। –

3

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

अपने परिदृश्य के साथ, उस बिंदु पर आप प्रत्येक लक्ष्य के लिए क्लाइंट विशिष्ट संसाधनों के साथ एक नया फ़ोल्डर जोड़ सकते हैं और इसमें किसी भी कोड परिवर्तन की आवश्यकता नहीं होगी। यदि पथ एक समस्या है, तो आप [UIImage imageNamed:] विधि का उपयोग करने पर विचार कर सकते हैं, जिसमें पूर्ण पथ की आवश्यकता नहीं है, केवल फ़ाइल नाम।

0

बाहरी कॉन्फ़िगरेशन फ़ाइल को सेटअप के बड़े हिस्से को करने की अनुमति देने के लिए अपना कोड लिखें, फिर अपने लक्ष्यों के साथ सही संपत्तियां शामिल करें। प्रत्येक ग्राहक के लिए एक नए लक्ष्य के साथ एक परियोजना होने के बाद, आप चुन सकते हैं कि प्रत्येक लक्ष्य के साथ कौन सी संपत्तियां शामिल की जाती हैं। यदि आपको एकाधिक लक्ष्यों में समस्या हो रही है तो आप कोर प्रोजेक्ट को प्रबंधित करने के लिए गिट का उपयोग कर सकते हैं, फिर प्रत्येक क्लाइंट के लिए इसे शाखा बनाएं।

6

मैं एक ऐसी ही परिदृश्य है और कैसे मैं संभाल यह इस प्रकार है:

1) ऐप्स के मुख्य कोड एक "APPLICATION_NAME आधार" फ़ोल्डर

2) विभिन्न ग्राहकों में हैं में रखा जाता है उनके "application_name-client_name" फ़ोल्डर

3) प्रोजेक्ट फ़ाइल क्लाइंट फ़ोल्डर में है और प्रतिलिपि के बिना मूल फ़ोल्डर से संदर्भ शामिल है।

4) क्लाइंट की परियोजना के लिए अद्वितीय होने वाली फ़ाइलों को क्लाइंट फ़ोल्डर में हैं। आमतौर पर एक ही नाम का उपयोग कर छवियों। या .h .m फ़ाइलें जिन्हें व्यक्तिगत प्रोजेक्ट के लिए अद्वितीय होना आवश्यक है। परियोजना के आधार पर किसी परियोजना पर फ़ाइलों को शामिल करने की अनुमति भी नहीं देता है।

कोड केंद्रीय रखता है लेकिन भ्रम पैदा करने के बिना प्रति ग्राहक अलग कोड की अनुमति देता है।

+0

यह, विभिन्न लक्ष्यों के साथ निर्दिष्ट करने के लिए कौन सा स्रोत फ़ोल्डर निर्दिष्ट करें। नाम-मैंगलिंग से ज्यादा क्लीनर। – Nuthatch

0

मैं क्लाइंट के लिए एक सेटिंग इंटरफ़ेस तैयार करूंगा और ऐप को अपनी कंपनी/व्यक्तिगत ज़रूरतों को अनुकूलित कर दूंगा। उदाहरण के लिए, अपनी फोटो लाइब्रेरी, आदि से छवि प्रदान करना

0

आप प्रत्येक ग्राहक के लिए प्रोजेक्ट बना सकते हैं, और उसी स्रोत से सभी स्रोतों को परियोजना निर्देशिका में कॉपी किए बिना शामिल कर सकते हैं। तो आप एक ही कोडबेस का उपयोग करते समय, एक प्रोजेक्ट में आइकन/स्प्लैश स्क्रीन को प्रतिस्थापित करने में सक्षम होंगे। यह अब तक का सबसे आसान तरीका दिखता है।

1

मैं ऐसे कर्तव्यों के लिए एक्सकोड का उपयोग करने के बजाय कुछ ऑटोमेटर/स्क्रिप्ट लिखना चाहता हूं!

http://developer.apple.com/tools/xcode/automatorforxcode.html

+0

धन्यवाद, मैं automator स्क्रिप्ट में देखता हूँ –