在iOS中,如何从中的Javascript调用Objective-C方法UIWebView
并将其发送回Java数据?我知道可以使用Webkit库在OSX上完成此操作,但是在iOS上可以吗?PhoneGap如何实现这一目标?
有一个API可直接从Objective-C调用JavaScript, 但不能直接从Javascript调用Objective-C。
您必须将Javascript操作序列化为一个特殊的URL,并在UIWebView的委托shouldStartLoadWithRequest
方法中截取该URL
。
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType;
在这里,您可以反序列化该特殊URL并对其进行解释,以实现Objective-
C方面的目标。(您应该返回NO
上述shouldStartLoadWithRequest
方法,以便UIWebView不会使用您的虚假URL实际发出HTTP请求来加载网页。)
然后,您可以通过在Webview上调用此方法来从Objective-C运行Javascript。
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
我建议使用伪造的URL方案,这样很容易分辨出操作URL和合法请求之间的区别。您可以按照以下方式在Javascript中发出此请求:
// JavaScript to send an action to your Objective-C code
var myAppName = 'myfakeappname';
var myActionType = 'myJavascriptActionType';
var myActionParameters = {}; // put extra info into a dict if you need it
// (separating the actionType from parameters makes it easier to parse in ObjC.)
var jsonString = (JSON.stringify(myActionParameters));
var escapedJsonParameters = escape(jsonString);
var url = myAppName + '://' + myActionType + "#" + escapedJsonParameters;
document.location.href = url;
然后,在UIWebView.delegate
的shouldStartLoadWithRequest
方法中,您可以检查URL方案和片段,以检查这是正常请求还是您的特殊操作之一。(URL的片段位于后面#
。)
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
// these need to match the values defined in your JavaScript
NSString *myAppScheme = @"myfakeappname";
NSString *myActionType = @"myJavascriptActionType";
// ignore legit webview requests so they load normally
if (![request.URL.scheme isEqualToString:myAppScheme]) {
return YES;
}
// get the action from the path
NSString *actionType = request.URL.host;
// deserialize the request JSON
NSString *jsonDictString = [request.URL.fragment stringByReplacingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
// look at the actionType and do whatever you want here
if ([actionType isEqualToString:myActionType]) {
// do something in response to your javascript action
// if you used an action parameters dict, deserialize and inspect it here
}
// make sure to return NO so that your webview doesn't try to load your made-up URL
return NO;
}
下面是我的代码: 是不可能插入IMEI的事实,这就是为什么它不张贴,还是其他一些问题? 谢谢你的协助。
问题内容: 我在将数据返回到想要返回的函数时遇到问题。代码如下: 我通过在另一个函数内调用processRequest函数来调用这段代码。发送请求并获取响应就可以了。但是,我需要将响应中的值“ id”返回给processRequest函数,因此它又可以将该值返回给其调用方。据我所知,processResponse中的返回值返回到$ .ajax,但是我需要它进一步返回到processRequest。
问题内容: 我正在尝试从C 调用python类中的方法。调用它的C 方法是C ++回调。 在此方法中,当我尝试调用python方法时,它给出了。 我已经将python函数的实例保存在全局变量中,例如 python方法在哪里,将在回调中使用。 在回调中,参数创建为 创建时 在这一行中,它给出了细分错误。之后,实际的python方法称为 问题答案: 如果要从C / C ++回调中调用Python函数,
问题内容: 我想从JavaScript 调用,这是一个C#函数。我尝试了下面的代码,但是无论JavaScript条件是还是,都被调用了! JavaScript代码: 后面的C#代码: 如何从JavaScript调用C#函数? 问题答案: 您可以使用Web方法和Ajax:
问题内容: 我在将数据发送到在线数据库时遇到问题。当我检查数据库时,似乎什么都没有发布。我对收到的响应执行了NSLog,它为空。 这是.php: 但是,如果我将$ response硬编码为某个字符串值,而NSLog接收到的响应,它将接收适当的字符串值。 这是我的代码: 是不是无法插入IMEI(这就是为什么它不发布)或其他问题的事实? 谢谢你的协助。 问题答案: 一些观察: 您应该使用interfa
问题内容: 我有这个小点击计数器。我想将每次单击都包含在mysql表中。有人可以帮忙吗? 万一有人想看看我做了什么: 这是phpfile.php,出于测试目的,将数据写入txt文件 问题答案: 您的问题中定义的JavaScript不能直接与MySql一起使用。这是因为它不在同一台计算机上运行。 JavaScript在客户端(在浏览器中)运行,并且数据库通常在服务器端存在。您可能需要使用中间服务器端