在现有iOS和Android应用程序中与嵌入式(UI)Webview进行通信

时间:2012-05-18 17:23:54

标签: android ios cordova uiwebview webview

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

Longwinded Description

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

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

简短而甜蜜的要求摘要

  • 在网络视图中嵌入远程和本地网页
  • 这些网页对于Android和iOS都是相同的
  • 本地页面使用JavaScript从本机移动应用程序获取数据并将数据发送到本地移动应用程序

潜在的解决方案途径

一个。 的PhoneGap

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

什么?你说这很容易,而且我被误导了?启发我哦明智的一个。

B中。 自己动手

我愿意推出自己的解决方案,但是通过Javascript从Webview获取和设置信息到Native Apps的方法似乎完全不同。更多的是获取而不是设置(iOS的伪造URL,非常好的Android的AddJavaScriptInterface)。而且,这条道路似乎可能在未来导致严重的维护问题。

说什么?你的天才程序员朋友已经创建了一个网站,以令人难以忍受的细节描述这个过程?告诉我更多。

℃。 第三方图书馆

完美的第三方图书馆能够完成我想要的一切(以及更多!)吗?救我脱离我的无知。


决策

将来,似乎PhoneGap的'Cleaver'项目将是实现这一目标的最佳方式。

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

2 个答案:

答案 0 :(得分:10)

对于Android,这样做更简单。看看WebView的{​​{3}}方法。您可以使用可以在HTML javascript中直接调用的方法创建自己的对象。

iOS需要一点棘手。针对这些类型问题的最佳解决方案有两个方面:

  • 对于iOS的回调,您需要基本上构建自己的网址方案,例如native://somehost.com/somepath当您的javascript想要通知iOS代码时使用window.location = 'native://somehost.com/somepath';
  • UIWebView委托设置为定义addJavascriptInterface的对象,它看起来像这样

    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的webView:shouldStartLoadWithRequest:navigationType:。这将返回javascript表达式的结果,因此您也可以使用它从页面本身获取一些信息。要调用函数,请使用类似

    的内容
    [webview stringByEvaluationgJavaScriptFromString:@"myJavaScriptFunction();"]
    

您还可以通过创建自定义stringByEvaluatingJavaScriptFromString:并覆盖shouldOverrideUrlLoading方法来处理Android中的组合方案,类似于上面的iOS代码,但返回调用是向后的,您返回{{1}如果您处理了网址,true应该不再执行任何操作,WebView如果您希望false处理加载。请务必使用WebViewClient创建自定义WebView并将其分配给WebViewClient。要在实际WebView上调用javascript函数,请执行WebView

之类的操作

答案 1 :(得分:0)

PhoneGap iOS有一个名为Cleaver的概念,您可以将Web视图嵌入到原生iOS应用程序中。 Randy McMillian有一个很好的例子here。在Android方面,正在努力实现相同的功能。所以我们还没有,但我们会到达那里。