如何在Worklight中实现原生和混合应用程序之间的交互?

3
我将开始解释我要实现的用例。我有两个不同的应用程序:
1.原生android应用程序 2.基于Worklight的混合应用程序
用例始于打开原生android应用程序。在特定事件上,我会使用某些参数打开混合应用程序。
在混合应用程序中,我正在从本地端获取传递的参数,并希望在应用程序的Webview(JavaScript、HTML)中使用该数据。我该如何做呢?
例如: 我打开了第一个android应用程序。它有一个文本框和一个按钮。我在文本框中输入了我的手机号码,并点击了按钮。在按钮单击时,我有一段代码,可以启动其他混合应用程序,并将手机号码与其一起传递。
我能够在本地代码的一侧提取那个手机号码参数。如何将其传递到Web(JavaScript)部分呢?
任何帮助都将不胜感激。
2个回答

3
如果您正在使用Worklight 6.2,有两种方法可以实现此目的。
  1. 使用简单数据共享API
    使用此API,您甚至不需要尝试从本地视图获取数据并将其移回到Hybrid应用程序中的webview中,它将直接在webview中可用。

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

    但我建议:

  2. 使用操作发送器API
    使用此API,您可以轻松地将数据从Web移动到Native或从Native移动到Web。

    在您的情况下,您说在打开Hybrid应用程序后,本地代码已经有了数据,您只需要将其移动到webview中,所需的是:

很遗憾,目前没有培训模块可以演示这个特定的功能,但以后会有。

以下是您需要做的基本前提:

  • In the JavaScript you implement a receiver:

    function wlCommonInit(){
        WL.App.addActionReceiver ("doSomething", actionReceiver);  
    }
    
    function actionReceiver(received){
        // Do something with the received data.
        alert (received.data.someProperty);
    }
    
  • In the main Java class of the Hybrid application (or elsewhere, depending on your application) you implement the following in onInitWebFrameworkComplete after the else closing bracket:

    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,所以我可以应用您建议的这两种方式吗? - yogesh
下次在提问时请注明您的Worklight版本。不,您不能在6.1中使用它们,因为它们是6.2中的新功能;您可以查看WL.NativePage.show API。搜索IBM Worklight 6.1知识中心:http://www-01.ibm.com/support/knowledgecenter/SSZH4A_6.1.0/wl_welcome.html -- 另外,请升级到6.2。 - Idan Adar
很抱歉之前没有提到Worklight版本。据我所知,WL.NativePage.show用于调用本地库。它如何帮助我实现从本地代码到混合代码的数据共享? - yogesh
你不需要使用这个API来调用“库”。你需要阅读相关文档(上面的链接)以及查看培训模块(搜索“添加本地功能”)。使用这个API,你也可以传递数据。如果你想解决问题,可能需要相应地调整你的应用程序:http://www-01.ibm.com/support/knowledgecenter/SSZH4A_6.1.0/com.ibm.worklight.getstart.doc/start/c_gettingstarted.html - Idan Adar
我使用了Android的共享首选项并使其正常工作。无论如何,感谢您的帮助。 :) - yogesh
显示剩余2条评论

2
我将使用代码片段来描述解决方案。
首先,从本地应用程序打开混合应用程序。
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", []);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接