Worklight中如何实现原生应用和混合应用的交互?

Posted

技术标签:

【中文标题】Worklight中如何实现原生应用和混合应用的交互?【英文标题】:How to achieve interaction between Native and Hybrid Applications in Worklight? 【发布时间】:2014-09-06 08:13:51 【问题描述】:

我将首先解释我尝试实现的用例。我有两个不同的应用程序:

    原生安卓应用,以及 基于 Worklight 的混合应用程序

用例从打开原生 android 应用程序开始。在特定事件中,我使用一些参数打开 Hybrid 应用程序。

在混合应用程序中,我在本机端获取传递的参数,现在我想在应用程序的 web 视图中使用该数据(javascripthtml)。我怎样才能做到这一点?

例如: 我打开了第一个安卓应用程序。其中有一个文本框和一个按钮。我在文本框中输入了我的手机号码并点击了按钮。在按钮上单击我有启动另一个混合应用程序并传递手机号码的代码。

我能够在代码的本机端提取该手机号码参数。如何将它传递给它的 Web (JavaScript) 部分?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

如果您使用的是 Worklight 6.2,您可以通过 2 种方式实现此目的。

    使用Simple Data Sharing API 使用此 API,我认为您甚至不需要尝试从本机视图获取数据并将其移回 Hybrid 应用程序中的 webview,它只会在 webview 中可用。

    在此答案中解释概念和执行将使其太长;我建议先查看文档,看看它是否符合您的需求。

    但我建议:

    使用Action Sender API 使用此 API,您可以轻松地将数据从 Web 移动到本机或从本机移动到 Web。

    在你的情况下,你说你在打开Hybrid应用程序后已经有了原生代码中的数据,你只需要将它移动到webview,那么需要的是:

    Add a sender 在本机代码中 JavaScript 代码中的Add a receiver

很遗憾,目前没有training module 可用于专门演示此功能,但会有。

这是您需要做的基本前提:

在 JavaScript 中实现接收器:

function wlCommonInit()
    WL.App.addActionReceiver ("doSomething", actionReceiver);  


function actionReceiver(received)
    // Do something with the received data.
    alert (received.data.someProperty);

在 Hybrid 应用程序的主 Java 类(或其他地方,取决于您的应用程序)中,您在 onInitWebFrameworkComplete 中的 else 右括号之后实现以下内容:

public void onInitWebFrameworkComplete(WLInitWebFrameworkResult result)
    ...
    ...     
    else 
        handleWebFrameworkInitFailure(result);
    

    JSONObject data = new JSONObject();
    try 
        data.put("someProperty", 12345);
     catch (JSONException e) 
        // handle it...
    
    WL.getInstance().sendActionToJS("doSomething", data);

最终结果是,一旦您打开应用程序,就会收到一条显示“12345”的警告。

【讨论】:

我们使用的是worklight 6.1,我可以应用你建议的这两种方式吗? 下次在提问时提及您的 Worklight 版本。不,您不能在 6.1 中使用这些,因为它们是 6.2 中的新功能;您可以改为查看 WL.NativePage.show API。搜索 IBM Worklight 6.1 知识中心:www-01.ibm.com/support/knowledgecenter/SSZH4A_6.1.0/…——另外,升级到 6.2 很抱歉之前没有提到工作灯版本。据我所知 WL.NativePage.show 用于调用本机库。它将如何帮助我实现从原生代码到混合代码的数据共享? 您不会使用此 API 调用“库”。您需要阅读有关它的文档(上面的链接)以及查看培训模块(搜索“添加本机功能”)。使用此 API,您还可以传递数据。如果您想解决您的问题,您可能需要相应地调整您的应用程序:www-01.ibm.com/support/knowledgecenter/SSZH4A_6.1.0/… 非常感谢您的帮助。【参考方案2】:

我将使用代码 sn-ps 描述解决方案。

首先从本机应用程序打开混合应用程序。

Intent intent = getPackageManager().getLaunchIntentForPackage(“URI Of Target Application”);
intent.putExtra("someData", someData);
startActivity(intent);

现在将启动基于 Worklight 的混合应用程序,我们将从本机部分提取传递的数据并将其存储在共享首选项中:

Bundle dataBundle = getIntent().getExtras();
String someData = dataBundle.getString("someData");
sharedpreferences = getSharedPreferences(MyPREFERENCES, MODE_PRIVATE);
sharedpreferences.edit().putString("someData", someData);
sharedpreferences.commit();

现在制作一个插件,您可以在 Web 部件准备好使用后调用它。

SharedPreferences sharedpreferences = cordova.getActivity().getSharedPreferences(MyPREFERENCES,cordova.getActivity().MODE_PRIVATE);
if(sharedpreferences!=null) 
     String param = sharedpreferences.getString("someData", "-1");
     sharedpreferences.edit().remove("someData").commit();
     callbackContext.success(param); 

在基于 Worklight 的混合应用程序的 Web 端调用该插件。

function onSuccessSharedData (param) 
     Param is the passed parameter
 
Cordova.exec(onSuccessSharedData, onFailure, "pluginName", "action", []);

【讨论】:

以上是关于Worklight中如何实现原生应用和混合应用的交互?的主要内容,如果未能解决你的问题,请参考以下文章

IBM Worklight 6.1 - 如何提供可访问性支持

Worklight 6.1:如何将 EULA 添加到混合应用程序

Worklight 6.0 - 如何使用 dojo 1.9 和 worklight 6.0 为 android 2.2 创建和部署 dojo 启用 worklight 混合应用程序

Worklight 6.2 混合应用程序中的空闲期

IBM Worklight - 本机组件的全球化/本地化

如何在 ibm worklight 混合移动应用程序中处理客户端会话超时