2009-06-17 18 views
12

मैं कुछ पुन: प्रयोज्य कोड के लिए एक ढांचा बनाना चाहता हूं जिसे मैं अन्य आईफोन ऐप्स में शामिल करना चाहता हूं। यह करने के लिए सबसे अच्छा तरीका क्या है? आदर्श रूप में, मैं इसे बिल्टिन फ्रेमवर्क की तरह काम करना चाहता हूं और ऐप को बिल्ड फाइलों के साथ मिलकर बिना इसका इस्तेमाल कर रहा हूं।मैं एक आईफोन ढांचा कैसे बना सकता हूं और इसे अन्य आईफोन अनुप्रयोगों में उपयोग कर सकता हूं

उत्तर

0

मैं एक ही चीज़ के बारे में सोच रहा हूं। अब तक मैं बस इतना करने में सक्षम हूं कि एक परियोजना को जिस तरह से मैं चाहता हूं उसे एक नई परियोजना शुरू करने के लिए इसे किसी अन्य फ़ोल्डर में कॉपी करें। फिर मैं .xcodeproj फ़ाइल का नाम बदलता हूं और उसे खोलता हूं। फिर मैं नया ऐप बनाने से पहले मूल बातें (आइकन, डिफ़ॉल्ट.png, लक्ष्य, निष्पादन योग्य) को कस्टमाइज़ करता हूं।

यह घबराहट है, और जिस तरह से कोड पुन: उपयोग करने के लिए काम नहीं किया जाता है। मुझे यकीन है कि बेहतर समाधान हैं। शायद स्रोत कोड प्रबंधन/संस्करण नियंत्रण का कुछ चालाक उपयोग? शायद एक्सकोड में बनाया गया कुछ? अन्य विचार? मैं यहां और अधिक पोस्ट देखने के लिए तत्पर हूं।

9

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

+0

माइकल देखें नीचे इस सवाल का जवाब पाने के लिए। ढांचे को बनाना संभव है, केवल एक मैन्युअल दृष्टिकोण की आवश्यकता है। – DougW

0

@ निकोलई रुहे - जहां ऐप्पल ने आईफोन पर कस्टम फ्रेमवर्क का उपयोग करने से मना किया है? मैंने iOS Developer Program License Agreement और ऐप स्टोर समीक्षा दिशानिर्देश दोनों के माध्यम से पढ़ा है, और इस तरह के प्रतिबंध का कोई उल्लेख नहीं दिख रहा है।

मुझे नहीं पता कि ऐप्पल कस्टम स्थिर पुस्तकालयों के उपयोग की अनुमति क्यों देगा, और कस्टम ढांचे के उपयोग को रोक देगा। शायद मुझे कुछ अन्य कानूनी दस्तावेज याद आ रहे हैं?

+0

शायद यह तकनीकी कला का है, जैसे कि इंटरफ़ेस बिल्डर – hfossli

+0

पर आईफोन-प्लगइन बनाने में मुश्किल/असंभव है रनटाइम पर आईओएस एक्जिक्यूटिव में कोई कोड जोड़ा जा सकता है। डायलीब, फ्रेमवर्क और प्लगइन्स के साथ यही होता है; स्थिर संग्रह संकलन समय पर जुड़े हुए हैं। यह संभवतः ऐप्स को छेड़छाड़ करने और एसडीके शर्तों का उल्लंघन करने, या अनजाने में शोषित होने और उपयोगकर्ता के डेटा को खतरे में डालने से रोकने के लिए किया जाता है। (उदाहरण के लिए, आपकी पता पुस्तिका की तरह।) –

+0

"नोट: कस्टम फ्रेमवर्क का निर्माण आईओएस में समर्थित नहीं है।" http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1 –

5

मैंने एक्सकोड 4 के लिए टेम्पलेट्स बनाए हैं जो आपको सार्वभौमिक आईओएस फ्रेमवर्क (जो डिवाइस और सिम्युलेटर दोनों में काम करते हैं) बनाने की अनुमति देता है।

एक बार टेम्पलेट स्थापित होने के बाद, आप एक नई परियोजना बनाते समय बस "स्टेटिक आईओएस फ्रेमवर्क" का चयन करते हैं और यह बाकी करता है। यह यूनिट परीक्षणों के साथ भी काम करता है।

https://github.com/kstenerud/iOS-Universal-Framework

+0

बहुत अच्छा। इसे साझा करने के लिए धन्यवाद! –

0

इस लिंक को देखने, आप पूरी तरह से एक रूपरेखा बना सकते हैं और इसका इस्तेमाल कर सकते हैं। यदि आप अपना प्रोग्राम तैयार करते हैं तो सेब आपके ऐप को क्यों अस्वीकार कर देगा। see this link

