在Deep Link中使用Ampersand进行应用索引无法正常工作

时间:2015-07-20 09:01:20

标签: android deep-linking

我们正在尝试实施Google's App Indexing功能。我们使用以下格式的rel-alternate标记添加了指向我们网站的深层链接:

android-app://id.of.the.app/scheme/?screen=Product&product=123456

现在我们收到内容不匹配抓取错误。如果我使用QR代码从here进行测试,一切正常。但是如果我打开一个抓取错误,请点击"打开应用页面"并使用adb命令进行测试我可以看到从&符号开始的所有内容都没有传递给应用程序,因此我的产品数据无法加载。我怀疑抓取工具如何检查应用内容以及导致内容不匹配错误的原因。

此外,如果我使用" Fetch as Google"从搜索控制台看起来,&符号中的所有内容都会被截断。

我在eBay上查看了它正在使用他们的应用程序以及他们正在使用的链接:

android-app://com.ebay.mobile/ebay/link/?nav=item.view&id=221559043026&referrer=http%3A%2F%2Frover.ebay.com%2Froverns%2F1%2F711-13271-9788-0%3Fmpcl%3Dhttp%253A%252F%252Fwww.ebay.com%252Fitm%252FRoxy-Fairness-Backpack-Womens-Red-RPM6-%252F221559043026%253Fpt%253DLH_DefaultDomain_0

他们已使用&对&符编码,但如果我这样做并使用" Fetch as Google"进行测试功能它也不起作用。

这些用户似乎有同样的问题,但他们没有共享解决方案(如果他们找到了解决方案):

https://productforums.google.com/forum/#!msg/webmasters/5r7KdetlECY/enYknTVkYU4J https://productforums.google.com/forum/#!topic/webmasters/lswyXKlS-Ik

我感谢任何想法。

更新1

这就是我如何解释Android应用内的深层链接:

Uri data = getIntent().getData();
String scheme = data.getScheme();
if (scheme.equals("scheme")) {
    String screen = data.getQueryParameter("screen");
    if (screen.equals("Product")) {
        String product = data.getQueryParameter("product");
        // Open Product and give it product number as intent data
    }
}

更新2

这是我们Manifest.xml的相关部分:

<activity
    android:name="id.of.the.app.StartActivity"
    android:configChanges="orientation|screenSize"
    android:label="@string/app_title"
    android:windowSoftInputMode="adjustPan|stateHidden">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

        <intent-filter>
            <data android:scheme="scheme" />
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />                
            <category android:name="android.intent.category.BROWSABLE" />
        </intent-filter>

</activity>

3 个答案:

答案 0 :(得分:0)

尝试用%26

替换&符号

问题是平台工具版本21中的错误

答案 1 :(得分:0)

更新3
我仍然试图了解是否可以避免更改清单并重新提交应用。使用已发布的AndroidManifest,您是否尝试仅更改rel-alternate标记以包含主机(如果它不包含在清单中,则为事件)?例如,您是否尝试使用android-app://id.of.the.app/scheme/fakehost/?screen=Product&product=123456其中fakehost是一个字符串?我想标签的语法必须是android-app://{package_name}/{scheme}/{host_path},所以在网站上有一个主机(但可能不在应用程序上)是必要的。

更新2
在您发布清单后,我猜你错过了强制性的主机&#39;在你的Intent-Filter的数据标签中。

以此为参考:

<intent-filter>
    <action android:name="android.intent.action.VIEW"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
    <data android:scheme="myapp" android:host="link"/>
    <data android:scheme="myapp" android:host="link/"/>
</intent-filter>

和html中的meta应该是(android-app:// package-name / scheme / host)

<html>
<head>   
<link rel="alternate"
      href="android-app://it.test.testdeeplink/myapp/link/?p1=1&p2=2" />
...
</head>

您可能需要更新自己的应用,因为必须修复您的清单。

首先,感谢所有澄清。我想对于深层链接(您正在实施的功能)和Chrome Intent(您提供的评论链接)存在一些疑惑。所以,我决定实施一个小项目,你可以通过我的dropbox folder下载。该项目非常简单,只有一个活动可以为Intent数据接收的每个参数打印一行(当然,如果您通过应用程序启动器启动应用程序,您将无法看到任何内容)。 Activity支持两个intent-filter模式(my-android-app和http),在MainActivity.java的末尾你可以找到(作为注释)

  1. 用于测试与adb和第一个架构的深层链接的行
  2. 用于测试与adb和第二个架构的深层链接的行
  3. 使用浏览器测试深层链接的简单html页面 - 最后两个href是由Chrome正确管理的Intent。
  4. 由于我无法访问您的代码,而我无法查看是否存在任何问题,因此我认为这是帮助您并接受我的答案的最佳方式:)

答案 2 :(得分:0)

使用Uri中的查询参数进行索引编制对我来说很好。请检查您是否正确执行了所有步骤:

  • id.of.the.app.StartActivity

    中声明AndroidManifest.xml的方案

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <data android:scheme="my_custom_scheme"/>
            </intent-filter>
    

  • 解析深层链接

我们假设我们有以下深层链接my_custom_scheme://test_authority/product_screen/?product=123456&test_param=0000&utm_source=google&utm_medium=organic&utm_campaign=appindexing

    public void parseDeeplikUrl(Uri uri) {
        if (uri == null) {
           // fallback: open home screen
        }
        String autority = uri.getAuthority();
        String path = uri.getPath();
        String query = uri.getQuery();

        // authority = "test_authority"
        // path = "products_screen"
        // query = "product=123456&test_param=0000&utm_source=google&utm_medium=organic&utm_campaign=appindexing"
    }
  • 从命令行测试应用程序索引:

    adb shell 'am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "my_custom_scheme://test_authority/product_screen/?product=123456&test_param=0000&utm_source=google&utm_medium=organic&utm_campaign=appindexing" -e android.intent.extra.REFERRER_NAME android-app://com.google.appcrawler/https/www.google.com id.of.the.app'
    

使用此adb命令,我们模拟GoogleBot来电。

  • 转到"Fetch as Google"中的Search console,检查GoogleBot是否也正常工作,并显示正确的应用程序屏幕。

    android-app://id.of.the.app/my_custom_scheme/test_authority/product_screen/?product=123456&test_param=0000&utm_source=google&utm_medium=organic&utm_campaign=appindexing
    

P.S。:有时GoogleBot无法正确渲染屏幕。我有几个空屏幕,正确的深层链接。在这种情况下,尝试再次执行相同的深层链接。它对我有用。