我一直在寻找一种方法从我的 UIWebView 中的一些JavaScript调用Objective-C代码。关于这一点已经创建了很多主题,其中一些主题是在博客文章UIWebView Secrets - Part3 - How to Properly Call ObjectiveC From Javascript中推荐完成的过程,其中 UIWebViewDelegate 方法被黑客攻击以调用本机Objective-C代码。这仍然是最好的方法吗?似乎PhoneGap有办法做到这一点,但我无法找到如何做到这一点。但是如果他们的程序与此相同,我就不明白为什么我应该包括他们的库来做这件事。
目前最好的做法是采用哪种方法?
答案 0 :(得分:1)
没有任何外部框架,我们可以做到这一点。为了实现这一点,我们必须使用webView。 例如,如果您需要在webview中单击按钮时调用目标c函数。当html页面中按钮的单击调用javascript时,只需添加一个iFrame,其中包含函数名称目标C函数。
例如:
var iframe = document.createElement("IFRAME");
iframe.setAttribute("src", "js-frame:" + functionName + ":" + callbackId);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
iframe = null
可以在webView的ParentView中实现的webView委托中加入此iFrame,例如 -
- (BOOL)webView:(UIWebView *)webView2
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
NSString *requestString = [[request URL] absoluteString];
if ([requestString hasPrefix:@"js-frame:"]) {
NSArray *components = [requestString componentsSeparatedByString:@":"];
NSString *function = (NSString*)[components objectAtIndex:1];
int callbackId = [((NSString*)[components objectAtIndex:2]) intValue];
stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
;
[self handleCall:function callbackId:callbackId];
return NO;
}
return YES;
}
handleCall必须处理名为“function”的预期方法的调用
答案 1 :(得分:0)
除了在JS代码中使用自定义URL方案来调用javascript之外,没有(公共)API可以做到这一点。
假设您在JS代码中加载了URL myproto://invokeMethodA
,如此
window.location.href = "myproto://invokeMethodA";
您可以在UIWebView
委托方法
– webView:shouldStartLoadWithRequest:navigationType:
做你的东西。确保您返回NO
以不实际执行请求。
答案 2 :(得分:0)
我最终使用了NativeBridge中推荐的the blog post插件。