ढांचा आपके कोड के संरचनात्मक संगठन के अलावा कुछ भी नहीं है। ऐसा करने के लिए कोई सीधा दृष्टिकोण नहीं है। लेकिन आप इसे एक बंडल और संगठित लक्ष्य का उपयोग करके प्राप्त कर सकते हैं। अपनी प्रोजेक्ट में एक नया बंडल जोड़ें और निम्न बेस एसडीके करें: नवीनतम आईओएस (आईओएस एक्स.एक्स) (एक्सएक्स में आपकी मशीन पर स्थापित सबसे आखिरी आईओएस एसडीके की संख्या दिखाई देगी)। आर्किटेक्चर: $ (ARCHS_STANDARD_32_BIT) armv6 ("armv6" से पहले स्पेस समेत यह मान बहुत महत्वपूर्ण है) यह सेटिंग Xcode 4.2 के लिए मान्य है, यदि आप पुराने संस्करण का उपयोग कर रहे हैं, तो "मानक (armv6 armv7)" का उपयोग करें विकल्प। (इस संपत्ति के मूल्य आइटम के मूल्य पर निर्भर करते हैं, इसलिए पहले सेट करें)। केवल सक्रिय आर्किटेक्चर बनाएं: नहीं (अन्यथा हम एक ही समय में armv6 और armv7 को संकलित नहीं कर सकते हैं)। मान्य वास्तुकला: $ (ARCHS_STANDARD_32_BIT) (यह वास्तव में यह मान होना बहुत महत्वपूर्ण है)। यदि आपका एक्सकोड armv6 और armv7 के साथ दो पंक्तियां दिखा रहा है, तो हटाएं और इस मान को एक पंक्ति में डालें। मृत कोड स्ट्रिपिंग: नहीं। मानक पुस्तकालयों के साथ लिंक: नहीं। मैक-ओ टाइप: रिलायटेबल ऑब्जेक्ट फ़ाइल। यह सबसे महत्वपूर्ण परिवर्तन है। यहां, हम संकलक को बंडल को एक स्थानांतरित फ़ाइल के रूप में इलाज करने का निर्देश देते हैं, ऐसा करके, हम इसे रैपर सेटिंग के साथ एक ढांचे में बदल सकते हैं। अन्य लिंकर ध्वज: यह सेटिंग अनिवार्य नहीं है, लेकिन यदि आप किसी भी प्रकार का C++ कोड (.cpp या।मिमी) इस ढांचे पर, क्रिस मूर (टिप्पणियों पर) "-lstdC++" विकल्प का उपयोग करने की सलाह देते हैं। पुरानी कंपाइलर्स में संघर्ष से बचने के लिए, इस मामले में "-ओबीजेसी" का भी उपयोग करना एक अच्छा विचार हो सकता है। रैपर एक्सटेंशन: ढांचा। यहां हम बंडल को फ्रेमवर्क में बदलते हैं। एक्सकोड करने के लिए, फ्रेमवर्क केवल एक्सटेंशन के साथ एक फ़ोल्डर है। फ्रेमवर्क, जिसमें एक या अधिक संकलित बाइनरी स्रोत, संसाधन और कुछ फ़ोल्डर्स हैं, एक फ़ोल्डर, जिसे आमतौर पर हेडर कहा जाता है, में सभी सार्वजनिक शीर्षलेख होते हैं। डीबग सिंबल जेनरेट करें: नहीं (यह एक बहुत ही महत्वपूर्ण सेटिंग है, अन्यथा ढांचा अन्य कंप्यूटर/प्रोफाइल पर काम नहीं करेगा)। प्रीकंपाइल उपसर्ग शीर्षलेख: नहीं।

एक aggrigated लक्ष्य बना सकते हैं और कॉपी

# Sets the target folders and the final framework product. 
FMK_NAME=FI 
FMK_VERSION=A 

# Install dir will be the final output to the framework. 
# The following line create it in the root folder of the current project. 
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework 

# Working dir will be deleted after the framework creation. 
WRK_DIR=build 
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework 
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework 

# Building both architectures. 
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos 
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator 

# Cleaning the oldest. 
if [ -d "${INSTALL_DIR}" ] 
then 
rm -rf "${INSTALL_DIR}" 
fi 

# Creates and renews the final product folder. 
mkdir -p "${INSTALL_DIR}" 
mkdir -p "${INSTALL_DIR}/Versions" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources" 
mkdir -p "${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers" 

# Creates the internal links. 
# It MUST uses relative path, otherwise will not work when the folder is copied/moved. 
ln -s "${FMK_VERSION}" "${INSTALL_DIR}/Versions/Current" 
ln -s "Versions/Current/Headers" "${INSTALL_DIR}/Headers" 
ln -s "Versions/Current/Resources" "${INSTALL_DIR}/Resources" 
ln -s "Versions/Current/${FMK_NAME}" "${INSTALL_DIR}/${FMK_NAME}" 

# Copies the headers and resources files to the final product folder. 
cp -R "${DEVICE_DIR}/Headers/" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Headers/" 
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/" 

# Removes the binary and header from the resources folder. 
rm -r "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/Headers" "${INSTALL_DIR}/Versions/${FMK_VERSION}/Resources/${FMK_NAME}" 

# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product. 
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/Versions/${FMK_VERSION}/${FMK_NAME}" 

rm -r "${WRK_DIR}" 

इस रन स्क्रिप्ट में और aggrigate लक्ष्य को चलाने के ढांचे

+0

कृपया अपनी वेबसाइट के लिए केवल स्पैमिंग लिंक बंद करें। –

+0

@AndrewBarber क्या आपको लगता है कि यह मेरी वेबसाइट है? अगर मैं सिर्फ सवाल का जवाब देता हूं? अगर मैं अपनी वेबसाइट थी तो मैं बहुत खुश हूं :) –

+0

कृपया ध्यान दें कि आपको इस साइट पर, यहां दिए गए उत्तर के उपयोगी बिंदु पोस्ट करना चाहिए, या आपके पोस्ट जोखिमों को हटाया जाना चाहिए ["कोई जवाब नहीं"] (http: //meta.stackexchange.com/q/8259)। यदि आप चाहें तो आप अभी भी लिंक शामिल कर सकते हैं, लेकिन केवल 'संदर्भ' के रूप में। लिंक को लिंक के बिना जवाब स्वयं ही खड़ा होना चाहिए। –

संबंधित मुद्दे

 संबंधित मुद्दे