2009-06-17 3 views

Antwort

0

Ich habe über die gleiche Sache nachgedacht. Bis jetzt konnte ich nur ein Projekt so machen, wie ich es möchte und es in einen anderen Ordner kopieren, um ein neues Projekt zu starten. Dann benenne ich die .xcodeproj-Datei um und öffne sie. Dann passe ich die Grundlagen (Icons, default.png, das Ziel, die ausführbare Datei) an, bevor ich die neue App erstelle.

Es ist klobig, und nicht die Art und Weise Code-Wiederverwendung soll funktionieren. Ich bin mir sicher, dass es bessere Lösungen gibt. Vielleicht eine clevere Verwendung von Quellcodeverwaltung/Versionskontrolle? Vielleicht etwas in XCode eingebaut? Andere Ideen? Ich freue mich darauf, hier mehr Beiträge zu sehen.

9

Apple verhindert die Verwendung von benutzerdefinierten Frameworks auf dem iPhone. Aber Sie können gute alte statische Bibliotheken verwenden. Im 3.0 GM SDK gibt es dafür sogar eine Projektvorlage, aber Sie können auch einfach ein statisches Bibliotheksziel selbst erstellen.

+0

Siehe Michaels unten zu bekommen. Erstellen von Frameworks ist möglich, erfordert nur ein bisschen von einem manuellen Ansatz. – DougW

0

@Nikolai Ruhe - wo genau verbietet Apple die Verwendung von benutzerdefinierten Frameworks auf dem iPhone? Ich habe sowohl die iOS Developer Program License Agreement als auch die App Store Review Guidelines durchgelesen und finde keine Erwähnung eines solchen Verbots.

Ich sehe nicht, warum Apple die Verwendung von benutzerdefinierten statischen Bibliotheken zulassen und die Verwendung von benutzerdefinierten Frameworks verbieten würde. Vielleicht fehlt mir ein anderes juristisches Dokument?

+0

vielleicht ist es der technischen Kunst, wie es schwierig/unmöglich ist, iphone-plugins zum Schnittstellenerbauer zu schaffen – hfossli

+0

Kein Code kann zur Laufzeit in iOS ausführbare Dateien verbunden werden. Das passiert mit Dylibs, Frameworks und Plugins. Statische Archive werden zur Kompilierzeit eingebunden. Dies geschieht vermutlich, um zu verhindern, dass Apps hinterhältig werden und die SDK-Bedingungen verletzen oder unbeabsichtigt ausgenutzt werden und die Daten des Benutzers gefährdet werden. (Wie zum Beispiel Ihr Adressbuch.) –

+0

"Hinweis: Die Erstellung von benutzerdefinierten Frameworks wird in iOS nicht unterstützt." http://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW1 –

5

Ich habe Vorlagen für Xcode 4 erstellt, mit denen Sie universelle iOS-Frameworks erstellen können (die sowohl im Gerät als auch im Simulator funktionieren).

Sobald die Vorlagen installiert sind, wählen Sie einfach "Static iOS Framework", wenn Sie ein neues Projekt erstellen und es erledigt den Rest. Es funktioniert auch mit Komponententests.

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

+0

Sehr schön. Danke für das Teilen! –

0

siehe diesen Link können Sie unbedingt einen Rahmen schaffen und nutzen. Warum lehnt Apple Ihre App ab, wenn Sie Ihr Programm strukturieren? see this link

Das Framework ist nichts als strukturelle Organisation Ihres Codes. Es gibt keinen direkten Ansatz dafür. aber Sie können es erreichen, indem Sie ein Bündel und ein aggregiertes Ziel verwenden. Fügen Sie Ihrem Projekt ein neues Bundle hinzu und führen Sie das folgende Basis-SDK aus: Letztes iOS (iOS X.X) (im X.X wird die Nummer des neuesten iOS SDK angezeigt, das auf Ihrem Computer installiert ist). Architekturen: $ (ARCHS_STANDARD_32_BIT) armv6 (es ist sehr wichtig, dass genau dieser Wert einschließlich der Leerstelle vor "armv6" ist) Diese Einstellung gilt für Xcode 4.2, wenn Sie eine alte Version verwenden, verwenden Sie den "Standard (armv6 armv7)" Möglichkeit. (Die Werte für diese Eigenschaft hängen vom Wert des folgenden Elements ab. Setzen Sie das also zuerst). Build Active Architecture Only: NEIN (andernfalls können wir nicht gleichzeitig zu armv6 und armv7 kompilieren). Gültige Architektur: $ (ARCHS_STANDARD_32_BIT) (es ist sehr wichtig genau dieser Wert zu sein). Wenn Ihr Xcode zwei Zeilen mit armv6 und armv7 anzeigt, löschen Sie diese und fügen Sie diesen Wert in eine einzelne Zeile ein. Dead Code Stripping: NEIN. Link mit Standardbibliotheken: NEIN. Mach-O Typ: Verschiebbare Objektdatei. Dies ist die wichtigste Änderung. Hier weisen wir den Compiler an, das Paket als eine verschiebbare Datei zu behandeln, indem wir es in ein Framework mit der Wrapper-Einstellung verwandeln. Andere Linker-Flags: Diese Einstellung ist nicht obligatorisch, aber wenn Sie beabsichtigen, einen beliebigen C++ - Code (.cpp oder.mm) zu diesem Framework empfiehlt Chris Moore (zu den Kommentaren), die Option "-lstdC++" zu verwenden. In diesem Fall könnte es auch sinnvoll sein, "-ObjC" zu verwenden, um Konflikte in alten Compilern zu vermeiden. Wrapper Erweiterung: Rahmen. Hier ändern wir das Bundle in ein Framework. Für Xcode ist Frameworks nur ein Ordner mit der Erweiterung .framework, der in einer oder mehreren kompilierten Binärquellen, Ressourcen und einigen Ordnern enthalten ist. Ein Ordner, normalerweise Header genannt, enthält alle öffentlichen Header. Debug-Symbole generieren: NEIN (dies ist eine sehr wichtige Einstellung, andernfalls funktioniert das Framework nicht auf anderen Computern/Profilen). Precompile-Präfix-Kopfzeile: NO.

erstellen aggrigated Ziel und kopieren

# 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}" 

diese in das Skript ausführen und führen Sie das aggrigate Ziel den Rahmen Antwort

+0

Bitte hören Sie auf, nur die Links zu Ihrer Website zu spammen. –

+0

@AndrewBarber Glaubst du, dass es meine Website ist? wenn ich nur die Frage beantworte? Ich wäre viel glücklicher, wenn das meine Website wäre :) –

+0

Bitte beachten Sie, dass Sie die nützlichen Punkte einer Antwort hier auf dieser Seite veröffentlichen sollten, oder Ihr Beitrag riskiert, als ["Keine Antwort"] gelöscht zu werden (http: //meta.stackexchange.com/q/8259). Sie können den Link immer noch einfügen, wenn Sie möchten, aber nur als "Referenz". Die Antwort sollte eigenständig stehen, ohne die Verbindung zu benötigen. –

Verwandte Themen