Jak mogę napisać aplikację na iPhone'a w całości w JavaScript, nie czyniąc z niej tylko aplikacji internetowej?

84

Nie chcę poświęcać czasu na naukę Obj-C. Spędziłem ponad 7 lat na programowaniu aplikacji internetowych. Czy nie powinno być sposobu na użycie WebView i po prostu napisanie całej aplikacji w javascript, ściągając pliki bezpośrednio z zasobów projektu?

Jeff
źródło

Odpowiedzi:

71

Znalazłem odpowiedź po przeszukaniu. Oto, co zrobiłem:

  1. Utwórz nowy projekt w XCode. Myślę, że korzystałem z aplikacji opartej na widoku.

  2. Przeciągnij obiekt WebView do interfejsu i zmień jego rozmiar.

  3. Wewnątrz twojego WebViewController.m (lub podobnie nazwanego pliku, w zależności od nazwy twojego widoku), w metodzie viewDidLoad:

    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. Teraz wszystkie pliki dodane jako zasoby do projektu są dostępne do użycia w Twojej aplikacji internetowej. Mam plik index.html zawierający javascript i css oraz pliki graficzne bez żadnych problemów. Jedynym ograniczeniem, które do tej pory znalazłem, jest to, że nie mogę tworzyć nowych folderów, więc wszystkie pliki zaśmiecają folder zasobów.

  5. Sztuczka: upewnij się, że dodałeś plik jako zasób w XCode, w przeciwnym razie plik nie będzie dostępny. Dodawałem pusty plik w XCode, a następnie przeciągałem mój plik na górę w Finderze. To działa na mnie.

Uwaga: zdaję sobie sprawę, że Obj-C nie może być trudny do nauczenia. Ale ponieważ mam już tę aplikację istniejącą w JS i wiem, że działa w Safari, jest to dla mnie znacznie szybszy cykl deweloperski. Pewnego dnia będę musiał się załamać i nauczyć Obj-C.

Kilka innych zasobów, które okazały się pomocne:

Wywołanie Obj-C z javascript: wywołanie objective-c z javascript

Wywołanie javascript z Obj-C: tworzenie aplikacji na iPhone'a dla hakerów internetowych

Odczytywanie plików z pakietu aplikacji: uiwebview

Jeff
źródło
Co ciekawe, właśnie patrzyłem na kod GitX (standardowa aplikacja na MacOS) w ten weekend i myślę, że oni też to robią. wiki.github.com/pieter/gitx
Pat Notz
1
Aby uniknąć bałaganu, spróbuj dodać katalog do projektu xcode i wybierz opcję „Utwórz odwołania do folderów ...” zamiast „Utwórz grupy rekurencyjne ...”.
Rhythmic Fistman
1
+1. Jestem prawie pewien, że możesz użyć tej samej techniki do stworzenia aplikacji na telefon z Androidem. Przypuszczalnie inne smartfony rozwiną swoje przeglądarki tak, aby obsługiwały Javascript, a wtedy Ty też możesz je obsługiwać. Wieloplatformowy HTML / CSS / JavaScript to sposób XXI wieku. Z pewnością natywny kod specyficzny dla platformy wyszedł z mody dawno temu?
MarkJ
22

Sprawdź PhoneGap na http://www.phonegap.com, jak twierdzą, że umożliwia osadzanie JavaScript, HTML i CSS w natywnej aplikacji na iPhone'a.

Chris Samuels
źródło
7

Dla tych, którzy robią to na iPhonie 2.1 (być może 2.0), NIE musisz tworzyć żadnych specjalnych usług do lokalnego przechowywania danych. Wygląda na to, że MobileSafari obsługuje interfejs API bazy danych HTML5 / WHATWG SQL. To ten sam interfejs API obsługiwany przez najnowsze wersje przeglądarek Safari i Firefox na komputery stacjonarne.

