如何访问并传递参数给Android即时应用程序的模块

23

使用普通安装的应用程序可以利用Deep Linking技术,不仅可以从URL打开特定的应用程序,还可以将其重定向到特定的部分 /功能,例如特定的Facebook帖子或地图上的特定坐标。

由于我已经阅读到使用即时应用程序将无法使用此技术,因为链接已经指向特定的模块以下载和运行,那么如何访问所说的模块并传递一些参数呢?

例如:

这是从中下载我的地图应用程序的只查看模块的链接:“www.myinstantappexample.com/onlyviewmap

如果我想要将它指向特定的坐标集,链接该如何组成? 是像这样:"www.myinstantappexample.com/onlyviewmap/?x=0.000&y=0.000"吗?

从我所能找到的谷歌资料来看,它并没有涵盖这方面的内容,我真的无法理解。

3个回答

26

如果我想让链接指向特定的坐标,该如何构建链接?

你可以选择如何在URL中包含任何其他信息,可以通过URL参数或路径本身来实现。例如:

https://www.myinstantappexample.com/location/2/user/5 https://www.myinstantappexample.com/onlyviewmap/?x=1.2&y=3.4

然后在接收方的Activity中解析URL。 Uri类包括许多辅助方法,如getQueryParameter()getPathSegments(),以使此过程更加容易。

例如,要解析此URL:

https://www.myinstantappexample.com/onlyviewmap/?x=1.2&y=3.4

您可以在Activity中执行以下操作:

Uri uri = getIntent().getData();
String x;
String y;
if (uri != null) {
  x = uri.getQueryParameter("x"); // x = "1.2"
  y = uri.getQueryParameter("y"); // y = "3.4"
}
if (x != null && y != null) {
  // do something interesting with x and y
}

难以做出选择...第一种语法更漂亮,但无法使用 getPathSegments() 按名称调用参数。 - Dan Chaltiel
2
如果您要通过adb测试具有多个参数的深度链接,请参考此链接 - https://dev59.com/iFsV5IYBdhLWcg3w6iV8 - Vadim Kotov

9

即时应用和深度链接

即时应用依赖于应用链接才能正常工作,而应用链接只是深度链接的一种类型。因此,对于即时应用来说,深度链接仍然可行,并且实际上对其功能至关重要。然而,不支持URI方案深度链接(这在Android应用程序中仍然非常普遍)。

常规应用程序和即时应用程序之间的区别在于,设备将仅在用户单击应用链接时加载单个Activity,而不需要通过Play商店下载完整软件包。这对用户来说是更无缝的体验,但底层技术的工作方式相同。

传递自定义参数

如果用户单击启用应用链接的URL,例如http://www.myinstantappexample.com/onlyviewmap/?x=0.000&y=0.000,打开应用后你将得到整个字符串。你需要自己解析xy变量,但它们将对你可用。类似这样:

Uri data = this.getIntent().getData();
if (data != null && data.isHierarchical()) {
    String uri = this.getIntent().getDataString();
    Log.i("MyApp", "Deep link clicked " + uri);
}

您只需要操作uri值即可找到所需内容。

自定义参数的替代方法

或者,您可以使用Branch.io(完全透明:我是Branch团队的一员)来提供链接支持。我们完全支持即时应用程序,这使您可以使用更加友好的数据格式进行工作。我们允许您创建此类链接,以控制行为的每个部分:

branch.link({
    tags: [ 'tag1', 'tag2' ],
    channel: 'facebook',
    feature: 'dashboard',
    stage: 'new user',
    data: {
        x: '0.000',
        y: '0.000',
        '$desktop_url': 'http://myappwebsite.com',
        '$ios_url': 'http://myappwebsite.com/ios',
        '$ipad_url': 'http://myappwebsite.com/ipad',
        '$android_url': 'http://myappwebsite.com/android',
        '$og_app_id': '12345',
        '$og_title': 'My App',
        '$og_description': 'My app\'s description.',
        '$og_image_url': 'http://myappwebsite.com/image.png'
    }
}, function(err, link) {
    console.log(err, link);
});

作为回报,您会获得一个类似于http://myappname.app.link/iDdkwZR5hx的URL,然后在链接被点击后,在应用程序内部您会看到如下内容:
{
    tags: [ 'tag1', 'tag2' ],
    channel: 'facebook',
    feature: 'dashboard',
    stage: 'new user',
    data: {
        x: '0.000',
        y: '0.000'
    }
}

1
如果用户从未在Google Play Store应用上启用即时体验,而您仍需要通过URL“https://play.google.com/store/apps/details?id=<package_name>&launch=true”传递一些数据,该怎么办?您将如何使用Google Play链接获取数据? - Jonas Simonaitis
@AlexBauer 我尝试了你的“分支怪物工厂”演示,但是只有在安装了应用程序时,链接到怪物才能正常工作。是否有任何方法可以使用该链接打开共享怪物的即时应用程序版本(无需安装应用程序)? - Michel Gokan Khan

5
为了实现这个目标,你需要在工具->应用程序链接助手中使用"应用程序链接助手"。
然后检查你的链接,在路径选择器中,检查是否选中了"pathPrefix"选项。
然后在你的活动的OnCreate方法底部(与最近编辑的链接相关),添加以下代码:
Intent appLinkIntent = getIntent();
String appLinkAction = appLinkIntent.getAction();
Uri appLinkData = appLinkIntent.getData();
// then use appLinkData.getQueryParameter("YourParameter")

您可以使用“editConfigurations”选项来测试和调试,只需打开该窗口并编辑您的instantApp模块(即使用您最近编辑的链接启动的模块),在URL字段中添加所需的URL参数(然后只需运行该模块:D)。
希望这对您有所帮助。

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