Worklight中如何实现原生应用和混合应用的交互?
Posted
技术标签:
【中文标题】Worklight中如何实现原生应用和混合应用的交互?【英文标题】:How to achieve interaction between Native and Hybrid Applications in Worklight? 【发布时间】:2014-09-06 08:13:51 【问题描述】:我将首先解释我尝试实现的用例。我有两个不同的应用程序:
-
原生安卓应用,以及
基于 Worklight 的混合应用程序
用例从打开原生 android 应用程序开始。在特定事件中,我使用一些参数打开 Hybrid 应用程序。
在混合应用程序中,我在本机端获取传递的参数,现在我想在应用程序的 web 视图中使用该数据(javascript、html)。我怎样才能做到这一点?
例如: 我打开了第一个安卓应用程序。其中有一个文本框和一个按钮。我在文本框中输入了我的手机号码并点击了按钮。在按钮上单击我有启动另一个混合应用程序并传递手机号码的代码。
我能够在代码的本机端提取该手机号码参数。如何将它传递给它的 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 混合应用程序