Ich habe ein paar Core Data iPhone-Apps geschrieben und bin auf ein konsistentes Problem gestoßen, das ich für die iPhone-Entwicklung erwarten würde. Ich habe nämlich einen oder mehrere Befehlszeilen-Datenlader, um die Core Data-Datenbank zu erstellen, und dann habe ich meine iPhone App. Da die Modelldateien geteilt werden und die Lader ein integraler Bestandteil des Projekts sind, möchte ich, dass es sich um ein einzelnes Projekt handelt.
Was ist der richtige Ansatz, um ein Projekt mit einem iPhone OS-Ziel und einem Befehlszeilenziel zu erstellen? Alle meine Versuche haben nicht gut funktioniert - ich habe Codesignaturen, Debugging und Konfigurationsprobleme.
Hier ist mein bisher bester Versuch:
An diesem Punkt habe ich keine ausführbare Datei. (Wenn Sie dagegen ein neues Command Line Utility-Projekt erstellen, wird Ihrem Ziel automatisch eine ausführbare Datei zugeordnet.)
Wenn ich ein benutzerdefiniertes ausführbares Programm erstelle, habe ich einige Probleme: (1) das Ändern des Ziels ändert die ausführbare Datei nicht, weil Sie eine benutzerdefinierte ausführbare Datei nicht mit einem Ziel verknüpfen können, (2) das Debuggen des Befehlszeilenprogramms ist problematisch, da die in XCode gesetzten Haltepunkte nicht registriert werden (die Pfeile an den Zeilennummern werden beim Debuggen der ausführbaren Datei orange), also muss ich in den laufenden Code einbrechen und das Debugging manuell von der Konsole aus durchführen, (3) am frustrierendsten, Wenn ich eine ordnungsgemäß bereitgestellte Verteilungsversion meiner iPhone-App erstelle, schlägt die Übertragung der iPhone-App auf das Gerät fehl, da das Provisioning-Profil nicht mit der Code Signing-Berechtigung übereinstimmt. Dies ist definitiv nicht der Fall, da ich das Provisioning-Profil und die Berechtigungsdatei für nur die Verteilungsversion des iPhone-Ziels festlege, aber egal, wie viel Mühe ich habe, kann das Ziel nicht auf Geräten installiert werden. (Wenn ich ein neues Projekt mit identischem Code und Code-Signierung ohne das Befehlszeilentool erstelle, kann ich eine AdHoc-Bereitstellungs-App installieren.)
Also ... gibt es ein anderes Muster, dem ich folgen sollte? Xcode-Konfigurationen sind ernsthafter Voodoo.
OK, ich denke, Ihr Problem muss neu definiert werden.
Wie Sie erwähnt haben:
Ich habe nämlich einen oder mehrere Befehlszeilen-Data Loader, um die Core Data-Datenbank zu erstellen
Ihre Anforderung besteht darin, die Datenbank für Ihre iPhone-Kerndaten-App vorab zu befüllen . Außerdem sollten Sie das Tool in die Lage versetzen, Konsistenz mit Ihren neuesten Core Data-Modellen zu halten . Habe ich recht?
Wenn mein Verständnis stimmt. Ich nehme an, anstatt ein dediziertes Kommandozeilen-Tool zu erstellen, um die Datenbank vorab zu füllen, wäre es besser, dies im Unit-Test-Ziel zu tun.
Hier ist, was ich mit meiner Kerndaten iOS App mache.
2 und 3 können in einen Testfall integriert werden, wenn Sie nicht viele Daten importieren müssen.
⌘ + k
verwenden, um alles zuvor Erstellte zu entfernen. ⌘ + u
verwenden, um den Testfall erneut auszuführen und die Datenbank mit Daten neu zu füllen. [NSBundle bundleForClass:{Your testcase class name}]
zu verwenden, um den korrekten Paketpfad zu erhalten. Sie können also das Kerndatenmodell laden und das MOC-Instanz. Sie können sehen, wie ich dies in meinem Open-Source-Projekt auf github tue / p>
Hier ist ein kurzer Code aus meinem Testfall.
%Vor%Aus meiner eigenen Erfahrung, wenn Ihr Projekt als iOS-Projekt beginnt, sind Sie in einer Welt der Schmerzen, wie es klingt, als ob Sie entdeckt haben. Sicher, Sie können Ihrem iPhone-Projekt OS X-Ziele hinzufügen, aber die erstellte ausführbare Datei wird nicht automatisch in Xcode hinzugefügt. Sie können dann eine benutzerdefinierte ausführbare Datei hinzufügen, die Konfiguration wird jedoch in den benutzerspezifischen Projektdateien gespeichert. Dies kann ein Dealbreaker sein, wenn Sie die Quellcodeverwaltung verwenden und mit anderen Personen zusammenarbeiten. Wie Sie festgestellt haben, lässt es sich mit dem Debugger usw. nicht so gut integrieren.
Wenn Sie ein überschaubareres Projekt wünschen, empfehle ich, mit einem OS X-Projekt anzufangen und dann Ihre iOS-Ziele hinzuzufügen. Das hat viel besser für mich gearbeitet.
Dies könnte in Xcode 4 verbessert werden, aber in 3.2 waren diese Probleme ein echter Nachteil. Zumindest weißt du, dass du nicht alleine bist.
Ich hatte das gleiche Problem. Und genau aus dem gleichen Grund: Mein Hauptprojekt ist eine Coredata basierte iPhone App, und ich brauche ein Dienstprogramm, um Daten in eine Coredata Datenbank zu laden.
Nachdem ich ein bisschen herumgesucht habe, fand ich diese Webseite mit einer Antwort:
Grundsätzlich läuft es darauf hinaus: Halten Sie die Optionstaste gedrückt, wenn Sie das Popup "Übersicht" auswählen (in dem Sie Aktive Konfiguration, Aktives Ziel, Aktive Funktion, Aktive Architektur auswählen). Ich wählte "Use Base SDK" und es schien zu mögen. Leider müssen Sie es jedes Mal tun, wenn Sie von Ziel zu Ziel wechseln.
Es funktionierte für mich, als ich versuchte, das OSX-Ziel zu kompilieren. Jetzt muss ich nur alle Fehler in der App beheben ...
Hinweis auf eine interessante Sache.
Wenn Sie ein Mac OS X-App-Projekt erstellen und ein neues iOS-App-Ziel hinzufügen, können Sie beide Apps wechseln. Sie können sogar beide Mac OS X / iOS-Ziele kompilieren.
ABER !!!
Es ist nur für die iOS-Geräteplattform. Wenn du den Simulator einmal auswählst, kompiliere das Projekt in der iOS App, kompiliere nie wieder für Mac OS X. (Sie können immer noch das Mac OS X App-Ziel auswählen, es wird jedoch nicht mehr kompiliert)
Also ist es unbrauchbar.
Noch etwas ...
Schließen Sie Ihren Xcode.
Wenn Sie den Ordner .xcodeproj
sehen, können Sie mehrere Dateien sehen. Und Sie können eine .pbxuser
-Datei finden. Öffne es mit dem Texteditor und finde eine Zeile activeSDKPreference=...
Wenn dies der Fall ist, löschen Sie die Zeile und speichern Sie die Datei.
Öffnen Sie das Projekt erneut mit Xcode. Hoppla! es ist zurückgesetzt! Sie können das Mac OS X-Ziel erneut kompilieren!