Jeśli używasz zestawu narzędzi, takiego jak Dojo lub ExtJS, który oferuje abstrakcję pamięci, Twój kod powinien działać na prawie każdej nowoczesnej przeglądarce, w tym MobileSafari.

Aby przetestować, otwórz http://robertsanders.name/dev/stackoverflow/html5.html na swoim iPhonie.

Jeśli otworzysz tę stronę, a następnie spojrzysz na system plików iPhone'a z jailżerem, powinieneś zobaczyć bazę danych gdzieś w / private / var / mobile / Library / WebKit / Databases /. Jest tam nawet katalog baz danych otwieranych w sieci.

root # sqlite3 /private/var/mobile/Library/WebKit/Databases/Databases.db SQLite wersja 3.5.9 Wpisz „.help”, aby uzyskać instrukcje

sqlite> .databases seq nazwa pliku


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

sqlite> .tables

Źródła baz danych

sqlite> wybierz * z baz danych;

1 | http_robertsanders.name_0 | NoteTest | Baza danych | Przykład API | 20000 | 0000000000000001.db

sqlite> wybierz * z Origins;

http_robertsanders.name_0 | 5242880

Robert Sanders
źródło
4

Możesz stworzyć aplikację, nie znając żadnego obj-C. Framework QuickConnectiPhone pozwala to zrobić. Sprawdź http://tetontech.wordpress.com, aby dowiedzieć się, jak go używać, a także inne sposoby robienia tego, o co prosiłeś.

Zawietrzny
źródło
2

Powinieneś mieć natywne opakowanie napisane w celu C. To opakowanie mogłoby zawierać naprawdę kilka linii kodu (np. 10) niezbędnych do stworzenia WebView i nawigowania po nim pod podany adres w Internecie (gdzie znajduje się twoja aplikacja). Ale w tym przypadku twoja aplikacja powinna być w pełni funkcjonalną aplikacją internetową (mam na myśli, używaj nie tylko JavaScript, ale także HTML do znaczników).

Sergey Mikhanov
źródło
2

Napotkałem ten sam problem. Mam już grę napisaną w całości w Javascript. Chciałbym stworzyć wersję przyjazną dla iPhone'a, ale Obj-C to przesada. Skończyło się na tym, że użyłem WebView do wskazania specjalnego adresu URL aplikacji na iPhone'a. Po przemyśleniu tego, przypuszczam, że mógłbym po prostu przenieść te pliki do katalogu aplikacji i uruchomić je lokalnie.

dawnerd
źródło
2

Nie ma sposobu, aby to zrobić z obecnymi interfejsami Apple API. Twoim najbliższym rozwiązaniem jest napisanie prostej natywnej aplikacji na iPhone'a, która osadzi przeglądarkę Webkit. Umożliwi to lokalne przeglądanie aplikacji xhtml / js.

Jeśli chcesz przechowywać dane, musisz pójść o krok dalej i dołączyć lekki serwer http, który obsługuje Twoją aplikację i zapewnia wywołania w celu przechowywania i pobierania danych. Prawdopodobnie nie jest to idealne rozwiązanie dla Ciebie, ale prawdopodobnie mniej pracy niż pełna aplikacja Obj-C.

Na marginesie, Obj-C jest dość łatwy do nauczenia. W SDK jest mnóstwo przykładów. Społeczność jest silna i bez wahania odpowie na dobrze postawione pytania.


źródło
Możesz korzystać z pamięci lokalnej za pośrednictwem interfejsu API WHATWG / HTML5 SQL Storage dla JavaScript. Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Robert Sanders,
1

Titanium Mobile jest również opcją - pozwala na pisanie JavaScript, który zostanie przetłumaczony na Objective-C.

Josh Brown
źródło
Czy to naprawdę jest przetłumaczone na Objective-C? Myślę, że jest uruchamiany w komponencie przeglądarki internetowej, takim jak PhoneGap.
Jonas