如何将数据从TWA网络应用发送到应用?

时间:2018-08-27 15:13:50

标签: android android-intent deep-linking chrome-custom-tabs trusted-web-activity

有了Crosswalk,我有了一个非常方便的javascript到应用程序界面,因此我可以从javascript调用Java函数并将数据从我的Web应用程序共享到我的android应用程序

如何使用“自定义”标签(或“受信任的网络活动”)实现此目标?

似乎根本没有办法。应该有,尤其是当我的应用程序和游戏/网络应用程序来自同一作者时。

例如,我不信任LocalStorage,尤其是现在带有“自定义选项卡”的LocalStorage,它可能会被清除,或者用户可能会卸载浏览器并安装另一个浏览器,因此保存的数据将丢失并且用户将对本地存储感到生气。应用程序丢失已保存的数据,甚至不了解数据在浏览器中,而不是在应用程序中。所以我以前让我的Web应用程序调用该应用程序以保存数据。

另一个示例,当“自定义标签”使用Firefox而不是Chrome时,语音合成将不可用。我可以在我的webapp中轻松检测到它。但我希望我的Web应用程序调用该应用程序并将其发音发送给它。这就是我对Crosswalk所做的事情,因为它也不支持语音。

我了解网络视图比自定义标签更适合我使用,但是当无法在设备(尤其是Android <5)上使用网络视图时,我的应用除了打开而是使用“自定义”标签(或“可信网络活动”,如果可用)。我再也不能使用Crosswalk了,它已经停产并且仍然充满严重的错误。其他解决方案(如GeckoView或阿里巴巴Gcanvas)尚未准备就绪。

编辑:

在这篇有关受信任的网络活动https://developers.google.com/web/updates/2017/10/using-twa的文章中,我阅读了

  

尽管如此,您仍可以通过传递数据来与Web内容进行协调   到并从到该页面的网址(例如通过查询参数,自定义   HTTP标头和意图URI。)

编辑:

我已经阅读了许多页面,尽管Intent和深层链接对我来说仍然很模糊,但这是我尝试过的。

我为自定义操作添加了一个意图过滤器:

<receiver android:name=".OutgoingReceiver" android:enabled="true">
    <intent-filter>
        <action android:name="custom_tabs_js_interface" />
    </intent-filter>
</receiver>

我为该接收者创建了一个类:

public class OutgoingReceiver extends BroadcastReceiver {

    public static final String CUSTOM_INTENT = "custom_tabs_js_interface";

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "received" , Toast.LENGTH_SHORT).show();
    }

我用

用javascript来称呼它
location.href="intent:#Intent;action=custom_tabs_js_interface;end";

我现在甚至都不传递数据,我只是尝试调用它。 但什么也没发生...

3 个答案:

答案 0 :(得分:5)

是的,由于某些原因(可能是安全性),广播接收器无法正常工作。但是您可以使用Activity代替Broadcast Receiver,如下所示。

将自定义Android Intent Uri与自定义 host 查询参数 package scheme 和意向动作。从您的javascript / html代码中调用此意图uri。例子

"intent://myhost?key=value#Intent;scheme=myscheme;package=my.app.package;action=someaction;end"

还使用activitymanifest文件中声明一个intent filter,以处理特定的 host scheme 动作。例子

<activity android:name="my.app.package.ReceiverActivity">
    <intent-filter>
        <action android:name="someaction" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="myhost"
            android:scheme="myscheme" />
    </intent-filter>

</activity>

现在在活动中,处理意图并从查询参数中提取数据。对数据做任何您想做的事情,并可能完成活动,以防您想返回同一屏幕。例子

public class ReceiverActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String value = getIntent().getData().getQueryParameter("key");
        if (value != null) {
            // value is basically your data
        }

        // in case you want to go back to same screen
        finish();
    }
}

就是这样。您有可供Android Activity使用的数据。此ReceiverActivity可以(最好)属于同一TWA应用。现在,通过此接收器活动,您可以轻松地将数据发送/共享到其他任何应用。希望这会有所帮助。

答案 1 :(得分:0)

您可以使用混合解决方案:

  1. 根据需要使用自定义标签进行游戏。

  2. 您的服务器可以在需要时使用套接字编程或推送通知来调用您的应用,以获取需要保存在应用中的数据。

如果向应用程序发送数据失败,您的游戏也会在游戏中向浏览器发出警告。

答案 2 :(得分:0)

在尽可能合理的情况下,鼓励支持较早的android版本。在撰写本文时,平台版本分发(https://developer.android.com/about/dashboards/)指出,如果放弃对版本4的支持,您将损失大约12.7%的设备。

请考虑将最低版本提高到棒棒糖,其中 Entrez votre nom et prénom : jean jean bla bla bla bla bla bla bla bla bla La chaîne contient : 9 caractères 9 Your full name is : jean jean Votre prénom est : Votre nom est : ean jean 已移至APK并使用。您将可以节省时间和实现的简便性,因为您将能够调用WebView带注释的方法,同时使用户参与到您的应用程序中(https://developer.android.com/guide/webapps/webview_