2010-03-06 13 views
18

Ich habe gerade ein relativ großes Projekt für das Android abgeschlossen, und es hat einen bitteren Geschmack in meinem Mund mit dem Wissen, dass es nie auf einem der allgegenwärtigsten Handys dieser Seite des Solar laufen wird System (das von diesem fruchtigen kleinen Club).Objective-C und Android

Also, für mein nächstes Projekt möchte ich es so schreiben, dass die meisten Komponenten leicht zwischen den iPhone- und Android-Plattformen transportiert werden können. Die Art, wie ich das mache, besteht darin, das meiste davon in Objective-C zu programmieren und dann die plattformspezifischen Teile in Objective-C bzw. Java hinzuzufügen. Auf der Android-Seite erfordert dies die Verwendung des NDK.

Mein Wissen über C ist gut, aber mein Wissen über Objective-C ist nahe bei Null, und ich habe keine Lust, C++ zu lernen. Wie vernünftig ist der obige Ansatz, und gibt es einen besseren? Gibt es eine Möglichkeit, wie ich in Java programmieren kann und immer noch den nicht gehackten iPhone Markt erreiche? Und wie wahrscheinlich ist es, dass die Leute, die ich kenne (iPhone-Nutzer), nächstes Jahr ein Android-Handy haben werden?

+6

@Tom R: einige professionelle Spiele-Unternehmen, die Anwendung für Handys entwickeln, verwenden automatisierte Portierungstool, das Java zu Obj-C (und zu Qualcomm BREW auch) übersetzt. Das Spiel * Uniwar *, das zum Beispiel die Top Ten des iPhone AppStore erreichte und das zweite (oder erste?) Beste Strategiespiel 2009 auf dem iPhone erhielt, wurde komplett in Java geschrieben und automatisch in Obj-C übersetzt. In den Tagen war der Preis der Technologie etwa $ 2500/Quartal pro Entwickler, und es hat gut funktioniert :) – SyntaxT3rr0r

+0

http://StackOverflow.com/Questions/2380258/Crosssplatform-Iphone-android-Code-Sharing –

+0

Es gibt eine neue StellaSDK veröffentlicht, die dies tun: http://Stackoverflow.com/a/16677772/308315 – iwasrobbed

Antwort

9

Meine Vermutung, die keine Erfahrung hat, ist, dass Sie wahrscheinlich könnte Obj-C mit Google NDK irgendwie schreiben, da GCC für ARM existiert, ist Open Source, hat einen Obj-C-Compiler und eine grundlegende Obj-C-Laufzeit (die, wenn es nicht schon könnte gehackt werden, um an einer neuen Architektur zu arbeiten), etc.

Das könnte auch eine Menge Arbeit für fragwürdigen Nutzen sein.

Und natürlich „Obj-C“ (ohne die NS Klassen) bedeutet etwas ganz anderes als „Kakao“, das, was die meisten Menschen ist wirklich meinen, wenn sie „Obj-C“ sagen. Vielleicht könntest du etwas von GNUstep für einige verwenden, aber ... Ehrlich gesagt bezweifle ich es. Klingt wieder wie viel Arbeit.

Also, ja, ich denke, es ist möglich. Es ist auch eine Menge Arbeit und ich denke nicht, dass es das wert ist.

In Anbetracht dessen, was Sie gesagt haben, wenn ich dies versuchen würde, wäre ich versucht, so viel von Ihrer Kernlogik wie möglich in C zu schreiben und sie dann mit zwei separaten GUIs für jede Plattform zu umhüllen.

+4

Dies wird mein neues Mantra ... Modell (und alle Dienste/Bibliotheken/geteilten Code) in C, Ansicht/Controller in der am besten geeigneten Plattform Sprache/Bibliothek. – rcw3

11

