此应用程序已存在于 Apple App Store 和 Android 市场中。这是一个使用大量 native 代码的应用程序,不适合完全 html5ed。
冗长的描述
我想要一个基于网络的系列设置页面。其中一些页面将驻留在移动设备本地,而另一些将托管在远程服务器上。 native 应用程序需要与本地网页通信,以使用 javascript 在网页中获取和设置信息。
例如,WebView/UIWebview 中显示的第一个页面将是本地索引页面。如果远程网站出现故障,索引页面上指向远程页面的链接将显示为灰色。在加载 WebView 时, native 应用程序将需要检测该页面的可达性并将 javascript 发送到页面以使按钮变灰。同样,在本地网页中所做的一些设置更改需要发送回 native 应用程序进行处理。
简短而甜蜜的要求摘要
- 在 WebView 中嵌入远程和本地网页
- 这些网页对于 Android 和 iOS 都是一样的
- 本地页面使用 JavaScript 从本地移动应用程序获取数据并向其发送数据
潜在的解决途径
一个。 PhoneGap
我意识到,如果我的应用程序完全是一个网络应用程序,那么 Phonegap 可以很好地解决这个问题。从我的阅读来看,Phonegap 似乎不太喜欢嵌入本地应用程序中进行兼职工作。
什么?你说这真的很容易,我被严重误导了?启发我哦,聪明人。
B. 自己动手
我愿意推出自己的解决方案,但是通过 Javascript 从 Web View 到 native 应用程序获取和设置信息的方法似乎完全不同。获得比设置更重要(iOS 的虚假 URL,Android 的非常好的 AddJavaScriptInterface)。此外,这条路径似乎会在未来导致严重的维护问题。
说什么?你的天才程序员 friend 做了一个网站,详细描述了这个过程?告诉我更多。
C. 第 3 方库
完美的第 3 方库是否存在,可以满足我的所有需求(甚至更多!)?把我从无知中拯救出来。
决定
在未来,PhoneGap 的“Cleaver”项目似乎是实现这一目标的最佳方式。
由于它尚未为 Android 做好准备,目前(2012 年 6 月上旬)一次写入嵌入式 HTML 的最佳解决方案似乎是使用伪造的 URL 方案从网页与 native 应用程序进行通信(原生应用跳转到网页时,两个平台都可以直接在页面上执行JS)。
最佳答案
对于 Android,这更容易做到。看一下 WebView
的 addJavascriptInterface
方法。您可以使用可在 HTML javascript 中直接调用的方法创建您自己的对象。
iOS 需要一些技巧。这些类型的问题的最佳解决方案是几件事:
- 对于 iOS 的回调,您基本上需要构建自己的 URL 方案,例如
native://somehost.com/somepath
当您的 javascript 想要通知 iOS 代码时,请使用window。 location = 'native://somehost.com/somepath';
将
UIWebView
委托(delegate)设置为定义 webView:shouldStartLoadWithRequest:navigationType: 的对象它看起来像这样if ([request.URL.scheme isEqualToString:@"native"]){ if([request.URL.host isEqualToString:@"somehost.com"]) { //Do the code you need to do here, branch off depending //on the path and/or host, you can parse parameters here too return NO; //This will keep UIWebView from trying to actually load //your made up scheme } } return YES; //If the request isn't one you want to intercept return YES/true //so UIWebView will load the page
要让您的 iOS 代码在您的 javascript 中发送信息或调用函数,您可以使用 WebView 的
stringByEvaluatingJavaScriptFromString:
.这将返回 javascript 表达式的结果,因此您还可以使用它从页面本身获取一些信息。要调用函数,请使用类似这样的东西[webview stringByEvaluationgJavaScriptFromString:@"myJavaScriptFunction();"]
您还可以通过创建自定义 WebViewClient
来处理 Android 中的组合方案并覆盖 shouldOverrideUrlLoading
方法,类似于上面的 iOS 代码,除了返回调用是向后的,如果您处理了 URL 和 WebView
,则返回 true
应该什么都不做,如果您希望 WebView
处理加载,则为 false
。请务必使用 setWebViewClient
创建自定义 WebViewClient
并将其分配给 WebView
.要在实际的 WebView
上调用 javascript 函数,请执行类似 webview.loadUrl("javascript:myJavaScriptFunction();");
关于android - 与现有 iOS 和 Android 应用程序中的嵌入式 (UI)Webviews 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10657080/