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

Dan*_*son 5 android uiwebview webview ios cordova

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

Longwinded描述

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

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

短期和甜蜜要求摘要

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

潜在的解决方案途径

A. PhoneGap

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

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

B. 自己动手

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

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

C. 第三方图书馆

完美的第三方库可以满足我的需求(甚至更多!)吗?救我脱离我的无知.


决策

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

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

Rus*_*uss 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
    
    Run Code Online (Sandbox Code Playgroud)
  • 要让您的iOS代码在您的JavaScript中发送信息或调用函数,您可以使用WebView stringByEvaluatingJavaScriptFromString:.这将返回javascript表达式的结果,因此您也可以使用它从页面本身获取一些信息.要调用函数,请使用类似的东西

    [webview stringByEvaluationgJavaScriptFromString:@"myJavaScriptFunction();"]
    
    Run Code Online (Sandbox Code Playgroud)

你也可以通过创建一个自定义WebViewClient和覆盖shouldOverrideUrlLoading方法来处理Android中的组合方案,类似于上面的iOS代码,除了返回调用是向后的,true如果你处理了URL就返回,并且你WebView应该什么也不做,false如果你想要的话WebView处理装载.确保创建和自定义分配WebViewClientWebView使用setWebViewClient.要在实际上调用javascript函数WebView做类似的事情webview.loadUrl("javascript:myJavaScriptFunction();");