Wie kann ich eine iPhone-App vollständig in JavaScript schreiben, ohne sie nur zu einer Web-App zu machen?


84

Ich möchte mir nicht die Zeit nehmen, Obj-C zu lernen. Ich habe mehr als 7 Jahre mit der Programmierung von Webanwendungen verbracht. Sollte es nicht eine Möglichkeit geben, WebView zu verwenden und einfach die gesamte App in Javascript zu schreiben und die Dateien direkt aus den Ressourcen des Projekts zu ziehen?

Antworten:


71

Ich fand die Antwort, nachdem ich mich umgesehen hatte. Folgendes habe ich getan:

  1. Erstellen Sie ein neues Projekt in XCode. Ich glaube, ich habe die ansichtsbasierte App verwendet.

  2. Ziehen Sie ein WebView-Objekt auf Ihre Benutzeroberfläche und ändern Sie die Größe.

  3. Innerhalb Ihrer WebViewController.m (oder einer ähnlich benannten Datei, abhängig vom Namen Ihrer Ansicht) in der viewDidLoad-Methode:

    NSString * filePath = [[NSBundle mainBundle] pathForResource: @ "index" ofType: @ "html"];  
    NSData * htmlData = [NSData dataWithContentsOfFile: filePath];  
    if (htmlData) {  
      NSBundle * bundle = [NSBundle mainBundle]; 
      NSString * path = [bundle bundlePath];
      NSString * fullPath = [NSBundle pathForResource: @ "index" ofType: @ "html" inDirectory: path];
      [webView loadRequest: [NSURLRequest requestWithURL: [NSURL fileURLWithPath: fullPath]]];
    }}
  4. Jetzt können alle Dateien, die Sie dem Projekt als Ressourcen hinzugefügt haben, in Ihrer Web-App verwendet werden. Ich habe eine index.html-Datei mit Javascript, CSS- und Bilddateien ohne Probleme. Die einzige Einschränkung, die ich bisher gefunden habe, ist, dass ich keine neuen Ordner erstellen kann, sodass alle Dateien den Ressourcenordner überladen.

  5. Trick: Stellen Sie sicher, dass Sie die Datei als Ressource in XCode hinzugefügt haben, da sie sonst nicht verfügbar ist. Ich habe eine leere Datei in XCode hinzugefügt und dann meine Datei im Finder nach oben gezogen. Das hat bei mir funktioniert.

Hinweis: Mir ist klar, dass Obj-C nicht so schwer zu lernen sein darf. Aber da ich diese App bereits in JS habe und weiß, dass sie in Safari funktioniert, ist dies ein viel schnellerer Entwicklungszyklus für mich. Ich bin mir sicher, dass ich eines Tages zusammenbrechen und Obj-C lernen muss.

Einige andere Ressourcen, die ich hilfreich fand:

Aufrufen von Obj-C aus Javascript: Aufrufen von Objective-C aus Javascript

Aufruf von Javascript von Obj-C: iPhone App-Entwicklung für Web-Hacker

Lesen von Dateien aus dem Anwendungspaket: uiwebview


Interessanterweise habe ich mir dieses Wochenende nur den Code für GitX (Standard-MacOS-App) angesehen und ich denke, das ist auch das, was sie tun. wiki.github.com/pieter/gitx
Pat Notz

1
Versuchen Sie für das Problem der Unordnung, Ihrem xcode-Projekt ein Verzeichnis hinzuzufügen und wählen Sie "Ordnerreferenzen erstellen ..." anstelle von "Gruppen rekursiv erstellen ...".
Rhythmic Fistman

1
+1. Und ich bin mir ziemlich sicher, dass Sie dieselbe Technik verwenden können, um eine Android-Telefon-App zu erstellen. Und vermutlich werden die anderen Smartphones ihre Browser weiterentwickeln, um Javascript zu unterstützen, und dann können Sie sie auch unterstützen. Plattformübergreifendes HTML / CSS / JavaScript ist der Weg des 21. Jahrhunderts. Sicherlich ist knorriger plattformspezifischer nativer Code längst aus der Mode gekommen?
MarkJ


7

Für diejenigen, die dies auf dem iPhone 2.1 (möglicherweise 2.0) tun, müssen Sie KEINE speziellen Dienste für die lokale Datenspeicherung erstellen. MobileSafari scheint die HTML5 / WHATWG SQL-Datenbank-API zu unterstützen. Dies ist dieselbe API, die von neueren Versionen von Desktop Safari und Firefox unterstützt wird.

Wenn Sie ein Toolkit wie Dojo oder ExtJS verwenden, das eine Speicherabstraktion bietet, sollte Ihr Code in nahezu jedem modernen Browser funktionieren, einschließlich MobileSafari.

Öffnen Sie zum Testen http://robertsanders.name/dev/stackoverflow/html5.html auf Ihrem iPhone.

Wenn Sie diese Seite öffnen und dann das Dateisystem eines iPhone mit Jailbroken anzeigen, sollte sich irgendwo in / private / var / mobile / Library / WebKit / Databases / eine Datenbank befinden. Es gibt dort sogar ein Verzeichnis von im Internet geöffneten DBs.

root # sqlite3 /private/var/mobile/Library/WebKit/Databases/Databases.db SQLite Version 3.5.9 Geben Sie ".help" ein, um Anweisungen zu erhalten

sqlite> .databases seq name file


0 main /private/var/mobile/Library/WebKit/Databases/Databases.db

SQLite> .tables

Ursprünge der Datenbanken

sqlite> wähle * aus Datenbanken;

1 | http_robertsanders.name_0 | NoteTest | Datenbank | API-Beispiel | 20000 | 0000000000000001.db

sqlite> wähle * aus Origins;

http_robertsanders.name_0 | 5242880



2

Sie sollten den nativen Wrapper in Ziel C schreiben lassen. Dieser Wrapper kann wirklich wenige Codezeilen (z. B. 10) enthalten, die zum Erstellen einer WebView und zum Navigieren zu der angegebenen Adresse im Internet (wo sich Ihre Anwendung befindet) erforderlich sind. In diesem Fall sollte Ihre Anwendung jedoch eine Webanwendung mit vollem Funktionsumfang sein (ich meine, verwenden Sie nicht nur JavaScript, sondern auch HTML für Markups).


2

Ich bin auf dasselbe Problem gestoßen. Ich habe bereits ein Spiel, das vollständig in Javascript geschrieben ist. Ich würde gerne eine iPhone-freundliche Version machen, aber Obj-C ist ein Overkill. Am Ende habe ich mit WebView auf eine spezielle URL der iPhone-App verwiesen. Nachdem ich darüber nachgedacht habe, könnte ich diese Dateien einfach in das App-Verzeichnis verschieben und lokal ausführen.


2

Mit den aktuellen Apple-APIs ist dies nicht möglich. Am ehesten schreiben Sie eine einfache native iPhone-App, in die der Webkit-Browser eingebettet ist. Auf diese Weise können Sie Ihre xhtml / js-Anwendung lokal durchsuchen.

Wenn Sie Daten speichern möchten, müssen Sie noch einen Schritt weiter gehen und einen leichten http-Server einbinden, der Ihre App auf den Server bringt und Anrufe zum Speichern und Abrufen von Daten bereitstellt. Wahrscheinlich keine ideale Lösung für Sie, aber möglicherweise weniger Arbeit als eine vollständige Obj-C-App.

Als Randnotiz ist Obj-C ziemlich einfach zu lernen. Das SDK enthält unzählige Beispiele. Die Community ist stark und wird ohne zu zögern gut gestellte Fragen beantworten.


Sie können den lokalen Speicher über die WHATWG / HTML5-SQL-Speicher-API für JavaScript verwenden. Weitere Informationen finden Sie in meiner Antwort.
Robert Sanders


1

Titanium Mobile ist ebenfalls eine Option - Sie können JavaScript schreiben, das in Objective-C übersetzt wird.


Ist es wirklich in Objective-C übersetzt? Ich denke, es wird in einer Webbrowser-Komponente wie PhoneGap ausgeführt.
Jonas

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.