Calling javascript from Cocoa 'facelessly'
Calling javascript from Cocoa 'facelessly'
- Subject: Calling javascript from Cocoa 'facelessly'
- From: Geoffrey Holden <email@hidden>
- Date: Wed, 30 Jun 2010 18:01:01 +0100
My company has a webpage (internal, sadly, so I can't let you have a link to look at) which is entirely driven by Javascript, and which requires authentication to access (the authentication too is driven by Javascript, rather than by the more normal https sign in methods).
The website is a) ugly as hell, b) not very flexible and c) won't format correctly on the screen of an iPhone. The first issue is aesthetic, the second is a serious issue and the third could well be a problem in the future.
The obvious answer would be 'change the site', but that isn't very practical sadly - political issue, don'tchaknow! I'm working hard to increase uptake of Apple equipment at work, and if I can encapsulate the website as a friendly app on the Mac that could be a major driver. This is just a project that I'm kicking around out of hours for the love of it and in the hope that Macs might end up being a preferred solution!
Initially, I just want to produce a proof of concept which runs at the command line (the connection will be implemented as a faceless plug in) and I don't want a webview in the UI. So, that said, I cobbled together the following test:
//for header
IBOutlet WebView * webView;
NSDictionary* pluginPrefs;
//for body
NSString* preferencesFile = [NSHomeDirectory() stringByAppendingPathComponent:@"/Desktop/Prefs.plist"];
pluginPrefs = [[NSDictionary alloc] initWithContentsOfFile:preferencesFile];
WebFrame *mainFrame = [webView mainFrame];
NSURL *url = [NSURL URLWithString:[pluginPrefs objectForKey:@"ServerURL"]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[mainFrame loadRequest:request];
id win = [webView windowScriptObject];
NSArray *args = [NSArray arrayWithObjects:
@"signIn",
[pluginPrefs objectForKey:@"Username"],
[pluginPrefs objectForKey:@"Password"],
nil];
//login (in theory!)
NSLog(@"Parameters: %@, %@",[pluginPrefs objectForKey:@"Username"],[pluginPrefs objectForKey:@"Password"]);
id result = [win callWebScriptMethod:@"muc.userAuth" withArguments:args];
if(![result isMemberOfClass:[WebUndefined class]])
NSLog(@"%@", result);
else
NSLog(@"Unable to initialize connection");
The code builds correctly, and runs - but, just for starters, the result seems to be wrong (it should return 'Unable to initialize connection' as far as I can tell), because it always returns the same result whether I have a 'valid' javascript function or not. Of course, once (if!) I get it to connect correctly, I then need to solve the problem of capturing the stream of messages that will be received in not-quite-real-time. I'll cross that bridge when I come to it.
The muc.userAuth function can be found in and external .js file, referenced in the page html with the following tag:
<script type="text/javascript" src="../js/ejc.js?ver=2.0.1.1"></script>
I realize that this is a hell of a big query, and I'm not entirely sure that I've given enough information for anyone to help answer it. At the very least, I guess I'm hoping for a reference to some really solid documentation on how to do what I'm trying to do - the documentation on ADC seems to be a little light in this area.
Thanks, and regards,
Geoff_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden