【问题标题】:How to access and pass parameters to the modules of an Android Instant App如何访问和传递参数到 Android Instant App 的模块
【发布时间】:2018-04-28 17:05:21
【问题描述】:

对于正常安装的应用程序,可以使用深度链接技术,不仅可以从 URL 打开特定应用程序,还可以将其重定向到特定部分/功能,例如特定Facebook 帖子或地图上的特定坐标。

由于我已经阅读了即时应用程序,这是不可能的,因为链接已经指向要下载和运行的特定模块,那么如何不仅可以访问所述模块而且还可以传递一些参数?

例如:

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

如果我希望它指向一组特定的坐标,链接将如何组成? 会是这样:“www.myinstantappexample.com/onlyviewmap/?x=0.000&y=0.000”?

据我所知,谷歌并没有涵盖这方面,我真的无法理解它。

【问题讨论】:

    标签: android deep-linking android-instant-apps


    【解决方案1】:

    如果我希望它指向一组特定的坐标,链接将如何组成?

    如何在 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()按名称调用参数
    • 如果您要通过 adb 使用多个参数测试您的深度链接,请参阅此 - stackoverflow.com/questions/35645414/…
    【解决方案2】:

    免安装应用和深度链接

    Instant Apps rely on App Links 可以工作,而应用链接只是深层链接的一种。对于即时应用程序,深度链接仍然是可能的,实际上对于它们的功能绝对关键。但是,支持 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 团队)为您的链接提供动力。我们有full support for Instant Apps,这使您可以使用更友好的数据格式。我们让您创建这样的链接,以控制行为的每个部分:

    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'
        }
    }
    

    【讨论】:

    • 如果用户从未在 Google Play 商店应用上启用即时体验,而您仍需要通过 URL https://play.google.com/store/apps/details?id=<package_name>&launch=true 传递一些数据,情况会怎样?您将如何通过 google play 链接获取数据?
    • @AlexBauer 我尝试了您的“Branch Monster Factoy”演示,但只有在安装了应用程序后,怪物的链接才有效。有什么方法可以使用该链接使用应用程序的即时版本(无需安装应用程序)打开带有共享怪物的应用程序?
    【解决方案3】:

    为此,您必须使用“应用链接助手” 工具->应用链接助手

    然后检查您的链接,并在路径选择器中检查是否选择了“pathPrefix”选项。

    然后在您的活动的 OnCreate 方法底部(与您最近编辑的链接相关)添加以下代码:

    Intent appLinkIntent = getIntent();
    String appLinkAction = appLinkIntent.getAction();
    Uri appLinkData = appLinkIntent.getData();
    // then use appLinkData.getQueryParameter("YourParameter")
    

    您可以使用“editConfigurations”选项对此进行测试和调试,只需打开该窗口并编辑您的 InstantApp 模块(使用您最近编辑的链接启动的模块)并在 URL 字段中添加您需要的 URL 参数。 (然后只需运行该模块:D)

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多