Objective-C ohne Cocoa ist nicht so nützlich und bringt Sie nicht viel näher zu einer funktionierenden iPhone-Codebasis. Sie würden wahrscheinlich besser dran sein, Ihren Core in C mit Core Foundation zu schreiben und entweder Java oder Objective-C für die plattformspezifischen Teile zu verwenden. Apple hat einen großen Teil von Core Foundation als CF-Lite bezogen, und es ist gebührenfrei mit Cocoa auf OS X gebrückt (d. H. Sie können viele CF-Klassen austauschbar mit ihren Cocoa-Gegenstücken verwenden).

+0

Danke für Ihre Antwort. Der Grund, warum ich Obj-C als die Sprache, in der ich den Kern kodieren möchte (im Gegensatz zu C/C++), ausdrücklich erwähne, ist, dass es mir als eine sehr gute C-basierte OOP-Sprache empfohlen wurde. Wie unbrauchbar ist Obj-C ohne Kakao? –

+3

Objective-C sieht für mich eine vollkommen vernünftige Sprache ohne Cocoa aus.Kaum jemand verwendet es ohne Cocoa, weil es auf allen Nicht-Mac-Plattformen populärere Sprachen gibt, aber ich sehe keinen Grund, es nicht zu benutzen. Es ist Teil von gcc, also sollte es auf so ziemlich jeder Unix- oder Linux-Plattform verfügbar sein. –

+0

Er sagte nicht, dass Objective-C * ohne Cocoa * unvernünftig sei, nur nicht annähernd so nützlich. Stellen Sie sich vor Java ohne java. * Und javax. * Class, C ohne die Standardbibliothek, C# ohne .NET usw. Eine Sprache mag großartig sein, aber die entsprechende Codebibliothek ist für die meisten Leute ein echter Mehrwert. Cocoa schneidet die Arbeit dramatisch ab, die der Entwickler bis zu dem Punkt machen muss, dass Objective-C ohne ihn auf eine wirklich interessante Sprache reduziert wird. Für sich allein, "interessant" zahlt nicht die Rechnungen. Genauer gesagt wird eine iPhone App ohne Cocoa rudimentär und schwer zu schreiben und zu warten sein. –

1

Ich bin nicht sicher über Android, aber mit dem iPhone können Sie im Wesentlichen gerade C schreiben, solange Sie es in Objective-C-Klassen einpacken.

22

Schritt zurück und darüber nachdenken, was Sie am Ende logisch teilen können.

Die UI-Modelle sind ziemlich unterschiedlich, die Komponenten sind unterschiedlich. Am Ende können Sie möglicherweise Datenobjektklassen, möglicherweise einige Algorithmen, teilen. Es ist nicht einmal so, als könnten Sie am Ende den Netzwerkcode wirklich teilen wie in den alten Tagen, da Sie nicht direkt Sockets verwenden, sondern HTTP-Bibliotheken verwenden.

Also wird all die Mühe, die Sie in diese wirklich tun, wirklich eine Belohnung am Ende finden? Es scheint mir, das Endergebnis wird eine brüchige Sauerei sein, die schwer zu aktualisieren ist, und auf beiden Plattformen mittelmäßig ist, anstatt auf beiden großartig zu sein.

Warum schreiben Sie Anwendungen? Um Ihnen oder Ihren Benutzern das Leben zu erleichtern?

+0

Ist es zu viel verlangt nach beiden? :) –

+7

Es ist nicht zu viel verlangt ... aber das Universum ist nicht anfällig für solche Anfragen sehr oft zu beantworten! –

+12

Es mag Sie überraschen, aber selbst heute, trotz einiger Bemühungen der Menschen, passt nicht die ganze Welt in eine HTTP-Anfrage. – asveikau

14

Andere haben das im Grunde gesagt, aber ich möchte es deutlicher machen. Ihre beste Wette ist wahrscheinlich zu schreiben:

  1. plattformübergreifende Datenmodelle & Core-Logik, mit:
    • Bits GNUstep (Obj-C) oder
    • CF-Lite (C) oder
    • Was auch immer Sie möchten, solange es Cross-Plattform ist: P
  2. iPhone-only-Code-Schnittstelle, mit Cocoa touch (Obj-C)
  3. Android-only Schnittstellenkode, jedoch tun sie es für das Android.

