Android 深度链接在 ADB 中有效,但在浏览器中无效
Android deep linking works in ADB, but not browser
我正在尝试向我的应用添加深层链接。我为我的一项活动添加了 2 个意图过滤器,一个用于 "http" 方案,另一个用于我的自定义方案(我正在使用 "example")。基于此 SO (Deep-linking intent does not work) 中的信息,我为每个方案添加了一个意图过滤器,这样我就可以同时处理 example://test
和 http://www.example.com/test
类型的链接。
这是我的 XML:
<activity
android:name="com.myapp.myapp.SplashActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:label="Intent Filter label">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- Accepts URIs that begin with "http://www.example.com/test2” -->
<data android:scheme="http"
android:host="www.example.com"
android:pathPrefix="/test2" />
</intent-filter>
<intent-filter android:label="Intent Filter label">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- Accepts URIs that begin with "example://test2” -->
<data android:scheme="example"
android:host="test2" />
</intent-filter>
</activity>
当我在 ADB 中测试时,它们正在正确加载:
adb shell am start -W -a android.intent.action.MAIN -d "example://test2" com.myapp.myapp
returns
Starting: Intent { act=android.intent.action.MAIN dat=example://test2 pkg=com.myapp.myapp }
Status: ok
Activity: com.myapp.myapp/com.app.myapp.SplashActivity
ThisTime: 357
TotalTime: 357
Complete
但是,我在浏览器中一无所获。当我在浏览器中尝试这个时:
“example://test2
”在 FF 中我得到“couldn't find an app to open this link
”,在 Chrome 和本机浏览器中,它打开新的 Google 搜索“example://test2
”。
当我尝试其他样式时:“http://www.example.com/test2
”它只是尝试在所有 3 个浏览器中导航到该网页。
我正在从 Android Studio 将应用程序部署到我的 phone。我还尝试生成调试 APK,将其发送到我的 phone,然后安装。两者的结果相同。
我哪里做错了? 据我所知,我已按照指南 (https://developer.android.com/training/app-indexing/deep-linking.html) 进行操作。 我的应用程序是否需要在商店中才能使用深层链接?
呃,我的操作是 MAIN,而它应该是 VIEW...
<intent-filter>
<action android:name="android.intent.action.MAIN" />
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
您的实施似乎是正确的,而且,如果您在您的设备中测试您的应用,则它不需要在 Playstore 上可用。
您尝试过通过二维码进行测试吗?如 Google 文档中所示 - https://developers.google.com/app-indexing/android/test
希望对您有所帮助。
方案(可能还有主机)必须全部小写。
我从 uni_link 包中复制了深度 link 意图过滤器:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST -->
<data
<!-- THIS HAS TO BE IN ALL LOWER CASE -->
android:scheme="[YOUR_SCHEME]"
<!-- android:scheme="[your_scheme]" -->
android:host="[YOUR_HOST]" />
</intent-filter>
并粘贴在我的包名 com.myPackage.app
作为方案。对于主机,我输入 localhost
。
将方案更改为全部小写 com.mypackage.app
允许深度 link 工作。
您可以使用 this site 测试深度 link 而无需使用 adb。
PS:这不适用于 iOS,其中 CFBundleURLName
和 CFBundleURLSchemes
可以包含大写字母。
我正在尝试向我的应用添加深层链接。我为我的一项活动添加了 2 个意图过滤器,一个用于 "http" 方案,另一个用于我的自定义方案(我正在使用 "example")。基于此 SO (Deep-linking intent does not work) 中的信息,我为每个方案添加了一个意图过滤器,这样我就可以同时处理 example://test
和 http://www.example.com/test
类型的链接。
这是我的 XML:
<activity
android:name="com.myapp.myapp.SplashActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter android:label="Intent Filter label">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- Accepts URIs that begin with "http://www.example.com/test2” -->
<data android:scheme="http"
android:host="www.example.com"
android:pathPrefix="/test2" />
</intent-filter>
<intent-filter android:label="Intent Filter label">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.LAUNCHER" />
<!-- Accepts URIs that begin with "example://test2” -->
<data android:scheme="example"
android:host="test2" />
</intent-filter>
</activity>
当我在 ADB 中测试时,它们正在正确加载:
adb shell am start -W -a android.intent.action.MAIN -d "example://test2" com.myapp.myapp
returns
Starting: Intent { act=android.intent.action.MAIN dat=example://test2 pkg=com.myapp.myapp } Status: ok Activity: com.myapp.myapp/com.app.myapp.SplashActivity ThisTime: 357 TotalTime: 357 Complete
但是,我在浏览器中一无所获。当我在浏览器中尝试这个时:
“example://test2
”在 FF 中我得到“couldn't find an app to open this link
”,在 Chrome 和本机浏览器中,它打开新的 Google 搜索“example://test2
”。
当我尝试其他样式时:“http://www.example.com/test2
”它只是尝试在所有 3 个浏览器中导航到该网页。
我正在从 Android Studio 将应用程序部署到我的 phone。我还尝试生成调试 APK,将其发送到我的 phone,然后安装。两者的结果相同。 我哪里做错了? 据我所知,我已按照指南 (https://developer.android.com/training/app-indexing/deep-linking.html) 进行操作。 我的应用程序是否需要在商店中才能使用深层链接?
呃,我的操作是 MAIN,而它应该是 VIEW...
<intent-filter>
<action android:name="android.intent.action.MAIN" />
...
<intent-filter>
<action android:name="android.intent.action.VIEW" />
您的实施似乎是正确的,而且,如果您在您的设备中测试您的应用,则它不需要在 Playstore 上可用。
您尝试过通过二维码进行测试吗?如 Google 文档中所示 - https://developers.google.com/app-indexing/android/test
希望对您有所帮助。
方案(可能还有主机)必须全部小写。
我从 uni_link 包中复制了深度 link 意图过滤器:
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST -->
<data
<!-- THIS HAS TO BE IN ALL LOWER CASE -->
android:scheme="[YOUR_SCHEME]"
<!-- android:scheme="[your_scheme]" -->
android:host="[YOUR_HOST]" />
</intent-filter>
并粘贴在我的包名 com.myPackage.app
作为方案。对于主机,我输入 localhost
。
将方案更改为全部小写 com.mypackage.app
允许深度 link 工作。
您可以使用 this site 测试深度 link 而无需使用 adb。
PS:这不适用于 iOS,其中 CFBundleURLName
和 CFBundleURLSchemes
可以包含大写字母。