android - 与现有 iOS 和 Android 应用程序中的嵌入式 (UI)Webviews 通信

标签 android ios cordova uiwebview webview

此应用程序已存在于 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,这更容易做到。看一下 WebViewaddJavascriptInterface方法。您可以使用可在 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/

相关文章:

android - GoogleSignIn.getLastSignedInAccount() 在发布版本上返回 null

android - 创建删除线文本?

java - Android 汉堡/箭头图标动态改变颜色

iphone - 登录FB后如何发帖到墙

android - 使用 ionic 和 cordova 生成面向 API 级别 30 (Android 11) 的 Android bundle

javascript - PhoneGap - Android - 如何将相机拍摄的图像保存在 SD 卡中

iOS 7 自定义 TableView 在 TabBar 下

iOS - API 同步

ios - Phonegap 3.4.0 和相机插件 (iOS) : CDVPlugin class CDVCamera (pluginName: camera) does not exist 的问题

ios - Cordova iOS 顶部的白色条