views:

8938

answers:

11

I don't want to take the time to learn Obj-C. I've spent 7+ years doing web application programming. Shouldn't there be a way to use the WebView and just write the whole app in javascript, pulling the files right from the resources of the project?

A: 

You should have the native wrapper written in Objective C. This wrapper could contain really few lines of code (like, 10) necessary to create a WebView and navigate it to the given address in the internet (where your application resides). But in this case your application should be a full-featured web application (I mean, use not only the JavaScript, but also some HTML for markup).

Sergey Mikhanov
A: 

I ran into this same problem. I already have a game written entirely in Javascript. I would love to make an iPhone friendly version, but Obj-C is an overkill. What I ended up doing was using the WebView to point to a special url of the iphone app. After thinking about it, I suppose I could just move those files to the app directory and run them locally.

dawnerd
A: 

There not way to do this with the current apple API's. Your closest bet is to write a simple native iPhone app that embeds the webkit browser. That will let you browse your xhtml/js application locally.

If you want to store data, you'll need to take it a step further and include a light weight http server that servers up your app and provides calls to store and retrieve data. Probably not an ideal solution for you, but possibly less work than a full Obj-C app.

As a side note, Obj-C is fairly easy to learn. There are tons of examples in the SDK. The community is strong and will answer well put questions without hesitation.

You can use local storage via the WHATWG/HTML5 SQL storage API for JavaScript. See my answer for more information.
Robert Sanders
+44  A: 

I found the answer after searching around. Here's what I have done:

  1. Create a new project in XCode. I think I used the view-based app.

  2. Drag a WebView object onto your interface and resize.

  3. Inside of your WebViewController.m (or similarly named file, depending on the name of your view), in the viewDidLoad method:

    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. Now any files you have added as resources to the project are available for use in your web app. I've got an index.html file including javascript and css and image files with no problems. The only limitation I've found so far is that I can't create new folders so all the files clutter up the resources folder.

  5. Trick: make sure you've added the file as a resource in XCode or the file won't be available. I've been adding an empty file in XCode, then dragging my file on top in the finder. That's been working for me.

Note: I realize that Obj-C must not be that hard to learn. But since I already have this app existing in JS and I know it works in Safari this is a much faster dev cycle for me. Some day I'm sure I'll have to break down and learn Obj-C.

A few other resources I found helpful:

Calling Obj-C from javascript: http://tetontech.wordpress.com/2008/08/14/calling-objective-c-from-javascript-in-an-iphone-uiwebview/

Calling javascript from Obj-C: http://dominiek.com/articles/2008/7/19/iphone-app-development-for-web-hackers

Reading files from application bundle: http://iphoneincubator.com/blog/tag/uiwebview

Jeff
Interestingly enough, I was just looking at the code for GitX (standard MacOS app) this weekend and I think this is also what they do. http://wiki.github.com/pieter/gitx
Pat Notz
For the clutter problem, try adding a directory to your xcode proj and selecting "Create Folder References..." instead of "Recursively Create Groups...".
Rhythmic Fistman
+1. And I'm pretty sure you could use the same technique to make an Android phone app. And, presumably, the other smartphones will evolve their browsers to support Javascript and then you can support them too. Cross-platform HTML/CSS/JavaScript is the 21st century way. Surely gnarly platform-specific native code went out of fashion long ago?
MarkJ
+5  A: 

For those doing this on iPhone 2.1 (maybe 2.0), you do NOT need to create any special services for local data storage. MobileSafari appears to support the HTML5/WHATWG SQL database API. This is the same API supported by recent versions of desktop Safari and Firefox.

If you're using a toolkit like Dojo or ExtJS that offers a storage abstraction, your code should work on just about any modern browser, including MobileSafari.

To test, open http://robertsanders.name/dev/stackoverflow/html5.html on your iPhone.

If you open that page then look on the filesystem of a Jailbroken iPhone, you should see a database somewhere in /private/var/mobile/Library/WebKit/Databases/. There's even a directory of web-opened DBs there.

root# sqlite3 /private/var/mobile/Library/WebKit/Databases/Databases.db SQLite version 3.5.9 Enter ".help" for instructions

sqlite> .databases seq name file


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

sqlite> .tables

Databases Origins

sqlite> select * from Databases;

1|http_robertsanders.name_0|NoteTest|Database|API example|20000|0000000000000001.db

sqlite> select * from Origins;

http_robertsanders.name_0|5242880

Robert Sanders
+15  A: 

Check out PhoneGap at http://www.phonegap.com they claim it allows you to embed JavaScript, HTML and CSS into a native iPhone app.

Chris Samuels
now approved by apple!http://blogs.nitobi.com/jesse/2009/11/20/phonegapp-store-approval/
Neo42
+3  A: 

You can create an application without knowing any obj-C. The QuickConnectiPhone framework allows you to do this. Check out http://tetontech.wordpress.com for how to use it as well as other ways of doing what you have asked.

Lee
+1  A: 

I have been using phonegap for a while and it seems to have the best results for me. I will post my experience in a week or so with a link to my app as well.

now approved by applehttp://blogs.nitobi.com/jesse/2009/11/20/phonegapp-store-approval/
Neo42
+1  A: 

look at the new o'reilly book on the matter

cris
A: 

At least 2 others mentioned phonegap, but I thought I'd post this too and mention that Apple has approved the phonegap framework. So, now you won't get your app rejected by Apple just because you're using phonegap.

Blog post about phonegap and Apple - http://blogs.nitobi.com/jesse/2009/11/20/phonegapp-store-approval/

Phone Gap Home

Neo42
+1  A: 

Titanium Mobile is also an option - it allows you to write JavaScript that gets translated into Objective-C.

Josh Brown