5

这个应用程序已经存在于 Apple App Store 和 Android 市场。这是一个使用大量本机代码的应用程序,不是完全 html5ed 的候选者。

冗长的描述

我想要一个基于 Web 的系列设置页面。其中一些页面将在本地移动设备上运行,而另一些页面将托管在远程服务器上。本机应用程序需要与本地网页通信,以使用 javascript 获取和设置网页中的信息。

例如,WebView/UIWebview 中显示的第一个页面将是本地索引页面。如果远程网站关闭,则索引页面上指向远程页面的链接将显示为灰色。在加载 WebView 时,本机应用程序将需要检测该页面的可达性并将 javascript 发送到页面以使按钮变灰。同样,在本地网页中进行的一些设置更改需要发送回 Native 应用程序进行处理。

简短而甜蜜的需求摘要

  • 在 webview 中嵌入远程和本地网页
  • Android 和 iOS 的这些网页将相同
  • 本地页面使用 JavaScript 从 Native Mobile App 获取数据并将数据发送到 Native Mobile App

潜在的解决途径

A.PhoneGap _

我意识到如果我的应用程序完全是一个网络应用程序,Phonegap 会很好地解决这个问题。从我的阅读来看,Phonegap 似乎并不喜欢嵌入到本地应用程序中进行兼职工作。

什么?你说这很容易,而我被严重误导了?启发我哦,聪明的人。

B.自己动手

我愿意推出自己的解决方案,但是通过 Javascript 从 Webviews 到 Native Apps 获取和设置信息的方法似乎完全不同。比设置更重要(iOS 的虚假 URL,Android 的非常好的 AddJavaScriptInterface)。此外,这条路径似乎会在未来导致严重的维护问题。

说什么?你的天才程序员朋友制作了一个网站,详细描述了这个过程?告诉我更多。

C.第三方图书馆

完美的第 3 方库可以满足我的所有需求(以及更多!)存在吗?救我脱离无知。


决定

在未来,PhoneGap 的“Cleaver”项目似乎将是做到这一点的最佳方式。

由于尚未为 Android 做好准备,目前(2012 年 6 月上旬)编写一次嵌入 HTML 的最佳解决方案似乎是使用虚假 URL 方案从网页与本机应用程序进行通信(两个平台都可以从原生应用程序转到网页时直接在页面上执行JS)。

4

2 回答 2

10

对于 Android,这更简单。看看WebViewaddJavascriptInterface方法。您可以使用可以在 HTML javascript 中直接调用的方法创建自己的对象。

iOS 需要一些技巧。这些类型问题的最佳解决方案是几件事:

  • 对于 iOS 的回调,您基本上需要组成自己的 URL 方案,例如native://somehost.com/somepath当您的 javascript 想要通知 iOS 代码使用时window.location = 'native://somehost.com/somepath';
  • UIWebView委托设置为定义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并覆盖shouldOverrideUrlLoading类似于上面的 iOS 代码的方法来处理 Android 中的组合方案,除了返回调用是向后的,true如果您处理了 URL 并且WebView应该什么都不做,并且false如果您想要WebView处理装载。请务必创建自定义并将其分配WebViewClientWebViewusing setWebViewClient。要在实际上调用 javascript 函数,WebView请执行以下操作webview.loadUrl("javascript:myJavaScriptFunction();");

于 2012-05-18T18:20:47.707 回答
0

PhoneGap iOS 有一个名为 Cleaver 的概念,您可以在其中将 Web 视图嵌入到本机 iOS 应用程序中。Randy McMillian 有一个很好的例子。在 Android 方面,正在开展工作以带来相同的功能。所以我们还没有到达那里,但我们会到达那里。

于 2012-05-18T19:44:42.597 回答