我打算使用uiwebview來創建一個shell iphone應用程序,其中大部分應用程序都是通過uiwebview中的javascript運行的。關於如何從運行在UIWebView中的JS與主機obj-c應用程序進行通信的建議?
現在我知道很容易通過使用stringByEvaluatingJavaScriptFromString從obj-c環境到javascript環境進行通信,但是是否存在從javascript環境到obj-c世界的良好推薦溝通方式?
感謝
我打算使用uiwebview來創建一個shell iphone應用程序,其中大部分應用程序都是通過uiwebview中的javascript運行的。關於如何從運行在UIWebView中的JS與主機obj-c應用程序進行通信的建議?
現在我知道很容易通過使用stringByEvaluatingJavaScriptFromString從obj-c環境到javascript環境進行通信,但是是否存在從javascript環境到obj-c世界的良好推薦溝通方式?
感謝
我總是用一種方法,其中應用程序「導航」到特殊的URL:
window.location = "myapp://somemessage/someargument";
而且在應用程序捕獲這個在下面的功能:
-(BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
{
NSURL *url = [request URL];
if ([[url scheme] isEqualToString:@"myapp"])
{
[self handleJSEvent:url];
return NO;
}
return YES;
}
而且,根據您需要什麼,您可以使用您使用JSON.stringify(events)
獲取的某種事件隊列來響應使用上述方法發送到應用程序的消息。對於從應用程序到js的通信JSON也非常合適。
如果有一個標準或標準的方法來做到這一點,我顯然錯過了它。
也許通過改變URL哈希?
你的意思是blah.com/something.html#HASH?我注意到這種方法,是否涉及捕獲shouldStartLoadWithRequest事件? – Chris 2011-04-05 23:06:54
有一個很不錯的方法調用的UIWebView裏面的javascript:作爲通過URL提及MVDS
[webView stringByEvaluatingJavaScriptFromString:@"yourJSFunction('some_data');"];
回調是最好的做法:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
我剛剛創建了一個庫,將主要使用mvds和Ondrej描述的方法爲您提供便利。包括雙向通信,jQuery事件風格,可選的JSON有效載荷與多個監聽器。檢查出來:https://github.com/tcoulter/jockeyjs
從我的谷歌搜索,我認爲你已經描述了共同的'標準',如果你願意。大! – Chris 2011-04-05 23:21:37
不客氣。除了我的直覺告訴我,這種方法也相當可靠。 – mvds 2011-04-05 23:30:45
非常感謝。很高興知道這也是可靠的,這很重要。 – Chris 2011-04-06 00:05:54