Das ist so nah wie möglich; Jeder Versuch, plattformübergreifend Schnittstelle Code zu schreiben wird zweifellos zu einer mittelmäßigen App auf beiden Plattformen führen. Aber machen den ganzen Rest Ihres Codes portabel und nur eine gerätespezifische Schnittstelle um es gewickelt ist die ganze Zeit gemacht und wurde gut für einige iPhone-Entwickler gearbeitet.

+0

Beste Antwort bisher. Dies ist sehr hilfreich für Dinge wie einfache Spiele, wo ein großer Teil des Codes Spiellogik ist, und ein viel geringerer Betrag für Rendering und UI. –

+0

Ich würde nicht zustimmen, dass CF-Lite eine gute Cross-Plattform-Lösung ist. Grundsätzlich ist es praktisch für Mac-Programmierer und niemanden sonst. Ich würde eher etwas wie GLIB vorschlagen - obwohl das für GTK + -Programmierer etwas voreingenommen ist. – asveikau

+0

Es ist unwahrscheinlich, dass Sie etwas finden, das sowohl mit dem iPhone-Code als auch mit dem Android-Code verwendet werden kann. Ich denke, warum nicht etwas wie CF-Lite wählen, das gebührenfreie Überbrückung mit NS-Klassen hat? Auf diese Weise wird mindestens EINE Ihrer Schnittstellen einfach zu schreiben sein. :) – andyvn22

2

Kommt aus einem anderen Blickwinkel ... Ich weiß, dass du gesagt hast, du wolltest versuchen, bei Java zu bleiben, aber wenn du C# kennst, dann könntest du mit dem MonoTouch-Framework für das iPhone gehen. Mono ist im Wesentlichen eine Open-Source-Implementierung des .Net-Stacks. Das Mono-Team arbeitet daran, Mono auf Android zu bringen, sodass Sie im Grunde genommen eine gemeinsame C# -Bibliothek für Ihre Geschäftslogik schreiben und unterschiedliche Ansichten/Controller pro Plattform verwenden können. Dies wäre natürlich alles in C# und es ist ein bisschen teurer, aber es löst das Problem, alles in verschiedenen Sprachen zu schreiben.

Ich glaube, es heißt MonoTouch auf dem iPhone und MonoDroid auf Android.

+0

Gehen Sie mit diesem und Ihr Geschäft aus dem AppStore blockiert. Apple will nicht, dass du so gehst. Der ursprüngliche Fragesteller wusste das offenbar auch schon, und deshalb dachte er an die Idee "Okay, wir werden Objective C überall verwenden", was ebenfalls nicht durchführbar ist. Apples Einschränkung erfordert, dass Ihre App "ursprünglich" in einer Kombination von C, C++ und Objective C geschrieben ist. Da C-Bibliotheken erlaubt sind, sehe ich nicht, warum der ursprüngliche Fragesteller überhaupt daran interessiert wäre, Objective überall anders als iPhone zu verwenden.Daher ist die Frage etwas ungewöhnlich. –

+1

@Warren P: Ich weiß, dass dies ein alter Kommentar ist, aber für zukünftige Leser möchte ich feststellen, dass dies nicht mehr so ​​ist. Weder Unity noch Mono hatten Probleme mit Apple. Apples Einschränkung war auf Adobe Flash ausgerichtet, und das war es auch schon. Die Regel wurde ebenfalls aufgehoben. –

+1

Das ist richtig. Apple hat seitdem eine Menge entspannt. Sie haben nicht nur mono (Laufzeit) und Sprache (außer Objective-C) Fragen gelöst, sie erlaubten auch Emulatoren (wie C = 64) zurück und vieles mehr. Mein Kommentar war richtig als er geschrieben wurde und könnte in Zukunft wieder korrekt sein, wenn sich der Wind bei Apple wieder verschiebt. –

1

Die Objective-C-Laufzeit wurde noch nicht auf Android portiert. Es sollte nicht zu viel Arbeit sein, aber trotzdem, ohne ein funktionierendes Wissen der Sprache, bezweifle ich, dass Sie es leicht haben werden, es zu portieren.

Was Sie versuchen zu tun ist schwer für eine generische Anwendung, sollte aber für Spiele möglich sein, wenn Sie das Spiel in Plain C entwickeln (das sowohl vom Android NDK als auch vom iPhone unterstützt wird) . Sie müssten etwas Code schreiben, um Eingabeereignisse aus den Obj-C- und Java-Umgebungen in Ihren C-Code zu übertragen, aber das sollte kein großes Problem sein - Objective-C ermöglicht es Ihnen, Ihren C-Code direkt aufzurufen und es gibt viele Beispielprojekte, die genau das für Android tun.

1

Ich habe es selbst noch nicht versucht oder die Diskussion noch nicht beendet, aber es gibt einen Google Tech Talk auf Developing iPhone Applications using Java auf YouTube, der ziemlich vielversprechend aussieht.

0

Wenn Sie bis zu diesem Jahr warten können (genaue Zeit unbekannt), wird Adobe AIR für Android und einen Compiler für iPhone haben. So können Sie eine App in AIR für Android schreiben und den gleichen Code zum Kompilieren auf das iPhone verwenden.

http://labs.adobe.com/technologies/flashcs5/appsfor_iphone/

Auch wenn Sie nicht warten sehen: http://www.insideria.com/2008/12/actionscript-to-cocoa---protot.html wo es die Ähnlichkeiten zwischen Actionscript und Cocoa erklärt.

Überprüfen Sie auch: http://labs.adobe.com/technologies/air2/ für die AIR-Version, die den Touchscreen verwenden kann.

So kann man bald einmal schreiben und auf Android und iPhone bereitstellen Actionscript 3.

1

XMLVM ist ein Projekt, das für die Übersetzung (einige) Android-Anwendungen auf dem iPhone verwenden kann. Für weitere Informationen, besuchen Sie bitte

1

Ich weiß, dass dies ein bisschen spät, aber es scheint, dass die Industrie in Richtung der Web-Anwendungen in diesen Tagen, um App-Portabilität zu erreichen. Das heißt, einen Web-Browser in Ihre "skeleton native app" einzubetten und JavaScript, CSS und HTML für Android, iOS und die anderen großen Smartphone-Plattformen zu schreiben.

Es gibt Tools, die Ihnen dabei helfen. Vielleicht möchten Sie PhoneGap und Sencha Touch überprüfen, aber es gibt viele mehr. Beachten Sie, dass dieser Ansatz möglicherweise nicht ideal für Echtzeit-/animationsintensive Anwendungen ist.

2

Der Apportable SDK ist ein Objective-C-Ansatz zum einmaligen Schreiben und Bereitstellen für IOS und Android. Es kompiliert ein laufendes IOS Xcode-Projekt zu einem Android SDK.

Siehe Beispiel here für Beispiel-Apps, die auf beiden Plattformen in Minuten nach dem Download ausgeführt werden.

1

Hier ist ein Beitrag von facebooks Mobile @ scale Konferenz, bei der zwei Teams (Dropbox und Orchester) ähnliche Ansätze verwendeten. Dropbox verwendet C++ zum Erstellen von libdropbox und Orchestra (Postfach) verwendet Objective-c, um libmailbox zu erstellen.

Erneut haben sie ihre Frontends in der plattformeigenen Sprache geschrieben und ihre plattformübergreifenden Bibliotheken für Kernlogik und Daten verwendet.

Hauptvorteile, die ich wegnahm: Mailbox ging in 5 Wochen von iOS zu Android, weil es nur UI-Code zu erstellen war. Dropbox kann Beta-Änderungen an Kernfunktionen testen, die in der gemeinsam genutzten Bibliothek mit Android-Beta-Bereitstellungen enthalten sind, da es einfacher ist, massive Bereitstellungen im Maßstab für Beta-Builds durchzuführen.

Verwandte Themen