Wie erstelle ich ein xcode-Projekt mit mehreren Zielen für verschiedene Plattformen (iPhone & Mac OS X)?

8

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:

  • Erstellen Sie ein iPhone-Projekt
  • Fügen Sie ein neues Cocoa Shell-Tool-Ziel hinzu
  • Ändern Sie das Basis-SDK in der Build-Konfiguration des Ziels in "Aktuelles Mac OS"

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.

    
dk. 29.01.2010, 17:05
quelle

4 Antworten

2

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.

Meine Lösung

Hier ist, was ich mit meiner Kerndaten iOS App mache.

  1. Erstellen Sie das Projekt mit Unterstützung für Kerndaten zusammen mit Unterstützung für logische Tests.
  2. Schreiben Sie einen einfachen Testfall, um auf MOC und Model zuzugreifen, um die Datenbankdatei zu füllen.
  3. Schreiben Sie währenddessen einen anderen Testfall, um die Datendatei einzulesen, und führen Sie den Import-Job durch.

2 und 3 können in einen Testfall integriert werden, wenn Sie nicht viele Daten importieren müssen.

Ein paar Vorteile

  1. Sie können ⌘ + k verwenden, um alles zuvor Erstellte zu entfernen.
  2. Sie können ⌘ + u verwenden, um den Testfall erneut auszuführen und die Datenbank mit Daten neu zu füllen.
  3. Greifen Sie immer auf die neueste Version Ihres Kerndatenmodells zu.
  4. Am wichtigsten werden alle von der Standard-Projektvorlage von Xcode bereitgestellt. Sie müssen keine zusätzlichen Arbeiten ausführen, um sicherzustellen, dass beide Ziele gut funktionieren.

Sei vorsichtig mit einigen Dingen.

  1. Wenn Sie Xcode 4.1 verwenden, empfehle ich Ihnen, auf Xcode 4.2+ oder sogar Xcode 4.3 zu aktualisieren, da Sie mit Xcode 4.1 Probleme haben, direkt auf die MOC- und Modelldatei zuzugreifen. (Zumindest basierend auf meiner Erfahrung) Und Xcode 4.2 unterstützt die Unit-Test-App, um direkt auf die Datenbankdatei in Ihrem Dokumentordner zuzugreifen. Später müssen Sie nur noch die SQLite-Datei finden und die Datei in Ihrem Projekt überschreiben.
  2. Wenn Sie nicht zu Xcode 4.2+ migrieren können, denken Sie daran, die Kerndatenmodellierungsdateien zu Ihrem logischen Testziel hinzuzufügen und [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.

Realprobe

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%     
Tonny Xu 03.02.2012 13:38
quelle
1

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.

    
Andrew Kitchen 10.03.2011 04:37
quelle
1

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 ...

    
daver 03.08.2011 07:02
quelle
0

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!

    
Eonil 06.09.2010 14:06
quelle

Tags und Links