我们正在尝试实施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>
答案 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的末尾你可以找到(作为注释)
由于我无法访问您的代码,而我无法查看是否存在任何问题,因此我认为这是帮助您并接受我的答案的最佳方式:)
答案 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
无法正确渲染屏幕。我有几个空屏幕,正确的深层链接。在这种情况下,尝试再次执行相同的深层链接。它对我有用。