HTTP 302 重定向到深层 link 在 Android 中不起作用
Http 302 redirect to deep link does not work in Android
我们在 iOS 和 Android 中有一个应用程序。它们都实现了相同的深度 link
(例如 myapp://home/?abc=xxx&bcd=yyy)
我们已经在iOS和Android中进行了测试,深度link可以正常运行,可以打开我们的应用程序。
然后我们创建一个 API 服务。 (例如 https://myapp.com/testing/1234568)
当用户点击这个link时,会判断用户是否为使用HTTPheaderUser-Agent.
的手机客户端
如果客户端是移动的,它将 return HTTP 302,位置 header 等于我们的深度 link。
请求和响应是这样的:
GET /testing/1234568 HTTP/1.1
Host: myapp.com
Accept: */*
User-Agent: Mozilla/5.0 (Linux; Android 7.0; SM-G930V Build/NRD90M)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36
HTTP/1.1 302
Location: myapp://home/?abc=xxx&bcd=yyy
Content-Length: 0
此服务在 iOS 中可以完美运行,用户在单击 link 后被重定向到我们的应用程序。
但是,对于Android,它不起作用。单击 link 后,用户无法重定向到我们的应用程序。它仍然停留在空白页中。
我已经测试过使用 html 和 javascript,如下所示:
<html>
<head>
<script type="text/javascript">
window.onload = function(){
window.location="myapp://home/?abc=xxx&bcd=yyy";
};
</script>
</head>
</html>
Android 用户可以成功重定向回应用程序。
但是,出于某种原因,我无法在 API 服务中 return html。
Android?
中是否有任何方法可以使用 HTTP 302 将用户重定向回移动应用程序
我认为您的问题可能是由特定的浏览器行为引起的。在 Android 上,Chrome 处理 URI 方案的方式与 Android 浏览器不同。我的倾向是您正在使用 Chrome 并且应该使用 Chrome Intents. 本质上,在 Chrome 中您应该使用格式如下的 URI 方案:
intent://<optional path>#Intent;scheme=<URI scheme>;package=<package>;S.browser_fallback_url=<optional encoded fallback URL>;end
URI 方案 [必需]: 这与您在上面使用的 URI 方案相同
应用程序包名称[必填]:这是为项目配置的应用程序包名称。
URI路径[可选]:如果要传入任意路径进行路由
回退 URL [可选]: 这是一个可选字段,您可以在其中指定 URL 编码的网站 URL 以回退到如果未安装该应用程序。如果未指定,默认选项是打开 Play 商店应用程序页面。如果您不使用此变量,只需删除意图字符串的整个“S.browser_fallback_url=”部分。
另一种选择是仅使用 Branch 进行深层链接。它们在更新和更改时已经涵盖了所有这些边缘情况。
我们在 iOS 和 Android 中有一个应用程序。它们都实现了相同的深度 link (例如 myapp://home/?abc=xxx&bcd=yyy)
我们已经在iOS和Android中进行了测试,深度link可以正常运行,可以打开我们的应用程序。
然后我们创建一个 API 服务。 (例如 https://myapp.com/testing/1234568)
当用户点击这个link时,会判断用户是否为使用HTTPheaderUser-Agent.
的手机客户端如果客户端是移动的,它将 return HTTP 302,位置 header 等于我们的深度 link。
请求和响应是这样的:
GET /testing/1234568 HTTP/1.1
Host: myapp.com
Accept: */*
User-Agent: Mozilla/5.0 (Linux; Android 7.0; SM-G930V Build/NRD90M)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36
HTTP/1.1 302
Location: myapp://home/?abc=xxx&bcd=yyy
Content-Length: 0
此服务在 iOS 中可以完美运行,用户在单击 link 后被重定向到我们的应用程序。
但是,对于Android,它不起作用。单击 link 后,用户无法重定向到我们的应用程序。它仍然停留在空白页中。
我已经测试过使用 html 和 javascript,如下所示:
<html>
<head>
<script type="text/javascript">
window.onload = function(){
window.location="myapp://home/?abc=xxx&bcd=yyy";
};
</script>
</head>
</html>
Android 用户可以成功重定向回应用程序。
但是,出于某种原因,我无法在 API 服务中 return html。
Android?
我认为您的问题可能是由特定的浏览器行为引起的。在 Android 上,Chrome 处理 URI 方案的方式与 Android 浏览器不同。我的倾向是您正在使用 Chrome 并且应该使用 Chrome Intents. 本质上,在 Chrome 中您应该使用格式如下的 URI 方案:
intent://<optional path>#Intent;scheme=<URI scheme>;package=<package>;S.browser_fallback_url=<optional encoded fallback URL>;end
URI 方案 [必需]: 这与您在上面使用的 URI 方案相同
应用程序包名称[必填]:这是为项目配置的应用程序包名称。
URI路径[可选]:如果要传入任意路径进行路由
回退 URL [可选]: 这是一个可选字段,您可以在其中指定 URL 编码的网站 URL 以回退到如果未安装该应用程序。如果未指定,默认选项是打开 Play 商店应用程序页面。如果您不使用此变量,只需删除意图字符串的整个“S.browser_fallback_url=”部分。
另一种选择是仅使用 Branch 进行深层链接。它们在更新和更改时已经涵盖了所有这些边缘情况。