【发布时间】:2012-12-20 08:34:45
【问题描述】:
我在 Iphone 和 Android 中都使用 Web View。在 Android 中,我使用 create a variable 来调用原生的 Andriod 函数/方法。但我无法在 Iphone 中找到类似的东西。那么,如何从 JavaScript 调用原生 Iphone 函数。
【问题讨论】:
标签: javascript android iphone
我在 Iphone 和 Android 中都使用 Web View。在 Android 中,我使用 create a variable 来调用原生的 Andriod 函数/方法。但我无法在 Iphone 中找到类似的东西。那么,如何从 JavaScript 调用原生 Iphone 函数。
【问题讨论】:
标签: javascript android iphone
在 iOS 中,您可以通过实现 shouldStartLoadWithRequest 来使用自定义 url 方案。如果我想更改工具栏的色调颜色:
ViewController.h
@property (strong, nonatomic) IBOutlet UIToolbar *toolbar;
ViewController.m
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = request.URL;
NSString *scheme = [url scheme];
if ([scheme isEqualToString:@"color"]) {
self.toolbar.tintColor = [self colorWithHexString:url.host];
}
return YES;
}
在 javascript 中,您只需更改 window.location,这将启动 一劳永逸:
window.location = 'color://' + color;
只需链接您的参数,例如:
window.location = 'myscheme://param1/' + value1 + '/param2/' + value2;
只需确保您使用 encodeURIComponent 对参数进行编码(以创建有效的 url)。
在 Android 中添加一个 javascript 界面:
WebView webView = getWebView();
webView.loadUrl("http://localhost:8080");
// must be after loadUrl on lower apis
webView.addJavascriptInterface(new AndroidBridge(this), "AndroidBridge");
...
public class AndroidBridge {
private MainActivity activity;
public AndroidBridge(MainActivity activity) {
this.activity = activity;
}
@JavascriptInterface
public void changeNavbarBackground(String color) throws NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
Log.i(getClass().getSimpleName(), "changeNavbarBackground " + color);
Field f = R.color.class.getField(color);
final int col = (Integer) f.get(null);
activity.changeNavbarBackground(col);
}
}
在 javascript 中,您使用 javascript 接口:
if (window.AndroidBridge) {
window.AndroidBridge.changeNavbarBackground(color);
}
【讨论】:
用于 webview 的 Firebase 分析示例将为实现此功能提供更多见解。 请查看此sample
为了进行测试,您可以在某些服务器上托管示例 Web 部件并将该 URL 加载到 Web 视图上。
【讨论】: